新しいチェッカヌの戊術を発芋しようずする詊み、たたは倢想をどうするか

はじめに


スポヌツゲヌム「チェッカヌ」は、コンピュヌタヌがただ完党に蚈算しおいない人類のゲヌムの1぀です。 科孊者がコンピュヌタが決しお倱われない戊略を芋぀けたずいうニュヌスがありたす。 このゲヌムに専念しおいた9幎間で、私は1぀のプログラムにしか出䌚うこずができたせんでした。 おそらく私のスポヌツの経隓から、それが䞊蚘の戊略を実行するプログラムであるず想定するこずが可胜になるでしょう。 驚いたこずに、60 MBしか必芁ずしたせんでした。 それずも、基地によく蚓緎されたニュヌラルネットワヌクがあったのでしょうか それでも、蚈算するこずは䞍可胜だずは信じられたせん。 10 ^ 20のポゞションしかないのですが、私のコンピュヌタヌはそのようなタスクに察凊できたせんか たた、ゲヌムの開始時に、察戊盞手がサヌベルを䞎えお戊術的優䜍に立぀戊術は本圓にありたせんか 私はそのようなデビュヌを芋たこずがありたせん。 確認に行きたす...

組み合わせ問題を解決するためのアルゎリズムの実装


最初の詊みは2幎目の終わりに行われたした。 C蚀語の質の高い研究の埌、C ++を孊ぶのに害はないず思いたした。 この蚀語に関する倚数の講矩を芋た埌、私はいく぀かのプロゞェクトを取り䞊げたいず思いたした。 そしお圌はチェッカヌを取り䞊げた。 倉数を现かく凊理するこずで、ポゞションの合理的な蚈算により倚くの時間を費やすこずができたした。 これらのアクションがグラフを䜿甚したアクションに䟋えるず、このアルゎリズムは幅優先怜玢ず呌ばれる可胜性がありたす。 アルゎリズムの停止は、グラフを完党に通過するこずでした。

ボヌド䞊の状況を説明するオブゞェクトが1぀ありたした。 1぀のオブゞェクトに保存された

class Queue { public: Queue *pnr; /*pointer to next record*/ Queue *ppr; /*pointer to prev record*/ Map *pdb; /*pointer to draught board*/ char *action; /*actions of parents*/ Queue *pp; /*pointer to parent*/ Queue *pfc; /*pointer to first child*/ int nmd; /*Approval of the number of moves to a draw*/ int color; }; 

ここでは幅優先怜玢アルゎリズムが実装されおいるため、デヌタは二重に接続されたシヌトに栌玍できたす。この堎合、pnrおよびpprポむンタヌがこのコレクションを実装したす。

pdb-ボヌドの配眮ぞのポむンタヌ。
action-この䜍眮を達成するために、芪によっお行われた進捗状況に関するデヌタ。 これは、チェッカヌを移動するずきのチェッカヌ「c3 – d4」たたは切断するずきの「c3e5」の移動の通垞の蚘録のように芋えたした。 この倉数は、珟圚の状況をより正確にデバッグするために必芁でした。
pp 、 pfc-芪および最初の子の䜍眮ぞのポむンタヌ。 なぜなら 怜玢アルゎリズムは幅で実装され、二重にリンクされたリストで生成されたすべおの䜍眮は、次々に䞊んで配眮されたした。 したがっお、デヌタをツリヌの圢匏で保存するには、最初の子ぞのポむンタヌず、それ以降のすべおの子が同じ芪を参照するように保存するだけで十分です。 このアルゎリズムにより、芪は子の結果を抜出できたす。぀たり、珟圚の状況を分析し、この動きたたはその動きが子を生じさせた結果のみを調べるこずができたす。
nmd-ゲヌムが匕き分けず芋なされるたでに残っおいる動きの数を瀺す数倀。 たずえば、1人に察しお3人の女性の状況では、ゲヌムを完了するために15の移動のみが割り圓おられたす。 チェッカヌの数が倉わるず、チェッカヌがクむヌンになった埌、この数が再蚈算されたす。
色 -誰の動きは今です。

スタックオヌバヌフロヌを非垞に恐れおおり、関数にポむンタを枡す方が良いず考えたため、オブゞェクトをパラメヌタずしお盎接枡すこずは避けた。 実装は簡単でした。キュヌから芁玠を取り出しお調べ、埌続の䜍眮を生成しおから、キュヌから次の芁玠を取り出しお、ずいうように円で囲みたす。

結果


閲芧61.133アむテム
埅機゚ントリ264.050アむテム
RAM2 GBはそのようなデヌタでのみ終了したした。 このような結果は、短い組み合わせの問題にのみ適しおいたす。
しかし、チェッカヌの䜍眮を操䜜するこの方法により、プログラムの「コア」の䜜業を慎重にデバッグするこずができたした。

「バヌゞョン管理システム」ぞの移行


このアルゎリズムでは、ボヌドに関するデヌタの保存に倚くのメモリが費やされたした。 メモリヌの割り圓おに必芁な各䜍眮。 さらに、珟圚のチェッカヌの配眮をより良くコヌディングする方法に぀いおは思い぀きたせんでした。

 /* info about one checker */ class Checkers { public: chlive live; chstatus status; }; /* info about position a checker */ class PosCheckers { public: chcolor color; Checkers *ptrCheckers; }; /* battlefield */ class Map { public: PosCheckers coordinate[8][8]; }; 

color-チェッカヌカラヌ。 黒、癜、たたは空。
ptrCheckers-このフィヌルドにチェッカヌがない堎合、メモリを割り圓おたせん。
ステヌタス -クむヌンたたはチェッカヌ。
live-チェッカヌは生きおいたす。 このチェッカヌを再床削枛しないためにのみ。

座暙[8] [8]の代わりに、座暙[8] [4]だけを省くこずができるこずを理解しおいたすが、独自のコヌドの理解は非垞に圱響を受けたす。

䞀般に、ポゞションを維持するには倚くのメモリが必芁だったので、ドラフトのポゞションを特定する責任をアクションに割り圓おるこずにしたした-「c3-d4」などのデヌタを含む芪の進捗状況の蚘録。

さお、キュヌから芁玠を取埗するず、最初から始めたす。 私たちはチェッカヌの開始䜍眮を取り、すでに戻っおから、この子䟛を匕き付けた動きを実行したす。 したがっお、ラむンの各芁玠のボヌド䞊のチェッカヌの配眮が構築されたした。


結果


閲芧1.845.265アむテム
キュヌ゚ントリ8.209.054アむテム


「バヌゞョン管理システム」の拒吊。 ディヌプサヌチに行く


残念ながら、幅優先の怜玢には少なくずもいく぀かの重倧な問題がありたした。堎合によっおは、同じパヌティの配眮が䜜成されたした。 そしお、すでに䜜成された倚くのデヌタを持぀パヌティヌを認識するのは時間がかかりたした。 たた、メモリ䞍足になったずきの察凊方法も明確ではありたせんでした。 むデオロギヌの連鎖を埩元するには、保存されたすべおのデヌタが必芁でした。そのため、必芁に応じお、どこかからメモリを「すくい取り」、結局はそうなりたせんでした。

「詳现な」怜玢により、ロヌカル問題組み合わせ問題の解決策からグロヌバル問題バッチ党䜓の誀蚈算に移行するこずができたした。 このアルゎリズムは、チェッカヌの珟圚の配眮を考慮し、子孫を生成し、それらから最初のチェッカヌを遞択し、それを珟圚のチェッカヌの圹割に割り圓おたす。 子孫がない堎合、この䜍眮で負けたこずを瀺し、芪ずの次の取り決めを怜蚎したす。

たた、女性の存圚䞋で繰り返し䜍眮を蚈算しないために、すべおの芪の䜍眮を調べるこずにしたした。 ある堎合、私はそれを考慮したせんが、次ぞ進みたす。

結果が知られおいる星座からgreat孫の蚘憶を取り陀くこずが決定されたした。 したがっお、オヌバヌフロヌを回避するこずができたした。 最も深い芁玠を怜玢するずきにオヌバヌフロヌが発生しない堎合。

たた、䜍眮を保存する新しい方法を远加するこずも決定されたした-圢状のリスト

 class ListCheckers { public: ListCheckers *pnr; chcolor color; chstatus status; int x,y; /* coordinate */ }; 

それにより、ログハりスの可胜性をより迅速に芋぀け始め、移動の可胜性をチェックするチェッカヌを敎理したした。 これで、キュヌに栌玍された「䜍眮」オブゞェクトには次のフィヌルドがありたした。

 class Queue { public: ListCheckers *plch; /*pointer to list of checkers*/ ListChilds *pcs; /*pointer to list of childs*/ chcolor color; int draw; chresult result; }; 

freeコマンドが100の空きメモリを保蚌しないずは思っおいたせんでした 。 デバッグ䞭に、freeコマンドを実行した埌、メモリがたったく解攟されないこずが刀明したした。 フォヌラムの暗闇のどこかで、freeはOSにメモリの解攟に関する指瀺のみを䞎え、OSだけがメモリを解攟するかどうかを決定するこずがわかりたした。 䞀般的に、私のOSは「貪欲」だったため、別の方法でメモリを操䜜する必芁がありたした。 最初の「子䟛」のチェヌンを維持するために、必芁に応じおメモリを割り圓おたした。 そしお、衚瀺した「最初の」子を削陀する代わりに、それに関するデヌタは次の子に関するデヌタで䞊曞きされたした。

このために、メモリを䜿甚した動的な䜜業を担圓する芁玠が開発されたした。

 class MainQueue { public: MainQueue* parent; /*pointer to parent's record*/ MainQueue* next_record; /*pointer to child's record*/ Queue* now; /*pointer to record on data with position*/ int draw; }; 


結果


1日の連続操䜜の堎合
2.040.963ロットが䜜成されたした
1.241.938ゲヌムが閲芧されたした
ランダムアクセスメモリ䞊の占有堎所1.378 MB


ファむルを操䜜する


残念ながら、次の芁玠をこのように遞択するず、同じ䜍眮で長い間「ハング」しおしたいたす。 特に女性のための誀算で。 そのため、すでに衚瀺された䜍眮の結果が保存されるデヌタベヌスを実装したかったのです。 そのため、各バッチに関するデヌタを保存するこずにしたした。

メモリの問題から離れお、私は再びそれに遭遇したした。 RAMが䞍足しおいたため、倖郚メディアを䜿甚するこずにしたした。 index.txtおよびqueue.txtファむルに曞き蟌んだすべおのポゞション。 queue.txtに、各バッチに関するデヌタを保存したした。 たた、index.txt内-バッチ識別子ずqueue.txt内のこのバッチに関する情報の堎所、぀たりオフセット。 デヌタを圧瞮したかったのですが、読みやすいたたにしおおきたした。 ただフィニッシュラむンたで遠いず思ったからです。 したがっお、次の圢匏でデヌタを保存したした。

 queue.txt : aaaaeaaaaacaaaaa aaaaeaaaaaakaaaa 50 U Aaaaaaeaaacaaaaa Aaaaaaauaacaaaaa 49 U aaaaaaeakaaaaaaa aaaaaaeacaaaaaaa 48 W Aaaaaaaaaauaaaaa 47 L 
 index.txt : Aaaaeaaaaaaacaaa000000000000000000000 aaaaeaaaaacaaaaa000000000000000000040 aaaaeaaaaaakaaaa--------------------- Aaaaaaeaaacaaaaa000000000000000000080 Aaaaaaauaacaaaaa000000000000000000178 
 

ボヌド䞊では、ゲヌムセルは5぀の状態を取るこずができたす。癜/黒のチェッカヌ、癜/黒のクむヌン、たたは空です。 したがっお、2぀のセルにはさたざたな組み合わせで25の状態がありたす。 ラテンアルファベットには26文字があり、1぀の文字で2぀のゲヌムセルの状態を䞀床に蚘述するのに非垞に適しおいるこずに泚意しおください。 これは、32個のゲヌムセルを備えたボヌド党䜓を16文字のラテンアルファベットで蚘述できるこずを意味したす。 たた、この䜍眮で誰の動きを保存する必芁がありたす。 次に、最初の文字が倧文字の堎合、移動は黒になりたす。 たた、珟圚のラむンナップからポゞションドロヌを受け入れるたでの移動回数を芚えおおく必芁がありたす。 たた、結果W-win、L-lose、D-draw、U-unknown。 たた、デバッグはそれほど難しくありたせん。

結果


2時間、プログラムは4 MBのRAMしか必芁ずしたせんでしたが、数少ないパヌティをカりントしたした。 queue.txtには2918の゚ントリがあり、401 KBでした。 index.txtファむルには6095レコヌドが含たれおおり、重量は232 KBでした。 そのようなペヌスでは、蚈算できるのは5億= 5 * 10 ^ 8ポゞションだけであり、私の1TBドラむブは十分なメモリがないず報告したした。 はい、これは非垞にすぐに起こりたす。 蚈算された䜍眮は、ゲヌム党䜓に匱い圱響を及がしたす。

デヌタ圧瞮


プロゞェクトを促進するためのオプションは3぀しかありたせん。

  1. 5 ^ 32-数字のさたざたな配眮、
    2 * 5 ^ 32-その動きを䞎えられた
    2 *2 * 5 ^ 32-占有スペヌスの最倧量は〜9.32 * 10 ^ 22ビットです 。ただし、各配眮で結果が2ビットに等しいこずを瀺すのに十分です。
    さらに、通垞のバッチには5 * 10 ^ 20の異なる䜍眮がありたす。
    したがっお、玄2 *2 * 5 * 10 ^ 20= 2 * 10 ^ 21ビットは情報提䟛であり、残りの〜9,12 * 10 ^ 21は、このパヌティでのドラフトのそのような配眮が存圚しないこずを瀺したす。

    1TB = 8 * 10 ^ 12ビットが利甚可胜
    高速デヌタむンデックスを維持しながら、このタスクの圧瞮アルゎリズムを開発する必芁がありたす。

  2. 通垞のバッチでは、5 * 10 ^ 20の異なるポゞションがありたす。
    迅速なむンデックス䜜成のために、その「子䟛」の各䜍眮ず結果を保存したす。 平均しお、ポゞションには玄Yの子孫がありたす。

    子孫ぞの「リンク」をXビットで゚ンコヌドしたす。結果は2ビットで、Zの゚ントリ間のセパレヌタヌです。各䜍眮に察しおX * Y + 2 + Zビットを取埗したす。 合蚈X * Y + 2 + Z* 5 * 10 ^ 20ビットは 、初期配眮で䜿甚されるすべおの䜍眮のストレヌゞに割り圓おられる必芁がありたす。

    1TB = 8 * 10 ^ 12ビットが利甚可胜
    高速デヌタむンデックスを維持しながら、このタスクの圧瞮アルゎリズムを開発する必芁がありたす。

  3. レコヌド内の繰り返しパタヌンを芋぀けお、リプレむをより短いレコヌドに眮き換えお実装しおみたしょう。 アルゎリズムは理想的にはハフマンコヌドに䌌おいたす。

    それほど高速ではないむンデックス䜜成に悪圱響を及がしたす。

合蚈で、デヌタを≈10^ 22から10 ^ 13ビットに圧瞮する必芁がありたす。 そのため、デヌタを99.9999999914163だけ圧瞮できるアルゎリズムを蚘述する必芁がありたした。 さらに、高速なむンデックス䜜成を維持する必芁があるこずをただ考慮せずに、どのアルゎリズムでもこれが可胜であるずは思いたせん。

結果


すべおの関係者に関するデヌタを保存するこずはたったく適甚されたせん。

ランダムアクセスメモリでのみプロゞェクトの䜜業に戻りたす。 「プロセッサヌ」の䜜成


RAMのファむルに保存されたデヌタを保存するのが慣䟋でした。 これを行うために、デヌタストレヌゞ構造を倉曎するこずが決定されたした。

 class list_strings { public: list_strings* next; char* data; list_strings() { data = new char[17]; data[0] = '\0'; next = nullptr; } }; class Queue { public: ListCheckers *plch; /*pointer to list of checkers*/ list_strings *pcs; /*list of data of childs*/ chcolor color; chresult result; int to_draw; } 

たた、Queueオブゞェクトを栌玍する原則が倉曎されたした。 MainQueueが曞き換えられた埌、MainQueueが指すQueueオブゞェクトも曞き換えられたす。

「子䟛」を保存するための「pcs」フィヌルドは、「Aaaaaaaaacaaaaa」などのデヌタを含む単䞀リンクリストずしお実装され、必芁に応じお拡匵されたす。 割り圓おられたメモリを繰り返し䜿甚するため䞊​​曞き時、デヌタフィヌルドは '\ 0'-れロに等しくなり、フィヌルドに重芁な情報が含たれおいないこずを瀺したした。 なぜなら 「オブゞェクト」が倉曎されたした。

結果


最倧䜿甚可胜メモリ領域844 KB。 7時間実行するず、8.865.798.818の䜍眮を衚瀺できたした。 ただし、ポゞションは繰り返すこずができたす。 これらの結果は、蚱容可胜なリヌドタむムで圓事者の完党な蚈算を達成するには䞍十分です。

これで、䜍眮をグラむンドする「プロセッサ」があり、844 KBのRAMだけが必芁であるず蚀えたす。぀たり、残りのメモリを有効に䜿甚できたす。たずえば、既に蚈算された䜍眮を蚈算しないように「キャッシュメモリ」を実装したす。

「キャッシュ」を䜜成する


メモリからデヌタを最速で取埗するために、RAMの最倧スペヌスを埋めるハッシュテヌブルが遞択されたした。 ハッシュ関数ずしお、md5アルゎリズムの最埌の番号が遞択され、その入力にぱンコヌドされた蚘述䜍眮が䞎えられたした。 ぀たり、md5 0237d0d0b76bcb8872ecc05a455e5dcfの䜍眮「Aaauaueaaacckaaa」は、f * 2 ^ 12 + c * 2 ^ 8 + d * 2 ^ 4 + 5 = 15 * 4096 + 12 * 256 + 13 * 16 + 5 = 64725に栌玍されたす。

ハッシュテヌブル内のレコヌドのストレヌゞの単䜍はセルでした。 このアプロヌチにより、「叀い」セルからデヌタを削陀し、そのスペヌスを再利甚できたす。 廃止は、リングバッファを䜿甚しお実装されたす。


最初のアドレスでは、セルNo.1ずNo.5がキャッシュに、2番目のNo.3 ...に、そしおリングバッファには、セルが時系列に栌玍されたす。 最倧5個のセルを保存できる堎合、1番目のセルは珟圚の堎所から「匕き出され」、6番目のセルの堎所に配眮されたす。 たた、最初のアドレスのキャッシュメモリには、セル番号5のみが保存されたす。

 class mem_cel { public: mem_cel* pnhc; /* pointer to next in hash collection */ mem_cel* pphc; /* pointer to prev in hash collection */ mem_cel* pnrb; /* pointer to next "mem_cel" record in ring buffer */ mem_cel* pprb; /* pointer to prev "mem_cel" record in ring buffer */ chresult result; int draw; stringMap condition; }; 

条件フィヌルドは、チェッカヌの望たしい配眮を識別するために必芁です。これは、同じキャッシュアドレスに異なる配眮を栌玍できるためです。

ドロヌフィヌルドは、マッチリク゚ストを識別するために必芁です。 メモリに3぀の移動のみが割り圓おられた䜍眮のドロヌが含たれおいる堎合、さらに移動がある堎合は、勝ち負けのいずれかが可胜です。

結果


1時間実行するず、10,400.590のポゞションを衚瀺できたした。 この誀算を高速化するために䜕かを実装する必芁がありたす。 しかし、蚈算するず、私のコンピュヌタヌはせいぜい10 ^ 20 / 10.400.590 = 9.6 * 10 ^ 12時間= 4 * 10 ^ 11日以内に10 ^ 20の䜍眮を蚈算したす。

どのコヌドが「狭い銖」であるかを芋おみたしょう。 この目的のために、OProfileプロファむラヌを䜿甚したした。



1。
 Queue::operator!=(Queue) 

キュヌ芁玠の違いを確認したす。 新しいアむテムがキュヌに远加されたずきに呌び出され、3぀の䜍眮を確認したす。 チェックは、珟圚の䜍眮に぀ながったすべおの芁玠で実行されたす。

最適化ボヌド䞊のピヌスの数たたはステヌタスを倉曎する堎合は、マヌクしおください。 異なる圢状のセットを持぀䜍眮を䜿甚するには、チェックしないでください。

2。
 code_string(PosCheckers*) 

垂束暡様のアむテム芁玠を文字に倉換するために䜿甚されたす。 Board_to_StringMap *、char *、chcolorに必芁です。

最適化最初に、Board_to_String関数の呌び出し回数を枛らしたすMap *、char *、chcolor

3。
 String_to_Lcheckers(stringMap, ListCheckers**, chcolor*) 

4。
 Board_to_String(Map*, char*, chcolor) 

頻繁に呌び出されたす。 そのため、それらぞの呌び出しの数を枛らす必芁がありたす。
テキストをチェッカヌデヌタのコレクションに倉換するには、String_to_Lcheckersが必芁です。
Board_to_Stringは、䜍眮をOPに保存できるテキストに倉換するために必芁です。

最適化ボヌド䞊の同じ䜍眮を衚すために3぀のデヌタ構造を操䜜する必芁があるため

Lcheckers-フィヌルド䞊のチェッカヌのリスト。 移動の可胜性を確認するためにチェッカヌをすばやく遞択する必芁がありたした。 マップたたは「ボヌド」-配列[8] [8]。 それは力の完党なバランスが含たれおいたす。
stringMapたたは「String」-デヌタを保存するための文字列。 したがっお、あるデヌタ衚珟から別のデヌタ衚珟ぞの倉換の数を枛らすか、デヌタ構造の数を枛らすようにする必芁がありたす。

マゞカルビットボヌド


思いがけず、私はhabrahabrの解決策を芋぀けたした。 魔法のビットボヌドずロシアのチェッカヌです。 この蚘事の著者は、4぀の32ビットワヌドを䜿甚しおボヌドに関する情報を゚ンコヌドするこずを提案しおいたす。

蚀葉

1癜のすべおの数字の䜍眮
2黒のすべおの図の䜍眮
3癜いチェッカヌの䜍眮
4黒色のチェッカヌの䜍眮

さらに、図の䜍眮には次のように番号が付けられおいたす。


さお、少なくずも1぀のチェッカヌを備えたログハりスの可胜性を芋぀けるには、すべおのチェッカヌの䜍眮を察応する方向に移動するだけで十分です。

 bitboard_t try_left_up = ((((checkers & possible_left_up) << 1) & enemy) << 1) & empty; 

これにより、ログハりスずしおの機䌚の怜玢が簡単になりたす。 残念なこずに、私はこの蚘事の著者、圌がどのように女性ず仕事をするこずを決めたかを理解しおいたせんでした。 珟時点では私には矎しいものがありたせん。もちろん、将来的に修正する必芁がありたす。

したがっお、䞊蚘の3぀のデヌタ構造を1぀に眮き換えるこずができたす。

 typedef uint32_t bitboard_t; bitboard_t bbMap[4]; 

たた、この倉曎により、md5を䜿甚せずにハッシュテヌブル内の番号を怜玢できるようになりたした。 この䜿呜は次の匏を委ねられたした。

 #define HASH_NUM 0xFFFFFF hash_num = ((bbMap[0] ^ ~bbMap[1]) ^ ReverseBits(~bbMap[2] ^ bbMap[3])) & HASH_NUM; 

ReverseBitsが少し反転しおいるずころ。 䟋番号0x80E0があり、0x0701になりたした。

結果


1時間実行するず、15.140.000のポゞションを衚瀺できたした。これは間違いなく優れおいたす。 しかし、これはただ完党な誀算には十分ではありたせん。
修正されたバグ
以前は、1時間あたり754,000,000のポゞションを瀺しおいたした。 コヌドの恥ずべき誀怍...


プロゞェクトアルゎリズムが実装されたず思いたす。 したがっお、機胜の高速化に集䞭できたす。

機胜加速


ありそうな/ありそうにないものを読んだので、コヌドの「加速」を確認するこずにしたした。 䞀般に、ifステヌトメントの実行䞭にプロセッサがどの呜什をロヌドする必芁があるかを瀺したす。 その埌、たたは埌のいずれか。 たずえば、呜什の遞択が倱敗した堎合、プロセッサはアむドル状態になり、その埌に指瀺される呜什を埅機したす。 MSコンパむラヌでは、このような呜什は__assumeず呌ばれたす。

このように各ifを実装したら、テストするこずにしたした

 __assume(selected == nullptr); if (selected != nullptr) { return selected; } 

結果


驚いたこずに、コヌドは本圓に加速したした。 最初の1時間で、16.750.000のポゞションが蚈算されたした。

アセンブラヌの挿入を実装するこずを敢えおしたせんでした。 私のコヌドはすぐに読めなくなり、これは私にずっお重芁な偎面です。 プロゞェクトの䞭断以来、私は時々数ヶ月に達したした。

蚈算された動きの深さを制限する


残念ながら、これはそう呌ばれる可胜性がありたす。時間が経぀に぀れお、すべおの䜍眮を蚈算するこずはただ䞍可胜であるこずに本圓に気付きたした。 したがっお、結果の機胜を備えた移動リミッタヌを远加したした。
チェッカヌ= +1ポむント、女性= +3ポむント。 このアプロヌチは完党に真実ではないこずを理解しおいたすが、ほずんどの堎合、有効な倀を提䟛したす。 したがっお、私はこれにこだわるこずにしたした。

結果


始めたずころに戻りたした。 蚈算された動きの数に制限があるため、私のプログラムは珟圚、組み合わせの問題を解決するためのプログラムです。 しかし、これは恐ろしいこずではなく、リミッタヌは削陀できたす。

党䜓的な結果


最初の1時間で、玄1,700䞇のポゞションが蚈算されたす。
次に䜕をする 明確ではありたせん。CUDAを䜿甚しお蚈算を䞊列化できたす...しかし、これを䜿甚するず、1台のコンピュヌタヌで各プレむダヌの少なくずも50の動きを蚈算できるずは思いたせん。あなたが敎理しなければならない䜍眮の数を知るために...

あなたはアルゎリズムを倉曎する必芁がありたす...どのようにアむデアはありたせん...広告されたニュヌラルネットワヌクを䜿甚できたすかニュヌラルネットワヌクは、ゲヌムの開始時にチェッカヌの損倱を評䟡するずは思わない。

これたで、より高速なコンピュヌタヌの倖芳/コスト削枛の来るべき時期を埅ちたす。おそらく、コヌドアクセラレヌションのより高床な技術が既に登堎するでしょう。そしお、ニュヌラルネットワヌクを勉匷する間、間違っおいるのかもしれたせん。圌らは蚈算アルゎリズムの先頭に立぀でしょう...埅っお、芋おください。

䞀郚のデヌタ
最倧レンダリング深床-衚瀺されたアむテムの数
1-7
2から56は、我々は...最初の移動の癜はその埌、それらのそれぞれブラックりォッチのための7点の新しい䜍眮を生成する蚈算するには、さらにホワむトの第二の移動を行う必芁がないこずを確認しおください7 + 7 * 7 ...䜜る
3 - 267
4から1017
5 - 3570 6-11
460 7-34
455
8-95 921
9-265 026
10-699 718
11-1 793 576 12-4
352 835
13-10 571 175

Source: https://habr.com/ru/post/J318210/


All Articles