Saa Divjak Programiranje in algoritmi Kar ni bilo
Saša Divjak Programiranje in algoritmi Kar ni bilo povedano na predavanjih Kar ni bilo dovoj jasno Kar vas zanima Začetek ob 20. 00
Kaj pravi naloga? Janezek je pred kratkim spoznal miselno igro, ki se jo igra s palčkami, razporejenimi v štiri vrste po sledečem številu: 1, 3, 5 in 7 palčk. Vsako potezo lahko uporabnik prečrta poljubno število skupaj ležečih palčk v le eni posamezni vrstici. Cilj igre je prisiliti nasprotnika, da zadnji prečrta zadnjo palčko. Vsako potezo lahko uporabnik prečrta poljubno število palčk znotraj posamezne vrstice, s tem, da lahko prične s črtanjem palčk kjer koli znotraj vrstice. Primer igre je prikazan na sliki.
… kaj pravi naloga… napisati uporabniški umesnik, ki bo preverjal pravilnost potez. Uporabnik naj vpiše črtanje palčk v obliki: <VRSTICA>-<ZAČETNA_PALČKA>-<KONČNA_PALČKA> Računalnik naj preveri, ali je poteza veljavna (ta poteza ne prečrta že prečrtane palčke, ali ne prečrta več palčk, kot jih obstaja v vrstici in podobno).
… kaj pravi naloga… na ukaz IZPIS naj program izriše trenutno stanje v konzolo na način: mala črka “L” naj predstavlja neprečrtano palčko, mala črka “ł” (trdi L), pa naj predstavlja prečrtano palčko. Palčke naj se izrisujejo v obliki piramide (smrečice). Primer izpisa smrečice: ł lll lłłll łłłłlll
… kaj pravi naloga … • V drugem delu program dopolnite, da bo mogoče igrati proti računalniku (torej napišite nek odločevalni sistem, ki sporoča poteze, ki jih je opravil. Poteze naj ne bodo popolnoma naključne - poskusite igrati igro proti prijatelju in boste kmalu ugotovili, katere končne poteze so “pogubne”). • Tekstovni uporabniški vmesnik naj ima začetno izbiro - dva igralca ali igralec proti računalniku. Odziva naj se na vnose poteze igralcev in na ukaz izpisa trenutnega stanja.
Za bolj nadobudne Ali je mogoče v določenih začetnih primerih vedno napovedati izid igre? Poskusite napisati tako dober odločevalni sistem, da ne bo mogoče zmagati proti računalniku (namig: ali je pomembno, kdo začne prvi? ). Izdelate lahko tudi grafični uporabniški vmesnik, kjer se poteze črtanja izvajajo z miškinim potegom čez palčke.
Kaj bomo obravnavali? • Strategija igre NIM http: //www. gamegrid. ch/gamegrid. English/index. php? inhalt_mitte=gitterg ames/nimspiel. inc. php
Presentation Različna pravila igre • Normalna igra: • Zmaga, kdor povleče zadnjo potezo • Alternativa (misère game): • Kdor povleče zadnjo potezo, izgubi 8
Presentation Kako pravijo naši varianti igre • • • Variant of the Nim game Marienbad Game Misère Nim Game • Pravila: v V vsaki potezi mora igralec vzeti vsaj eno palčko v Vsakokrat sme vzeti le palčke v eni vrsti v Izgubi tisti, ki vzame zadnjo palčko (vžigalico) 9
Mathematical Modeliranje igre • Igre pogosto predstavimo z drevesi P 1 Verteks = točka izbire za igralca A Črta: možna akcija igralca B P 2 C D 0: 1 1: 0 0: 1 Na koncu drevesa vidimo rezultate 10
Mathematical Modeliranje igre Igre pogosto predstavimo z drevesi. Primer z 1 kopico s 4 palčkami
“Brute force” reševanje (rekurzija) • http: //today. java. net/pub/a/today/2004/05/18/nim 1. html • Bolj jasno pa je tu: • http: //www. zahniser. net/~russell/computer 06/index. php? titl e=Lesson: %20 Loops%20 and%20 Recursion%20 Review
PVS • Primer pri verziji Marienbad Pravilo : Odstrani (prečrtaj) nekaj palčk v vrstici Odstrani vse palčke v vrstici Odstrani nekaj palčk v vrstici
PVS 3 zmagovita končna stanja Ena vrsta z nekaj palčkami Ena vrsta z eno palčko in ena vrsta z nekaj palčkami Dve vrsti s po eno palčko 14
PVS • Vsota Nim Sum : o Računa z binarno predstavitvijo o Uporabimo funkcijo “xor” • Teorem : Če je vsota Nim enaka nič, ima drugi igralec zmagovalno strategijo
Mathematical Model Vsota Nim S = s 1 ⊕ s 2 ⊕ … ⊕ sn Pri tem je – si predstavlja število palčk v vrsti (kopici) – ⊕ predstavlja “xor”. Binary Decimal 0112 310 Kopica A 1002 410 Kopica B 1012 510 Kopica C -----------------------------------------------0102 210 Nim vsota kopic A, B, in C: 3⊕ 4⊕ 5=2
Strategija igre (1) • http: //en. wikipedia. org/wiki/Nim Skušamo končati vsako potezo z vsoto Nim enako 0. To je vedno možno, če je pred potezo vsota Nim ≠ 0. Kako to ugotovimo: naj bo X vsota Nim vsek kopic. Vzamemo vsoto Nim z vsako kopico in X in najdimo kopico, katere velikost se zmanjša. Igramo s to kopico in jo zmanjšamo na Nim vsoto njene prvotne velikosti in X. Primer: Imejmo : 3 ⊕ 4 ⊕ 5 = 2 Nim vsote kopic velikosti A=3, B=4 in C=5 z X=2 so A ⊕ X = 3 ⊕ 2 = 1 [ker velja (011) ⊕ (010) = 001 ] B⊕X=4⊕ 2=6 C⊕X=5⊕ 2=7 Edina kopica, ki se zmanjša, je A, zato je zmagovita poteza zmanjšanje kopice A na 1 (s črtanjem dveh palčk).
Strategija igre (2) • http: //en. wikipedia. org/wiki/Nim Pri igri tipa misère , se strategija Nim razlikuje le, ko normalna igra ne bi več pustila kopic velikosti 2 ali večjih. V tem primeru je pravilna poteza, če pustimo liho število kopic velikosti 1 (pri normalni igri bi morali pustiti sodo število takih kopic). Zakaj to deluje? Iz izgubljene pozicije lahko vlečemo potezo le na zmagovito pozicijo: - če je xor velikosti kopic 0 , bo po naši potezi spremenjena (najmanj en 1 bo spremenjen v 0, tako da bomo v tej koloni imeli liho število 1). Iz zmagovite pozicije lahko naredimo premik v vsaj eno izgubljeno: - Če xor velikosti kopic ni 0 , jo lahko spremenimo v 0 tako, da najdemo najbolj levi stoplec, kjer je število enic liho, spremenimo eno od teh v 0 in nato spremenimo bite 0 ali 1 na desni tako, da dobimo sodo število 1 v vsakem stolpcu.
Kako zmagati v igri NIM http: //www. archimedes-lab. org/How_to_Solve/Win_at_Nim. html# http: //today. java. net/pub/a/today/2004/06/21/nim 2. html? page=2#GUIbased_NIM http: //community. topcoder. com/tc? module=S tatic&d 1=tutorials&d 2=algorithm. Games
Psevdo koda http: //harry. cciflorida. com/HTML 4/home/work/samplecode/nim. html
Rešitev naloge lahko iščemo tudi tu http: //www. archimedes-lab. org/game_nim/play_nim_game. html
Vendar. . naša naloga je rahlo drugačna Vsako potezo lahko uporabnik prečrta poljubno število skupaj ležečih palčk v le eni posamezni vrstici.
- Slides: 22