{"id":161,"date":"2011-03-07T03:15:23","date_gmt":"2011-03-07T02:15:23","guid":{"rendered":"http:\/\/julia2.lucaamore.com\/?p=161"},"modified":"2025-12-01T18:24:17","modified_gmt":"2025-12-01T16:24:17","slug":"ai-giocatore-artificiale-di-reversi","status":"publish","type":"post","link":"https:\/\/www.lucaamore.com\/?p=161","title":{"rendered":"AI: sviluppo di un giocatore artificiale di Reversi"},"content":{"rendered":"<p>Nei giochi di strategia a turni, ho sempre ammirato le grandi sfide tra uomo e calcolatore; epiche battaglie tra pensiero strategico umano e forza tattica del calcolatore; equilibrio precario tra sinapsi e silicio, agilit\u00e0 contro forza, tensione tra grande visione d&#8217;insieme ed imponente valutazione di ogni dettaglio<em>. <\/em>L&#8217;epilogo pu\u00f2 essere violento: il pensiero strategico umano si prende gioco della miopia del calcolatore e lo annichilisce; la forza bruta del calcolatore devasta il giocatore umano conducendolo verso una combinazione di cui ha previsto ogni minima variante.<\/p>\n<p><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1625\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c-1024x1024.png\" alt=\"\" width=\"584\" height=\"584\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c-1024x1024.png 1024w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c-300x300.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c-150x150.png 150w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c-768x768.png 768w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c-1536x1536.png 1536w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyborg_or_robot_on_computer_playing_with_chessboard_fb0ea8b4-9216-4d19-bd1f-ddf54a43708c.png 2048w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p>Sfide dove a vincere \u00e8 sempre l&#8217;uomo: il grande maestro oppure la squadra di progettisti che ha concepito un giocatore artificiale in grado di competere contro la finezza del pensiero umano.<\/p>\n<p>In <a title=\"Il computer e gli scacchi\" href=\"http:\/\/www.parodos.it\/storia\/argomenti\/il_computer_e_gli_scacchi.htm\">questo articolo<\/a>, ho trovato una citazione degli autori del programma scacchistico\u00a0<a title=\"Deep Thought\" href=\"http:\/\/en.wikipedia.org\/wiki\/Deep_Thought_(chess_computer)\">Deep Throught<\/a> (precursore di <a title=\"Deep Blue\" href=\"http:\/\/it.wikipedia.org\/wiki\/Deep_Blue\">Deep Blue<\/a>) sullo stile di gioco del calcolatore:<\/p>\n<blockquote>\n<p>&#8220;&#8230; il computer non imita il pensiero umano &#8211; raggiunge gli stessi obiettivi per vie diverse. Vede lontano, ma osserva poco; ricorda tutto, ma non impara niente. Non fa sbagli clamorosi, ma non si innalza mai al disopra della sua normale abilit\u00e0. Eppure talvolta produce intuizioni che sfuggono anche a grandi maestri.&#8221;<\/p>\n<\/blockquote>\n<p style=\"text-align: left;\">(<a title=\"Feng-hsiung_Hsu\" href=\"http:\/\/it.wikipedia.org\/wiki\/Feng-hsiung_Hsu\">Hsu<\/a>, F., Anantharaman, T., Campbell, M., Nowatzyk, A. &#8211; &#8220;<em>A Grandmaster Chess Machine<\/em>&#8220;, Scientific American, Ottobre 1990)<\/p>\n<p><strong>realizzazione di Reversi42 in Python<\/strong><\/p>\n<div id=\"attachment_248\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-248\" class=\"size-medium wp-image-248\" title=\"Reversi42.1\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.1-300x240.png\" alt=\"Reversi42 screenshot\" width=\"300\" height=\"240\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.1-300x240.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.1.png 600w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-248\" class=\"wp-caption-text\">Reversi42 screenshot<\/p><\/div>\n<p>In questi giorni ho provato a realizzare un prototipo di giocatore automatico di Reversi in Python (sto approfondendo ancora la conoscenza di questo linguaggio) che ho battezzato Reversi42 (in onore di Douglas Adams e della famosa domanda<em>: &#8220;<\/em><a title=\"The Ultimate Question of Life, the Universe and Everything\" href=\"http:\/\/www.google.com\/search?q=The+Ultimate+Question+of+Life%2C+the+Universe+and+Everything\"><em>The Ultimate Question of Life, the Universe and Everything<\/em><\/a><em>&#8220;)<\/em>.<\/p>\n<p>Non finir\u00f2 mai di ringraziare Donato Barnaba, maestro della FNGO (<a title=\"FNGO\" href=\"http:\/\/www.fngo.it\">Federazione Nazionale Gioco Othello<\/a>), per il suo prezioso aiuto, la sua disponibilit\u00e0 e grande competenza (anche dal punto di vista dei giocatori automatici); senza di lui lo sviluppo di Reversi42 non sarebbe stato cos\u00ec stimolante e divertente!\u00a0Reversi42, allo stato attuale, \u00e8 solo un prototipo; eventuali imprecisioni sono da attribuire solo a me!<\/p>\n<p>Reversi42, come altre mie realizzazioni, \u00e8 un <a title=\"software libero\" href=\"http:\/\/www.gnu.org\/philosophy\/free-sw.it.html\">software libero<\/a> rilasciato sotto la licenza <a title=\"licenza GNU\/GPL\" href=\"http:\/\/www.gnu.org\/licenses\/gpl.html\">GNU\/GPL<\/a>; siete incoraggiati a studiarne il sorgente, migliorarlo e farci tutto ci\u00f2 che desiderate; ogni commento o contributo sar\u00e0 gradito.<\/p>\n<p><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Tuerkischer_schachspieler_racknitz3_sm-e1299020285953.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-189 aligncenter\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Tuerkischer_schachspieler_racknitz3_sm-300x270.jpg\" alt=\"Il Turco\" width=\"300\" height=\"270\" \/><\/a><\/p>\n<p>Di <a title=\"Othello\/Reversi\" href=\"http:\/\/it.wikipedia.org\/wiki\/Othello\">Reversi<\/a> esiste un libro di Brian Rose che lo presenta cos\u00ec: <em>&#8220;un minuto per imparare&#8230; una vita per diventare maestri&#8221;<\/em>; le regole del gioco sono facili da apprendere (e quindi da codificare) ma il gioco pu\u00f2 essere estremamente complesso dal punto di vista strategico e tattico (ottima sfida per la realizzazione di un giocatore automatico).<\/p>\n<div id=\"attachment_249\" style=\"width: 310px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.2.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-249\" class=\"size-medium wp-image-249\" title=\"Reversi42.2\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.2-300x240.png\" alt=\"Reversi42 screenshot\" width=\"300\" height=\"240\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.2-300x240.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/Reversi42.2.png 600w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-249\" class=\"wp-caption-text\">Reversi42 screenshot<\/p><\/div>\n<p>Nella progettazione del motore AI di gioco, ho deciso di adottare l&#8217;approccio classico che viene adottato in tutti i giochi di strategia ad informazione perfetta per due giocatori: si esplora in profondit\u00e0 l&#8217;albero delle possibili mosse valutando la bont\u00e0 di ogni posizione ottenuta; si assume, inoltre, che l&#8217;avversario risponda sempre con la migliore mossa disponibile.<\/p>\n<p>Trattandosi di un prototipo, sviluppato principalmente nei ritagli di tempo, ho voluto concentrare la mia attenzione solo sugli algoritmi e non sull&#8217;ottimizzazione delle singole procedure.<\/p>\n<p>Citando\u00a0<a title=\"Donald E. Knuth\" href=\"http:\/\/it.wikipedia.org\/wiki\/Donald_Knuth\">Donald E. Knuth<\/a>:<\/p>\n<blockquote>\n<p>\u201cWe should forget about small efficiencies, say about 97% of the time: <strong>premature optimization is the root of all evil<\/strong>. Yet we should not pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only after that code has been identified\u201d.<\/p>\n<\/blockquote>\n<div id=\"attachment_251\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/GRhino_vs_Reversi42.2.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-251\" class=\"size-medium wp-image-251\" title=\"GRhino_vs_Reversi42\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/GRhino_vs_Reversi42.2-300x175.png\" alt=\"GRhino vs Reversi42\" width=\"300\" height=\"175\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/GRhino_vs_Reversi42.2-300x175.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/GRhino_vs_Reversi42.2.png 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-251\" class=\"wp-caption-text\">screenshot sfida tra GRhino e Reversi42 (test)<\/p><\/div>\n<p>Ho comunque introdotto alcune metriche (certamente migliorabili) per valutare efficienza e sensitivit\u00e0 (rispetto a modifiche) dei punti critici dell&#8217;algoritmo.<\/p>\n<p>La guida di riferimento che ho adottato \u00e8: <a title=\"Strategy Game Programming\" href=\"http:\/\/www.fierz.ch\/strategy.htm\">&#8220;Stategy Game Programming&#8221;<\/a> di Martin Fierz che propone un graduale ed avvincente percorso tra le principali tecniche adottate per la costruzione di un buon giocatore automatico per giochi strategici (es. scacchi, dama, Reversi, forza quattro).<\/p>\n<p>Le problematiche affrontate nella realizzazione del prototipo sono:<\/p>\n<ul>\n<li>ricerca nell&#8217;albero delle posizioni della mossa pi\u00f9 efficace<\/li>\n<li>realizzazione di una buona valutazione della posizione<\/li>\n<li>sintesi delle regole del gioco Reversi<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_child_plays_chess_with_a_big_dragon_e0845f0f-6314-476b-815a-4fae223c0adc.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1627\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_child_plays_chess_with_a_big_dragon_e0845f0f-6314-476b-815a-4fae223c0adc-1024x1024.png\" alt=\"\" width=\"584\" height=\"584\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_child_plays_chess_with_a_big_dragon_e0845f0f-6314-476b-815a-4fae223c0adc.png 1024w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_child_plays_chess_with_a_big_dragon_e0845f0f-6314-476b-815a-4fae223c0adc-300x300.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_child_plays_chess_with_a_big_dragon_e0845f0f-6314-476b-815a-4fae223c0adc-150x150.png 150w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_child_plays_chess_with_a_big_dragon_e0845f0f-6314-476b-815a-4fae223c0adc-768x768.png 768w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p><strong>Ricerca nell&#8217;albero delle posizioni della mossa pi\u00f9 efficace<\/strong><\/p>\n<p>Lo scopo di questo problema (indipendente dal tipo di gioco) \u00e8 quello di costruire l&#8217;albero di tutte le mosse possibili e percorrerlo in profondit\u00e0 ricercando la mossa migliore; si assume che l&#8217;avversario giochi sempre le mosse migliori.<\/p>\n<p>All&#8217;aumentare della profondit\u00e0 di analisi (D), che condiziona la forza del giocatore, il numero di mosse da valutare (M) cresce esponenzialmente in funzione del fattore Branch Factor medio (B) tipico di ogni gioco.<strong><br \/><\/strong><\/p>\n<p><img src='https:\/\/s0.wp.com\/latex.php?latex=M%3DB%5E%7BD%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='M=B^{D}' title='M=B^{D}' class='latex' \/><\/p>\n<p>Valori tipici del Branch Factor medio (B):<\/p>\n\n<table id=\"tablepress-1\" class=\"tablepress tablepress-id-1\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">Gioco<\/th><th class=\"column-2\">Branch Factor (B)<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">Reversi<\/td><td class=\"column-2\">7<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">Forza Quattro<\/td><td class=\"column-2\">7<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">Dama<\/td><td class=\"column-2\">10<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">Scacchi<\/td><td class=\"column-2\">40<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">Go<\/td><td class=\"column-2\">300 (!!!)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-1 from cache -->\n<div id=\"attachment_191\" style=\"width: 512px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/df_over_bf.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-191\" class=\"size-full wp-image-191   \" title=\"df_over_bf\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/df_over_bf.png\" alt=\"M=BF^DF\" width=\"502\" height=\"300\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/df_over_bf.png 502w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/df_over_bf-300x179.png 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/a><p id=\"caption-attachment-191\" class=\"wp-caption-text\">andamento del numero di mosse da analizzare al variare del gioco e profondit\u00e0 (in scala semilogaritmica)<\/p><\/div>\n<p>Il mio obiettivo era quello di raggiungere una profondit\u00e0 di gioco (D) di 5-8 al fine di realizzare un giocatore automatico discreto; sul mio netbook riesco a giocare, a profondit\u00e0 (D) pari a 6, con tempi di attesa sempre ragionevoli (inferiori al minuto).<\/p>\n<p>L&#8217;algoritmo di ricerca adottato \u00e8 quello della <a title=\"Potatura Alfa Beta\" href=\"http:\/\/it.wikipedia.org\/wiki\/Potatura_alfa-beta\">potatura alfa-beta<\/a> (in forma negamax), estremamente pi\u00f9 efficace del <a title=\"Minimax\" href=\"http:\/\/it.wikipedia.org\/wiki\/Minimax\">minimax<\/a> poich\u00e8 \u00e8 in grado di escludere dalla ricerca (pruning) interi rami dell&#8217;albero che condurrebbero a mosse non convenienti rispetto ad altre gi\u00e0 individuate.<\/p>\n<p>Per massimizzare il numero di rami da potare \u00e8 opportuno introdurre un criterio euristico per ordinare in sequenza le mosse da valutare; le migliori mosse dovrebbero esser analizzate per prime. Rispetto all&#8217;algoritmo minimax, che richiede l&#8217;analisi di tutto l&#8217;albero delle possibili mosse (<img src='https:\/\/s0.wp.com\/latex.php?latex=M%3DB%5E%7BD%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='M=B^{D}' title='M=B^{D}' class='latex' \/>), nel caso migliore della potatura alfa beta, ovvero nel caso ideale di ordinamento perfetto (le mosse pi\u00f9 forti vengono valutate per prime), le posizioni da analizzare si abbattono a <img src='https:\/\/s0.wp.com\/latex.php?latex=M%3D%5Csqrt%7BB%5ED%7D%3DB%5E%7B%5Cfrac%7BD%7D%7B2%7D%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='M=\\sqrt{B^D}=B^{\\frac{D}{2}}' title='M=\\sqrt{B^D}=B^{\\frac{D}{2}}' class='latex' \/>; siamo in grado di raddoppiare la profondit\u00e0 di analisi a parit\u00e0 di risorse di calcolo impiegate!<\/p>\n<p>Il criterio euristico, con il quale vengono ordinate le mosse prima dell&#8217;alfa-beta su Reversi42, \u00e8 quello di assegnare una priorit\u00e0 statica a tutte le mosse della scacchiera; le celle che hanno un valore pi\u00f9 basso hanno maggiore priorit\u00e0 e vengono esplorate per prime (es. gli angoli).<\/p>\n\n<table id=\"tablepress-2\" class=\"tablepress tablepress-id-2\">\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-1\">\n\t<td class=\"column-1\">1<\/td><td class=\"column-2\">8<\/td><td class=\"column-3\">7<\/td><td class=\"column-4\">6<\/td><td class=\"column-5\">6<\/td><td class=\"column-6\">7<\/td><td class=\"column-7\">8<\/td><td class=\"column-8\">1<\/td>\n<\/tr>\n<tr class=\"row-2\">\n\t<td class=\"column-1\">8<\/td><td class=\"column-2\">9<\/td><td class=\"column-3\">7<\/td><td class=\"column-4\">4<\/td><td class=\"column-5\">4<\/td><td class=\"column-6\">7<\/td><td class=\"column-7\">9<\/td><td class=\"column-8\">8<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">7<\/td><td class=\"column-2\">5<\/td><td class=\"column-3\">3<\/td><td class=\"column-4\">2<\/td><td class=\"column-5\">2<\/td><td class=\"column-6\">3<\/td><td class=\"column-7\">5<\/td><td class=\"column-8\">7<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">6<\/td><td class=\"column-2\">4<\/td><td class=\"column-3\">2<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">2<\/td><td class=\"column-7\">4<\/td><td class=\"column-8\">6<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">6<\/td><td class=\"column-2\">4<\/td><td class=\"column-3\">2<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">2<\/td><td class=\"column-7\">4<\/td><td class=\"column-8\">6<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">7<\/td><td class=\"column-2\">5<\/td><td class=\"column-3\">3<\/td><td class=\"column-4\">2<\/td><td class=\"column-5\">2<\/td><td class=\"column-6\">3<\/td><td class=\"column-7\">5<\/td><td class=\"column-8\">7<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">8<\/td><td class=\"column-2\">9<\/td><td class=\"column-3\">7<\/td><td class=\"column-4\">4<\/td><td class=\"column-5\">4<\/td><td class=\"column-6\">7<\/td><td class=\"column-7\">9<\/td><td class=\"column-8\">8<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">1<\/td><td class=\"column-2\">8<\/td><td class=\"column-3\">7<\/td><td class=\"column-4\">6<\/td><td class=\"column-5\">6<\/td><td class=\"column-6\">7<\/td><td class=\"column-7\">8<\/td><td class=\"column-8\">1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-2 from cache -->\n<p>Da quando \u00e8 stato adottato questo ordinamento, le prestazioni della ricerca sono aumentate notevolmente; molto spesso la mossa migliore ricade tra le prime analizzate.<\/p>\n<p><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_beautiful_cyberpunk_girl_playing_chess_with_a_steampunk__d5d9f782-12a7-465e-8a82-3a95488401b7.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1666\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_beautiful_cyberpunk_girl_playing_chess_with_a_steampunk__d5d9f782-12a7-465e-8a82-3a95488401b7-1024x1024.png\" alt=\"\" width=\"584\" height=\"584\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_beautiful_cyberpunk_girl_playing_chess_with_a_steampunk__d5d9f782-12a7-465e-8a82-3a95488401b7.png 1024w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_beautiful_cyberpunk_girl_playing_chess_with_a_steampunk__d5d9f782-12a7-465e-8a82-3a95488401b7-300x300.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_beautiful_cyberpunk_girl_playing_chess_with_a_steampunk__d5d9f782-12a7-465e-8a82-3a95488401b7-150x150.png 150w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_beautiful_cyberpunk_girl_playing_chess_with_a_steampunk__d5d9f782-12a7-465e-8a82-3a95488401b7-768x768.png 768w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p><strong>Valutazione della posizione<\/strong><\/p>\n<p>La valutazione della posizione \u00e8 un elemento cruciale di un giocatore artificiale in quanto \u00a0ne condiziona: strategia, tattica ed efficienza. Occorre ponderare due parametri contrastanti: l&#8217;accuratezza dell&#8217;analisi e l&#8217;efficienza computazionale. Riuscire a trovare un compromesso ottimale tra queste due caratteristiche \u00e8 un arte che si affina con l&#8217;esperienza! Un algoritmo di valutazione troppo accurato potrebbe rallentare la ricerca e quindi penalizzare eccessivamente la profondit\u00e0 di analisi; un algoritmo rapido ma poco accurato potrebbe perdere grandi opportunit\u00e0.<\/p>\n<p>In questo prototipo ho impostato la partita su due momenti distinti:<\/p>\n<ul>\n<li><strong>apertura e mediogioco:<\/strong> meno del 70% delle pedine non sono state giocate<\/li>\n<li><strong>finale:<\/strong> almeno il 70% delle pedine sono state giocate<\/li>\n<\/ul>\n<p>In <strong>apertura e mediogioco<\/strong> ho cercato di massimizzare la mobilit\u00e0, ovvero il numero di mosse disponibili che potranno essere utilizzate per dominare il finale; ho anche assegnato dei pesi ad alcune case strategiche che concorrono alla conquista degli angoli (caselle stabili).<\/p>\n\n<table id=\"tablepress-3\" class=\"tablepress tablepress-id-3\">\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-1\">\n\t<td class=\"column-1\">10<\/td><td class=\"column-2\">-3<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">-3<\/td><td class=\"column-8\">10<\/td>\n<\/tr>\n<tr class=\"row-2\">\n\t<td class=\"column-1\">-3<\/td><td class=\"column-2\">-7<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">-7<\/td><td class=\"column-8\">-3<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">0<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td><td class=\"column-8\">0<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">0<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td><td class=\"column-8\">0<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">0<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td><td class=\"column-8\">0<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">0<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td><td class=\"column-8\">0<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">-3<\/td><td class=\"column-2\">-7<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">-7<\/td><td class=\"column-8\">-3<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">10<\/td><td class=\"column-2\">-3<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">0<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">-3<\/td><td class=\"column-8\">10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-3 from cache -->\n<p>Vengono assegnati punti di bonus se si occupano angoli mentre, se si conquistano delle case adiacenti agli angoli, vengono assegnate delle penalit\u00e0\u00a0poich\u00e9 sar\u00e0 pi\u00f9 difficile difendere l&#8217;angolo dalla conquista avversaria. Le case adiacenti all&#8217;angolo perdono la loro penalit\u00e0 quando l&#8217;angolo \u00e8 conquistato.<\/p>\n<p>Nel <strong>finale<\/strong> si ricerca la vincita della partita oppure, grazie alla mobilit\u00e0 ottenuta in apertura e nel mediogioco, si inizia a massimizzare il numero di pedine possedute rispetto a quelle dell&#8217;avversario.\u00a0L&#8217;errore fatale, tipico di giocatori mediocri di Reversi, \u00e8 proprio quello di perseguire intuitivamente tale obiettivo sin dalla prima mossa.<\/p>\n<p><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyberpunk_chessboard_dada8867-b11f-43c1-9094-92febcacd32f.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1634\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyberpunk_chessboard_dada8867-b11f-43c1-9094-92febcacd32f-1024x1024.png\" alt=\"\" width=\"584\" height=\"584\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyberpunk_chessboard_dada8867-b11f-43c1-9094-92febcacd32f.png 1024w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyberpunk_chessboard_dada8867-b11f-43c1-9094-92febcacd32f-300x300.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyberpunk_chessboard_dada8867-b11f-43c1-9094-92febcacd32f-150x150.png 150w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/03\/lukelv_cyberpunk_chessboard_dada8867-b11f-43c1-9094-92febcacd32f-768x768.png 768w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p><strong>Sorgenti<\/strong><\/p>\n<p><strong><a title=\"Reversi42\" href=\"https:\/\/github.com\/lookee\/Reversi42\/tree\/old-version\">Visualizza o scarica i sorgenti dal repository su github -versione storica<\/a><\/strong><\/p>\n<p>richiede:<br \/><a title=\"pygame\" href=\"http:\/\/www.pygame.org\">python-pygame<\/a> &#8211; SLD bindings for games development in Python<\/p>\n\n\n<p><a href=\"https:\/\/github.com\/lookee\/Reversi42\" data-type=\"link\" data-id=\"https:\/\/github.com\/lookee\/Reversi42\"><strong>Dall&#8217;ottobre 2025 ho ristrutturato il progetto in modo significativo &#8211; nuova versione<\/strong><\/a> <\/p>\n\n\n\n<p>Articolo correlato alla nuova versione:<a href=\"https:\/\/www.lucaamore.com\/?p=2503\" data-type=\"link\" data-id=\"https:\/\/www.lucaamore.com\/?p=2503\"> Reversi42: A Journey Through Hyperspace \u2013 From Vim to Cursor<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nei giochi di strategia a turni, ho sempre ammirato le grandi sfide tra uomo e calcolatore; epiche battaglie tra pensiero strategico umano e forza tattica del calcolatore; equilibrio precario tra sinapsi e silicio, agilit\u00e0 contro forza, tensione tra grande visione &hellip; <a href=\"https:\/\/www.lucaamore.com\/?p=161\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1635,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"categories":[16,19,32,20,166,13,11,17,18,14,21,165],"tags":[75,88,65,87],"class_list":["post-161","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-alfabeta","category-freesoftware","category-games","category-programming","category-pygame","category-python","category-reversi","category-reversi42","category-sdl","category-strategia","category-top","tag-artificial-intelligence","tag-artificial-player","tag-python","tag-reversi"],"_links":{"self":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts\/161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=161"}],"version-history":[{"count":124,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts\/161\/revisions"}],"predecessor-version":[{"id":2662,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts\/161\/revisions\/2662"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/media\/1635"}],"wp:attachment":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}