›_ ebskola.lv
← 7.5

7.6 Noslēguma projekts: "Koda lauzējs: AI Efektivitāte"

Stundas uzdevums: Izveidot spēli, kur dators ar binārās meklēšanas stratēģiju uzmin spēlētāja skaitli, pierāda algoritma efektivitāti un pamana pretrunīgas atbildes.

SR 2.4.10. Atkļūdošana un testēšana SR 2.4.13. Pamatkonstrukcijas un datu tipi SR 2.4.16. Saliktas datu struktūras SR 2.4.19. Algoritmu efektivitāte

70 min darba sadalījums: 1. uzdevums (~20 min) - atjauno teorijas piemēru vai minimālo prototipu; 2. uzdevums (~25 min) - pielieto to galvenajā uzdevumā; 3. uzdevums (~25 min) - pārbaudi rezultātu, izlabo kļūdas un tikai beigās pieraksti vienu secinājumu. Papildus/4. līmeņa uzdevums ir paredzēts tikai tad, ja pamatdarbs ir pabeigts.

Pirms sāc: izmanto iepriekš apgūto un šīs lapas teorijas/koda piemērus. Ja vajadzīga jauna komanda vai rīks, vispirms atrodi tās paraugu teorijas sadaļā.

Teorija: kā dators uzvar ar mazāk minējumiem

Lineārā meklēšana pārbauda variantus pēc kārtas: 1, 2, 3, 4... Binārā meklēšana katrā solī atmet pusi no vēl iespējamā diapazona. Tāpēc 100 skaitļu spēlē datoram vajag nevis līdz 100 minējumiem, bet ne vairāk kā 7, ja spēlētājs atbild godīgi.

apaksa = 1
augsa = 100
minejums = (apaksa + augsa) // 2

if atbilde == "lielāks":
    apaksa = minejums + 1
elif atbilde == "mazāks":
    augsa = minejums - 1
Sākums: 1..100
1. minējums: 50
Pēc atbildes paliek tikai puse no variantiem.

Pretruna rodas tad, ja robežas kļūst neiespējamas, piemēram, apakšējā robeža ir lielāka par augšējo. Tas nozīmē, ka iepriekšējās atbildes nevar visas būt patiesas.

Praktiskie uzdevumi

1. uzdevums - Iesildies ar gatavu piemēru

Šis ir īss iesildīšanās uzdevums. Nokopē sagatavi, ielīmē to pareizajā koda vietā un palaid. Šeit pietiek droši izmēģināt tēmu 7.6 Noslēguma projekts: "Koda lauzējs: AI Efektivitāte"; detalizētu izpratni veidosi nākamajos uzdevumos.

Kopējamais piemērs vai sagatave: izmanto šo bloku kā starta punktu, nevis kā gala risinājumu.

apaksa = 1
augsa = 100
minejums = (apaksa + augsa) // 2

if atbilde == "lielāks":
    apaksa = minejums + 1
elif atbilde == "mazāks":
    augsa = minejums - 1
  1. Atver darba failu vai rīku. Python fragmentu ievieto main.py failā un palaid no termināļa.
  2. Nokopē visu piemēra bloku no šī uzdevuma un ielīmē to norādītajā vietā.
  3. Palaid kodu tieši tādu, kāds tas ir, un pārliecinies, ka parādās rezultāts, izvade vai vismaz nav kļūdas paziņojuma.
  4. Atrodi vienu drošu vietu, ko drīkst mainīt: tekstu, skaitli, krāsu, mainīgā vērtību vai testa ierakstu.
  5. Maini tikai šo vienu vērtību un palaid kodu vēlreiz.
  6. Salīdzini rezultātu pirms un pēc izmaiņas. Ja parādās kļūda, atcel pēdējo izmaiņu un palaid vēlreiz.
  7. Turpini pie 2. uzdevuma tikai tad, kad šis mazais piemērs darbojas.

2. uzdevums - Ievieto algoritmu projektā

Pievieno šīs stundas paņēmienu kā nelielu, strādājošu projekta daļu.

  1. Izvēlies vienu konkrētu projekta vietu: ievadi, aprēķinu, izvēli, ciklu, datu struktūru, funkciju vai rezultāta izvadi.
  2. Nosauc funkcijas un mainīgos pēc to lomas, piemēram, punkti, gajiens, atbilde, rezultats vai parbauda_ievadi().
  3. Uzraksti funkciju vai koda bloku, kas nolasa sākuma datus, tos apstrādā un atgriež vai izvada rezultātu.
  4. Savieno šo kodu ar jau esošo projekta plūsmu, nevis atstāj to atsevišķā demonstrācijā.
  5. Pievieno vienu īsu komentāru pie sarežģītākās darbības.
  6. Pārbaudi, ka iepriekšējais kods joprojām darbojas pēc jaunā fragmenta pievienošanas.
  7. Salabo pirmo atrasto kļūdu pirms paplašini risinājumu.
  8. Veic Git commit ar īsu ziņu par pievienoto funkcionalitāti.

3. uzdevums - Testē kodu un izdari secinājumu

Pārbaudi, vai algoritms darbojas paredzami vairākās situācijās.

  1. Izveido trīs testa scenārijus: parasta ievade, robežgadījums un kļūdaina vai tukša ievade.
  2. Palaid parasto scenāriju un pārbaudi termināļa izvadi.
  3. Palaid robežgadījumu ar mazāko, lielāko vai tukšāko vērtību, ko šis kods var saņemt.
  4. Palaid kļūdaino scenāriju un pārbaudi, vai programma neavarē.
  5. Izlabo vienu konkrētu problēmu kodā, datos vai ievades pārbaudē.
  6. Pārbaudi labojumu vēlreiz ar visiem trim scenārijiem.
  7. Beigās pieraksti vienu secinājumu: kura koda rinda vai algoritma solis vislabāk palīdzēja saprast tēmu 7.6 Noslēguma projekts: "Koda lauzējs: AI Efektivitāte".

Papildu uzdevums - Pievieno mazu funkciju

Ja pamatdarbs ir pabeigts, paplašini projektu ar vienu nelielu programmētu uzlabojumu.

  1. Izvēlies vienu mazu papildinājumu, kas izmanto to pašu šīs stundas paņēmienu.
  2. Pievieno vienu jaunu mainīgo, funkciju, nosacījumu, ciklu, datu elementu vai rezultāta izvadi.
  3. Savieno papildinājumu ar esošo projekta kodu.
  4. Pārbaudi, ka pamatfunkcija un papildinājums darbojas kopā.
  5. Saglabā izmaiņas ar Git commit tikai pēc veiksmīgas pārbaudes.

Biežākās kļūdas (un kā tās labot)

Nodošanas pierādījumi

Snieguma līmeņa apraksts (SLA)

Kritēriji 4-6 (Turpina apgūt) 7-8 (Apguvis) 9-10 (Padziļināti)
Algoritma loģika Dators min skaitļus haotiski vai neizmanto robežu pārbīdi. Precīzi realizēta Binārā meklēšana (diapazona dalīšana uz pusēm). Algoritms ir optimizēts; realizēta pretrunu (krāpšanās) detektēšana.
Efektivitātes analīze Netiek uzskaitīti gājieni vai nav izpratnes par Big O. Gājieni tiek uzskaitīti; izprot O(log n) efektivitāti. README failā sniegta matemātiska analīze par algoritma robežām.
Koda kvalitāte Kods ir vienā failā; trūkst parametru vai komentāru. Kods sadalīts moduļos. Funkcijas saņem un atgriež datus. Pilnīga modularitāte; profesionāls PEP 8 stils un docstrings.

Koda paraugs: Binārā dzinēja sākums

# Failā engine.py
def aprekinat_minejumu(apaksa, augsa):
    """Aprēķina viduspunktu binārajai meklēšanai."""
    return (apaksa + augsa) // 2

# Failā main.py
from engine import aprekinat_minejumu

min_r, max_r = 1, 100
gajieni = 0

while min_r <= max_r:
    minejums = aprekinat_minejumu(min_r, max_r)
    gajieni += 1
    
    atbilde = input(f"Vai Tavs skaitlis ir {minejums}? (L/M/U): ").lower()
    
    if atbilde == 'u':
        print(f"Uzvara {gajieni} gājienos!")
        break
    # ... tālāk seko robežu pārbīdes loģika 
Sistēmas statuss: Kalibrēts
Teorētiskā sarežģītība: O(log n)
Maksimums 100 skaitļiem: 7 mēģinājumi
⬅ Iepriekšējā stunda Tēmas apkopojums ➡