Prickar och Rutor Analys Metod

Link: http://wilson.engr.wisc.edu/boxes/method/

Tittar på varje tänkbar sekvens av drag ger en n! tid för analys. Mitt program ser ut på varje möjlig position i stället, vilket ger en 2n tid för analys. Även om 2n blir stor snabbt, det är inte ens i närheten så stort som n!.

att Arbeta Bakåt

För varje position programmet lagrar den bästa poäng för spelaren på språng för framtida lådor. Lådor redan omgiven ignoreras. Alltså, varje position är unikt identifierad av linjer närvarande. Inga uppgifter om poäng upp till att flytta hålls.

Analysen fungerar bakåt från den position med alla rader ifyllda. Den positionen ges det värde som anges i den första raden i datafilen (normalt noll). Då programmet processer positioner med en mindre linje som fylls i. När detta är gjort, it-processer och positioner med ytterligare en rad mindre. Så småningom blir det tillbaka till den ursprungliga positionen.

För varje sådan position programmet anser att alla möjliga drag och håller poängen med det bästa resultatet för spelaren på språng.

För varje möjligt drag programmet kontrollerar först för att se om noll, en eller två nya lådor bildades. Om inga nya lådor bildades, betyg för flytten är det negativa i betyg för den resulterande position eftersom den ståndpunkt som har det bästa resultatet för den andra spelaren registreras. Om en eller två nya lådor bildades, betyg för flytten är poängen för den resulterande position plus antalet nya boxarna eftersom spelare fortfarande är på resande fot.

Hitta Positioner med ett Visst Antal Rader

En position representeras av ett binärt tal med en bit (binary digit) plats tilldelas varje linje. Den biten är 0 om linjen är närvarande och 1 om linjen är frånvarande. (Jag vänt den vanliga konventionen för att göra det lättare att söka efter nya rutor.)

Jag delar in de rader i grupper. Varje grupp av linjer är representerat med varandra följande bitar i den position som är binärt tal. Dessa bitar kan kopieras och placeras i ett separat nummer som företräder staten i linjer inom koncernen. Till exempel, för 3×3 spel det finns totalt 24 linjer. Programmet använder sig av två grupper av rader med 12 rader vardera. För varje rad räknas som en grupp (0 till och med 12), programmet skapar en lista med siffror som representerar en grupp med samma antal linjer närvarande. Sedan att hitta positioner med n rader som jag kombinera alla den första gruppen stat med i linjerna med den andra gruppen stat med n-i linjerna där jag varierar över alla möjliga värden som inte resulterar i ett omöjligt antal linjer för någondera gruppen. Till exempel, för att hitta alla positioner med 15 linjer i 3×3 spelet, programmet kombinerar alla första grupp stater med 3 rader med alla andra grupp stater med 12 linjer (det är bara en av dem), då alla första grupp stater med 4 rader med alla andra grupp stater med 11 rader, … och slutligen alla första grupp stater med 12 linjer (igen, bara ett möjligt) med alla andra grupp stater med 3 rader.

att Kolla på Nya Lådor

Varje rad ges ett index nummer som motsvarar dess lite i den position som är binärt tal. Programmet har två uppsättningar av fält test för värden som refereras till med hjälp av index-nummer på en ny rad. En uppsättning kontroller för en ny rutan ovanför eller till vänster på en ny rad. Den andra kontroller för en ruta under eller till höger om en ny linje. Dessa värden används för att kontrollera om de andra 3 rader som redan finns. De bitar som motsvarar dessa 3 rader är satt till 1, alla andra bitar som är satta till 0. Testet är gjort med ett logiskt “och” drift mellan position är binärt tal och test värde. “Och” drift, för varje lite position, ger 1 om motsvarande bitar i båda värdena är satt; annars 0. Eftersom position är binärt tal har bitar sättas till 0 om en linje är närvarande, “och” av detta och testa värde ger en noll om och endast om de tre linjerna finns redan.

Om ett fält inte existerar eftersom en linje på kanten, test värde har alla bitar som, därigenom att testa för alla linjer är närvarande. Eftersom testet är utfört innan den nya linjen är placerad i position binära nummer, det är minst en linje att inte ställa in och testa med det här värdet som kommer att säga att det är ingen ny laptop.

Med Många Linje Grupper

Efter den Isländska analys sprang i bara en halvtimme, insåg jag att design inte skulle vara ett problem för 3×5 spelet analys. Den Isländska spelet har 30 öppna linjer medan 3×5 spelet har 38 öppna linjer vilket gör det till 256 (28) gånger svårare. 256 gånger en halv timme 128 timmar eller ca 5 dagar. Eftersom jag kunde ställa upp programmet för att börja där det slutade efter en abort eller omstart, 5 dagar kan enkelt göras under kvällar, nätter och helger. Så problemet blev att räkna ut hur att få det att passa på min maskin med 256 MB RAM-minne och 16 GB ledigt utrymme på hårddisken.

Vid första, det såg inte ut som möjligt. Lagring av analysen skulle ta 238 byte eller 256 GB av diskutrymme. Det utrymme som krävs i RAM-minnet medan du beräkna värdet för positioner med 19 linjerna samtidigt som de hänvisar till resultat för positioner med 20 linjer som skulle vara 56 GB, snarare mer än min en fjärdedel GB RAM-minne.

Förutsatt att linjerna delades in i två grupper av 19 rader vardera, att jag kunde ha i minnet precis de värden som motsvarar ett visst antal linjer för var och en av de två grupperna. Till exempel, medan du gör positioner med 19 rader, jag skulle kunna utvärdera positioner med 9 linjer i den första gruppen och 10 linjer i den andra gruppen. Jag kommer att kalla dessa 9/19 10/19 positioner. För att beräkna dessa värden för att jag skulle få se två uppsättningar av positioner med 20 linjer: 10/19 10/19 och 9/19 11/19. Jag behöver inte både de 20-line-satser i minnet på en gång. de kan användas på en gång genom att spara de bästa poängen med tanke på nya linjer i den första gruppen för alla 9/19 10/19 positioner och sedan se om någon förbättring kan göras i poäng med en ny rad i den andra gruppen. De två buffertar skulle ta bara 16 GB.

Sen insåg jag att jag skulle kunna bryta upp de rader i mer än två grupper. Med hjälp av 6 grupper, jag kunde skära den RAM som behövs för att bara 426 MB. En ytterligare sänkning med hjälp av symmetri (se nedan) gjorde det passar. Naturligtvis för att hitta, till exempel, poängen för den 4/8 3/6 3/6 3/6 3/6 3/6 positioner, programmet var tvungen att läsa i sex olika antal poäng på alla 20 linjer–var och en har en mer lina i en av dessa sex grupper.

Symmetri

3×5 spelet är symmetrisk vertikalt och horisontalt, så genom att dra nytta av symmetri, jag kunde dela utrymme med 4 (faktiskt, av 3 i min slutliga genomförandet). Paul Stevens rapporterade en fel i testet för symmetri över diagonalen på en kvadrat styrelsen.

För att beräkna poängen för en position, programmet ser ut på den tidigare beräknade poäng för de positioner som är resultatet av att lägga till ytterligare en linje. Men, att lägga till en linje kan resultera i en position som måste vara symmetriskt omvandlas innan dess värdering kan hittas. För att se till att betyg för ståndpunkten att resultaten från den symmetriska omvandling är omedelbart tillgängliga, är det nödvändigt att omvandlingen karta några rader i samma grupp. På det sättet är antalet rader i varje grupp är fortfarande samma efter omvandlingen.

Innan programmet tilldelar linjer till grupper, den första ser ut för linjer som är associerade med en annan av symmetrisk omvandling. I 3×5 spelet, det finns sju uppsättningar av 4 rader och femmor uppsättningar av 2 rader som är associerade. Programmet tilldelar sedan uppsättningar av linjer till grupper. För 3×5 spel med 256 MB RAM-minne, sex grupper resultat (var och en med två uppsättningar med linjer) i storlek 8 6 6 6 6 6.

För att avgöra om en position bör vara symmetriskt omvandlas, programmet ser ut på linjer i den första gruppen. Under installationen programmet scannar igenom alla tänkbara linje konfigurationer i den första gruppen rader. Att varje konfiguration, det gäller vertikal reflektion, horisontell reflektion och eftertanke genom origo förändringar. Om en av dessa omvandling resulterar i ett antal för de rader i den grupp som är numerärt mindre än det antal som för staten av de ursprungliga raderna, då (1) den konfiguration som INTE ingår i den länkade listan med konfigurationer med ett visst antal rader set och (2) information sparas som symmetrisk omvandling måste användas för att få en position vars betyg har räknats-det vill säga, hur man får till motsvarande konfiguration med den lägsta numeriskt värde för staten i sina linjer.

Även om endast den första gruppen används för att se om en förändring ska göras, när omvandlingen är klart det påverkar linjer i alla grupper.

Spara Diskutrymme

poäng för positioner med ett visst antal rader i varje grupp är som lagras i en enda fil på datorn. Till exempel, poängen för den 4/8 3/6 4/6 2/6 3/6 3/6 positioner lagras i filen:
\Lådor\3×5\19\4\3\4\2\3.bin
Den bakåtlutande snedstreck separat kapslade mappnamn. 3×5 är namnet på spelet som analyseras. 19 är det totala antalet rader i den positionen. Resten av mappnamn och filnamn kommer från att antalet rader i grupper. Antalet rader i den sista gruppen används inte, eftersom det är fast med andra siffror. .bin innebär att det är en binär fil–dess innehåll inte direkt kan ses. Kapslade mappar används eftersom Windows bearbetar även mappar med ett stort antal filer som mycket långsamt.

Symmetriska transformationer skär diskutrymme som krävs från 256 GB till 85 GB. Det är dock inte nödvändigt för att behålla hela analysen resultat. Så snart programmet var gjort med positioner med 19 linjer, resultaten för positioner med 20 rader kan tas bort. Med bara 16 GB ledigt hårddiskutrymme tillgängligt, programmet håller resultaten för positioner med 15 eller färre rader. Detta resulterar i en “öppnar boken” för 3×5 spel.

Men bara lagra resultaten för 20 linje positioner och 19 line positioner fortfarande tar 22 GB. Detta är löst genom att ta bort delar av de 20 linjerna position filer eftersom de inte längre behövs för vidare beräkning av poäng för 19 linjer positioner. När programmet går igenom alla tänkbara kombinationer av linjer räknas för de grupper som lägger upp till 19 linjer, de räknas för den första gruppen rader aldrig minskar. Således, när räkningen för den första gruppen av linjer som går från 0 till 1, till exempel, alla filer som börjar med \Lådor\3×5\20\0\ kan tas bort. Med denna förändring, analys passa på 16 GB tillgängligt.

 

Kedjor

På denna punkt, programmet var fortfarande otillräcklig för att lösa 5×5 problem i kapitel 12 i Prickar-och-Lådor Spel av Elwyn Berlekamp (A. K. Peters, 2000). Om datorer fortsätter att dubbla sin kapacitet var 18 månader, vi ska kunna analysera hela 5×5-spel i 2034 eftersom den har 22 mer linjer än 3×5-spelet, som analyseras i 2001. Programmet kan nu hantera positioner med upp till 36 öppna linjer där positionen har ingen symmetri och 14 Gb diskutrymme som finns tillgängligt. Det innebar att bara 5×5 positioner med 24 eller fler linjer (ut 60) kan lösas. Ingen av kapitel 12 problem var att många rader.

En kedja är en sträng av en eller fler boxar med två sidor fyllas i. Jag gjorde antagandet att när en av spelarna tog en linje i en kedja, och åtminstone en av de bästa spela linjer innebär att alla resten av raderna i den kedja som fylls i, av en spelare eller det andra, innan några rader på andra platser är fyllda. Varje uppsättning av kedjan raderna representeras av en enda “pseudo-line”. Den position representation i programmet har bara en bit att säga huruvida eller inte den kedjan har varit helt fylld eller är fortfarande fullständigt tom. Till exempel, här är det läge för problem 12.18 (innan den streckade linjen flyttar):

+     +     +  .  +     +     +
            |  .  |
            |  .  |
            |  .  |
+     +  .  +  .  +     +     +
      |  .  |  .
      |  .  |  ....
      |  .  |
+     +  .  +-----+-----+-----+
      |  .  |
      |  .  |  ..........
      |  .  |  .
+     +  .  +  .  +-----+  .  +
            |           |  .
            |     ....  |  ....
            |        .  |
+     +     +  .  +  .  +-----+
            |  .
            |  ....
            |
+     +     +-----+     +     +

Prickar markerar de kedjor som var och en representeras av ett enda pseudo linje. Av de 60 linjer, 15 fylls i, 30 är tomma, och 15 är inblandade i 6-kedjor. Positioner som kan uppstå från detta utgångsläge är representerade med 36 bitar–30 för tomma rader och 6 för 6-kedjor. Därför är denna ståndpunkt är bara knappt inom de aktuella funktionerna i programmet.

I många av de positioner som härrör från ett visst utgångsläge, första kedjorna kommer att ha blivit en del av längre kedjor. Programmet inte ändra position representation system i denna situation. Pseudo-linjer fortsätter att vara bara den första kedjor. Detta beror på den position representation som används som en “adress” för att komma åt tidigare beräknat poäng.

Samtidigt utvärdera om att flytta in i en första kedja är en bra idé för spelaren på språng, de program som finns tillgängligt på nätet poäng med bästa spela för framtida lådor för spelaren på språng efter hela första kedjan är fylld. Programmet kommer sedan att kolla runt lådorna kedjan för att se vilken spelare som kommer att få den första chansen att ta lådor i kedjan, för att se om spelare som skulle dra nytta av att göra uppoffringar för att undvika att ta med på resande fot efter att kedjan är fylld, och för att kontrollera om kedjan har förlängts eller ens en del av ett kretslopp.

Om den ursprungliga kedjan har ett 3-sidigt fält på vardera sidan, strax utanför kedjan, då spelare i farten kan flytta in i kedjan med en avskiljning och har möjlighet att ta lådor i kedjan. Annars är det den andra spelaren som har den möjligheten i kedjan. Jag ska ringa person med möjlighet att ta rutorna i kedjan, “kedjan spelare”.

Om den ursprungliga kedjan har utökats tillräckligt så att kedjan spelare kan göra ett offer och därefter poäng efter det att kedjan är helt fylld redan återspeglar detta alternativ och kedjan spelare tar alla rutor i den ursprungliga kedjan. Annars, programmet kontrollerar för att se om det finns tillräckligt med utrymme för en uppoffring, förutsatt att det bästa draget i den kedja av spelare ursprungligen på resande fot och tittar på den ursprungliga kedjan och eventuella förlängningar. Om det fortfarande inte tillräckligt med utrymme för en uppoffring, kedjan spelare tar alla lådor. Annars programmet kontrollerar om ett offer är lönsamt och om så utvärderar flytta in i kedjan för den spelare som ursprungligen på väg förutsatt att kedjan-spelare som gör offret.

Senaste Flytta Straff

programmet gör ett straff ska tillämpas för värdering av spelare att göra det sista draget. Om denna påföljd är tillräckligt stor, flyttar valt som bästa kommer att vara desamma som de som valts av nimstring analys. Till exempel, jag har analyserat problem 11.16 påföljder av ökande omfattning. Programmet tillåter inte fraktionerad straff för att de skulle leverera ingen ytterligare information:

  • Om du kör analysen på två olika påföljder betyg för en flytt kan inte ändras mer än plus eller minus skillnaden i straff.
  • För på varandra följande heltal straff, en analys av resultaten i alla jämna heltal poäng och de övriga resultaten i alla udda heltal betyg.
  • Så för på varandra följande heltal påföljder, poängen alltid ändras med +1 eller -1…den högsta möjliga.
  • du kan Därför få betyg för varje relativ straff, genom att interpolera mellan betygen för angränsande heltal påföljder.

Loony Flyttar

Den slutliga versionen av programmet innehåller loony flytta analys. I produktionen, en poäng suffix med v om En spelare måste göra nästa loony flytta eller ^ om spelare B måste. Om ingen spelare måste göra en loony flytta, ingen ändelse används. Under analys, två bitar av det byte som används för att hålla betyg används för att hålla loony tillstånd att flytta. Detta lämnar bara 6 bitar för poäng. Alltså bara poäng från -32 och +31 kan lagras. Detta gör loony flytta analys versionen av programmet opålitliga i styrelser är större än 5 av 6. Därför håller jag en version som inte gör loony flytta analys för användning med större styrelser.

För att hitta loony rör sig i en rimlig mängd av dator tid, gör programmet en galen bonus in närhelst det är möjligt att fånga en låda. Om rutan på andra sidan av linjen att betraktas som har exakt två andra sidor, som redan fyllt i programmet konstateras att motståndarens föregående drag var galen.

Hörnen

William Fraser skrev: “skall du ta hänsyn till det faktum att [ab] och [ba] hänvisar till motsvarande länkar? Alltså (om du sätter de åtta hörn länkar till den slutliga 8 line group) du kan lagra endast 3^4=81-poster i stället för 2^8=256. Detta skulle vara helt oberoende av rotation/reflektion. Det skär diskanvändning med 75% och minnesanvändning med i genomsnitt 75%.”

Jag genomfört detta förslag, som gjort det möjligt att analysera 4×4 spel.

Leave a Reply

Your email address will not be published. Required fields are marked *