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.
70 min plāns: Ievads un kritēriju pārruna (~10 min) · 1. uzdevums (~15 min) - uzraksti datora minēšanas robežas · 2. uzdevums (~25 min) - pabeidz binārās meklēšanas AI · 3. uzdevums (~20 min) - saskaiti minējumus un salīdzini ar lineāro. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: šis ir 7. tēmas noslēguma projekts. Šoreiz mini nevis tu, bet dators - tavs uzdevums ir uzrakstīt tā stratēģiju. Noderēs 7.1 stundas binārā meklēšana.
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
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 -
Uzraksti datora minēšanas robežas
Beigās dators nosauks savu pirmo minējumu - tieši diapazona vidu.
- Izveido failu
koda_lauzejs.pysavā krātuvē. - Ieraksti
apaksa = 1unaugsa = 100. - Izrēķini
minejums = (apaksa + augsa) // 2. - Izdrukā minējumu ar f-string.
- Palaid un pārbaudi, vai pirmais minējums ir 50.
- Nomaini
augsauz 1000 un pārbaudi jauno pirmo minējumu.
Gatavs, kad: ar diapazonu 1-100 dators sāk ar 50, bet ar 1-1000 - ar 500.
2. uzdevums -
Pabeidz binārās meklēšanas AI
Beigās dators uzminēs tavu skaitli, uzdodot tikai dažus jautājumus.
- Uzraksti ciklu
while True:. - Izdrukā ciklā datora minējumu un pajautā atbildi.
- Nolasi atbildi:
lielaks,mazaksvaipareizi. - Pārbīdi
apaksa = minejums + 1, ja atbilde irlielaks. - Pārbīdi
augsa = minejums - 1, ja atbilde irmazaks. - Pārtrauc ciklu ar
break, ja atbilde irpareizi. - Izspēlē vienu partiju, iedomājoties skaitli 73.
Gatavs, kad: dators uzmin skaitli 73, un tu neesi to nekur ierakstījis kodā.
3. uzdevums -
Saskaiti minējumus un salīdzini ar lineāro
Beigās tu skaitļos pierādīsi, kāpēc binārā stratēģija ir labāka.
- Pievieno skaitītāju
minejumi = 0un palielini to katrā ciklā. - Izdrukā pēc uzvaras, cik minējumu vajadzēja.
- Izspēlē trīs partijas ar dažādiem skaitļiem un pieraksti rezultātus.
- Pieraksti, kāds bija lielākais minējumu skaits.
- Izrēķini, cik minējumu vajadzētu lineārai stratēģijai sliktākajā gadījumā.
- Veic commit ar ziņu
Pievieno koda lauzejuun push. - Iesniedz krātuves saiti skolotājam.
Gatavs, kad: nevienā partijā dators nepārsniedz 7 minējumus, kamēr lineārā stratēģija sliktākajā gadījumā prasītu 100.
Papildu uzdevums - Pamani krāpšanos
Ja pamatdarbs ir gatavs, liec datoram pamanīt pretrunīgas atbildes.
- Pievieno pārbaudi
if apaksa > augsa:. - Izdrukā paziņojumu, ka atbildes ir bijušas pretrunīgas.
- Pārtrauc spēli ar
break. - Izspēlē partiju, atbildot apzināti nepareizi.
- Pārbaudi, ka dators to pamana, nevis griežas mūžīgi.
Gatavs, kad: atbildot pretrunīgi, dators paziņo par krāpšanos, nevis iestrēgst bezgalīgā ciklā.
Biežākās kļūdas (un kā tās labot)
- Bezgalīgs cikls: pēc atbildes "lielāks" vai "mazāks" robežām jāmainās par vienu pozīciju aiz minējuma, nevis uz pašu minējumu.
- Pretrunas netiek pamanītas: cikla sākumā vai beigās pārbaudi, vai
min_r <= max_r. - Nederīga ievade salauž spēli: izmanto
.strip().lower()un prasi ievadi vēlreiz, ja tā navl,mvaiu. - README ir tikai virsraksts: tajā jābūt palaišanas instrukcijai, algoritma skaidrojumam un testa piemēriem.
Nodošanas pierādījumi
- Darbojošs
main.py, kas ļauj datoram minēt skaitli un beigt spēli korektā brīdī. - Atsevišķs
engine.pyar vismaz divām funkcijām: minējuma aprēķins un robežu atjaunošana. - README fails ar īsu O(log n) skaidrojumu un piemēru, cik minējumu vajag 100 un 1000 skaitļiem.
- Testu pieraksts ar vismaz vienu pretrunīgu spēli, kurā programma pamana, ka spēlētājs atbild negodīgi.
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
Teorētiskā sarežģītība: O(log n)
Maksimums 100 skaitļiem: 7 mēģinājumi