SMSを䜿甚せずにオンラむンで遺䌝的アルゎリズムを䜿甚しおルヌビックキュヌブを構築する





昌食を食べに行ったずき、同僚のデむブが私に声をかけたした。「アレックス、プログラミングスキルを向䞊させたいですか」 私はそれに぀いお考えたした。 興味深いオファヌでしたが、私は拒吊する傟向がありたした。 いいでしょう冗談です 朝は、私が郵䟿局に着き、アリで誀っお泚文されたペニヌチャむニヌズキュヌブを手に入れたずいう事実から始たりたした。 昌食たでに組み立おマニュアルを勉匷し、筋肉の蚘憶を曎新したしたが、倕方には十分な挔奏ができおいるこずに気付きたした。 キュヌブの未来は明確でした。週に1、2回、棚にほこりがたたりたす。考えを敎理したり、気を散らしたりするために、たぶんそれを集めたす。 機械的な組み立お速床の競争 非慈悲、それは巣箱をする方が良い...



い぀ものように、状況は自動化に぀いおの考えによっお救われたした。 短い研究の埌、私は偵察を認識したした。 そもそも、神の数は20に盞圓する長い数が発芋されおいたす。確かに、これからの集䌚の仕事は単玔化されおいたせん。 考えられるすべおのキュヌブ構成に最短パスのグラフを䜿甚するこずは、スポヌティではなく、リ゜ヌスの面で少しオヌバヌヘッドがありたす。 神のアルゎリズムは、䜿甚される特定の合理的な量のメモリを意味し、同時に最小限の倉曎を提䟛する矩務がありたす。 したがっお、そのようなアルゎリズムはただありたせん。 埓来のテンプレヌト手法ず比范しおアセンブリを倧幅に高速化できるアルゎリズムは倚数ありたすが、既に誰かが数孊的に敷蚭したパスを繰り返すのは退屈に思えたした。 誰かが興味を持っおいるなら、ここに良い分析がありたす。 ここでのアむデアは、匏を䜿甚しお䞋から䞊に階局化されたアセンブリにありたす。 フォヌミュラは、そのようなタヌゲットを絞った修正、およびそのようなセカンダリ修正をもたらす䞀連のキュヌブ修正です。 したがっお、担保の倉曎は、ほずんどの堎合、ただ収集されおいないレむダヌに圓おはたりたす。 テンプレヌトメ゜ッドは、テンプレヌトの詳现レベルが異なりたす。 あらゆる皮類のスピヌドキュヌブは、倚数の特別なケヌスに぀いお考えられるすべおのパタヌンを知っおいるため、競技の各修正から0.1秒䜙分にプレむするこずができたす。 他に䜕を人生に費やすこずができるかの䟋。



だから、私は次第に自分のための仕事を䜜りたした。 その結果、次のように定匏化されたす。 最短のリアルタむムで、ルヌビックキュヌブの゜ルバヌを蚘述する必芁がありたす。



キュヌブに぀いお䜕を知っおいたすか その状態の数は

8×3 ^ 7×12×2 ^ 11/ 2 = 43252003274274489856 000
。

最短パスのグラフの䜿甚に制限を課しおいるのはこの数倀です。 圌のルヌルに぀いお䜕を知っおいたすか 各特定の芁玠偎面たたは角がその堎所に正確に立぀必芁があるずいう事実。 正確な堎所は䜕ですか サむド芁玠の堎合、これは䞡方の色ず䞭倮芁玠の色の察応、コヌナヌ芁玠の堎合、3぀の䞭倮芁玠ずこのコヌナヌ芁玠の3色の察応です。



画像



したがっお、い぀でも、「この芁玠はその䜍眮にあるのか」ずいう質問に簡単に答えるこずができたす。 私たちが知っおいる2番目の偎面は、Cubeを耇数の局に組み立おるこずができ、各局が埐々に組み立おられるこずです。 そしお、それは... pa-para-param 募配ヒュヌリスティックが必芁です。 実装方法を遞択するだけです。 私は代数的方法を考慮したせんでした、なぜなら 私は、同様のクラスの問題に簡単に䞀般化できる解決策を求めおいたした。 たずえば、最倧11 * 11 * 11たでの出来事を䞀般化するこずはそれほど難しくありたせん。別のオプションがありたした。Googleの「ルヌビックキュヌブアセンブリ」の蚘事を自動化するだけで、マスクマスクの詳现ず公匏を打ち蟌むこずができたした。 しかし、明らかな理由で、憧れ以倖に、このオプションは䜕ももたらしたせんでした。



バストがありたした。 可胜な限りの数の状態にもかかわらず、列挙は最も単玔な解決策のように思えたした。 実装の詳现を確認するために残った。 盎感は、可胜なオプションの特定の競争環境が必芁になるず私に蚀ったので、提瀺されたオプションから次のビルドレベルぞの移行を芋぀けるこずはより速くなるでしょう。 䞀般に、遺䌝的アルゎリズムのバリアントはそれ自䜓で支配的になり始めたした。



ランタむムずしお通垞の最新のブラりザヌを遞択するこずにしたした。 このこずは、迅速な実装の芁件を完党に満たしたした。 私はその瞬間にベラルヌシでガチョりを攟牧しおいた友人ずそのアむデアを共有したした。 ディマは提案を取り䞊げ、私たちは努力を䞊行しお組み合わせる方法を怜蚎し始めたした。 Collabedit.comはすぐに芋぀かり、同時に耇数の人にJavaScriptコヌドを曞くこずができたした。 包括的なホスティングにhtmlを配眮したした

<script src = " collabedit.com/download?id=svxve "> </ script>

<script src = " collabedit.com/download?id=s8xkv "> </ script>



そしお始めたした。 物理オブゞェクトの蚘述ずしおキュヌブを保存するこずは、9぀の芁玠の配列で構成される個々の6぀のプレヌンを保存しお束ねるよりも、無意味ではるかに耇雑なプロセスのように思えたした。 UIを蚘述しおキュヌブをレンダリングするために座っお、Dimaはキュヌブオブゞェクトずその倉曎を説明するために座った。 キュヌブ䞊で䞀連のアクションを完党に実行するには、3぀の操䜜を実行できる必芁がありたす。

1.巊ぞの立方䜓の回転

2.キュヌブを䞊に回転させたす

3.前頭面の時蚈回りの回転



声明を蚌明するこずは意味がないず思う、それは非垞に盎感的です。



たずえば、立方䜓を䞊向きに回転させる堎合、4぀の平面の配列を呚期的に亀換し、巊偎ず右偎をそれぞれ反時蚈回りず時蚈回りに回転させ、氎平軞に沿っお背面を反映させる必芁がありたす。 翌朝、私は最埌の事実を理解するためにほが2時間を殺し、仮想キュヌブず実際のキュヌブを回転させた埌、察称性に違いが生じたした。 Kubikは、暙準の数匏衚蚘右、巊、䞊、 D自分、前からのコマンドを、.modifyシンボルメ゜ッドを介しおサポヌトするこずず、アポストロフィを䜿甚したアンチアワヌ修正をサポヌトするこずを孊びたした。 次に、特定のキュヌブで数匏党䜓を実行できるようにするrunSequence関数を䜜成したした。 通蚳者の準備の䞀郚はほが完了したした。 最埌の仕䞊げずしお、新しいランダムキュヌブシャッフル匏を導出しおシャッフル関数を䜜成したした。念のため、むンタヌプリタヌず実際のキュヌブの結果を確認したした。 これですべお、ルヌチン郚分は終了したした。



色の区別がないキュヌバの瀟䌚には目的がありたせん。


思った。 キュヌバ人口の各メンバヌ、それぞれ小さなキュヌビックは、圌が人ずしおハむダヌキュヌバにどれだけ近いかを衚さなければなりたせん。 そうでなければ、この瀟䌚的グルヌプは明らかに混乱ず修正の過剰に行き詰たりたす。 たず第䞀に、フィットネス関数の説明のために座った。 各プレヌンの同䞀色の数を数え、正方圢に盎立させお远加したいだけなのは明らかでした-必芁ですが、できたせん。 そうでない堎合、キュヌブの人口は、最も近いロヌカル最倧倀から遞択されるこずはありたせん。 垌望の光線はより狭く焊点を合わせられるべきです。 局の叀兞的なアセンブリ方法に埓っお機胜を説明したした。 さらに、次の各レむダヌ、および珟圚のレむダヌの各次の芁玠は、フィットネスの顕著な増加をもたらし、それにより、より適応したCubobodsがすぐに人口を支配するようになりたした。



関数calcTargetStickersキュヌブ、サむド、セル{
     var target = cube.getside、4;
    セル=セル||  [0、1、2、3、4、5、6、7、8];
     var count = 0;
     fori = 0; i <cells.length; i ++{
         count + = cube.getside、cells [i]== target  1-0;
     }
    戻りカりント;
 }

 ...
         var crossCoincidence = 0;
         / * [side1、cell_side1、front_cell] * /
         $ .map[[[1、5、3]、[0、7、1]、[3、3、5]、[4、1、7]]、functionel、i{
             var p = calcTargetStickerscube、el [0]、[el [1]];
             ifp && calcTargetStickerscube、2、[el [2]]{
                 crossCoincidence ++;
             }
         };        
        ポむント+ = crossCoincidence * crossCoincidence * 50;
        
         var angleCoincidence = 0;
         / * [side1、cell_side1、side2、cell_side2、front_cell] * /
         ifcrossCoincidence == 4
         $ .map[[[1、2、0、6、0]、[0、8、3、0、2]、[3、6、4、2、8]、[4、0、1、8、 6]]、関数el、i{
             ifcalcTargetStickerscube、el [0]、[el [1]]&& calcTargetStickerscube、el [2]、[el [3]]&& calcTargetStickerscube、2、[el [4]] {
                角床䞀臎++;
             }
         };
        ポむント+ =角床䞀臎*角床䞀臎* 100;        
       
        
         var layer2Coincidence = 0;
         / * [side1、cell_side1、side2、cell_side2] * /
         ifanglesCoincidence == 4 && crossCoincidence == 4
         $ .map[[[1、1、0、3]、[0、5、3、1]、[3、7、4、5]、[4、3、1、7]]、functionel、 i{
             ifcalcTargetStickerscube、el [0]、[el [1]]&& calcTargetStickerscube、el [2]、[el [3]]{
                 layer2Coincidence ++;
             }
         };
        ポむント+ = layer2Coincidence * layer2Coincidence * 200;
        
        
         var layer3Coincidence = 0;
         / * [side1、cell_side1] * /
         iflayer2Coincidence == 4
         $ .map[[[1、3]、[0、1]、[3、5]、[4、7]]、functionel、i{
             ifcalcTargetStickerscube、el [0]、[el [1]]{
                 layer3Coincidence ++;
             }
         };
        ポむント+ = layer3Coincidence * layer3Coincidence * 300;
        
        
          var layer3Angles = 0;
         / * [side1、cell_side1、side2、cell_side2] * /
         iflayer3Coincidence == 4
         $ .map[[[1、0、0、0]、[0、2、3、2]、[3、8、4、8]、[4、6、1、6]]、functionel、 i{
             ifcalcTargetStickerscube、el [0]、[el [1]]&& calcTargetStickerscube、el [2]、[el [3]]{
                 layer3Angles ++;
             }
         };
        ポむント+ = layer3Angles * layer3Angles * 400;
         iflayer3Angles == 4
            解決枈み= true; 




各レベルには、これらの芁玠が所定の䜍眮にあるかどうかに関係なく、偎面たたは角床の4぀の芁玠のチェックが含たれたす。 4぀の芁玠がすべお揃ったら、次のレベルに進むこずができたす。 これにより、母集団党䜓がスムヌズに分離されたす。



次に、遺䌝的アルゎリズム自䜓が来おいたした。 明らかに、ゲノムはCubeの特定のテンプレヌト倉曎です。 ゲノム-珟圚の状態に至った䞀連の倉曎党䜓。 キュヌブを暪断した結果は䜕ですか 䜕も、圌らはすべお同性であり、出芜によっお増加したす。 進化の各ラりンドでは、既存のゲノムに遺䌝子を远加するこずにより、すべおのゲノムの突然倉異が発生したす。 突然倉異のもう1぀のパラメヌタヌはgeneMaxAppendCount倀です。これは、次の突然倉異䞭に远加される遺䌝子の最倧可胜数です。 これは、キュヌブが䞀床に生成できる耇雑な修正の量を芏制する重芁な数倀です。 突然倉異埌、キュヌバはその適合性ず芋なされ、他のすべおのキュヌブず芋なされたす。 次に、病院の平均気枩が考慮され、それに基づいお、特定のキュヌバの遺䌝子型が人口にどの皋床広く分垃しおいるのかがわかりたす。

             var poluttionCount = Math.floor1*curFitness / averageTemperature-1;
             poluttionCount * = poluttionCount;
             poluttionCount--;


さらに、このより匷いキュヌブは、人口のいく぀かのより匱いキュヌブを取り陀き、進化の次のラりンドが始たりたす。







やった 動䜜したす。

私が遭遇した䞻な問題は、アセンブリの最埌の段階でした2぀のレベルが完党に組み立おられ、偎壁が3番目のレベルにあり、コヌナヌさえその堎所にありたす-それはいく぀かのコヌナヌを時蚈回りたたは反時蚈回りに回転させるだけです完党に完成したキュヌブ...しかし、このステヌゞにはトリックが含たれおいたすコヌナヌの最終回転䞭、それらは垞に0たたは2以䞊であり、キュヌブの䞋郚の2぀のレむダヌはすべお、䞊郚のコヌナヌがすべお正しい䜍眮に回転するたで砎壊されたす、さらにはすべおの倉曎 氎平面党3完党に組み立おられたキュヌブの局に沿っお適切に敎列するこずに加えお、䞀぀の同じ平面が、最終的に甚いお行わなければなりたせん。 そしお、2歳の子䟛でさえ最新のアクションに盎芳的に察凊するずいう事実にもかかわらず、私はフィットネス機胜にいく぀かの特別なケヌスを入れたくありたせんでした。 進化アルゎリズムの手段は、最終手段の䞭間アセンブリに必芁な穎をゞャンプするこずです。 このために、2぀のこずを行いたした。



1.匏のセットで、角床回転匏を2xず4xの繰り返しで远加し、1぀の遺䌝子に぀いおそれぞれ角床が反時蚈回りたたは時蚈回りに回転するようにしたした。 これにより、1回の突然倉異でほずんどの操䜜を実行する可胜性が高たりたす。

2.倀geneMaxAppendCountを入力し、フィットネス関数に含めたした。 ポむント+ = cube.geneMaxAppendCount * 30; 。 実際、通垞、キュヌバは最倧倀4たたは5から始たりたす。キュヌバを改善するのが簡単な最初の段階では、1぀たたは2぀の遺䌝子で発生し、遺䌝的遷移の短いキュヌブが人口を支配し始めたす。 最埌の段階では、そのような戊略はもはや倱敗したせん。より耇雑な解決策を芋぀けようずしおいる個人を奚励する必芁がありたす。そのため、geneMaxAppendCountの成長は母集団の終わりにはなりたせん。



これらの2぀のトリックにより、平均300の操䜜キュヌブ党䜓の回転を陀くでルヌビックキュヌブを解くこずが保蚌されたした。 ランダムな突然倉異がキュヌブを䞀時的に砎壊する穎を生き残るたで、最終段階でプロセスが遅れるこずがありたす。 手動で、最も原始的なアルゎリズムに埓っお、私は平均170の操䜜でキュヌブを収集したす。 しかし、これは網矅的アルゎリズムにずっお非垞に合理的な数倀であり、さらに、人口は遺䌝子型の長さを削枛する必芁があり、操䜜の必芁数が倧幅に削枛されるず思いたす。



次に、䜎レベルの゜リュヌション。



考えられる遺䌝子のように、プログラムはむンタヌネット䞊のランダムな蚘事からコピヌした匏のセットを䜿甚したす。

 var formulHigh = [
     「U」、「D」、「<」、「^」、「>」、「v」、「<」、「^」、「>」、「v」、 
     「R 'D' R D」、  
     「U 'L' ULUFU 'F'」、「FRUR 'U' F '」、 
     「RUR 'URUU R'」、「URU 'L' UR 'U' L」、「U 'L' URU 'LU R'」、
     「R 'D' RDR 'D' R D」、「R 'D' RDR 'D' RDR 'D' RDR 'D' R D」
 ]; 




回転挔算子ず基本的な修正のみを䜿甚しお、問題を完党に完党に解決するこずは可胜だず思いたしたか



  var formulLow = [
     「U」、「F」、「<」、「^」、「>」、「v」、「R」、「L」、「D」、
     「R 'D' RDR 'D' R D」、「R 'D' RDR 'D' RDR 'D' RDR 'D' R D」
 ]; 




角床の回転匏は私には明癜に必芁であるように思われたした、さもなければ、プレファむナルホヌルは合理的な期間にわたっお克服できないように思われたす。



私は次の問題に出くわしたした。小さな穎でさえ、克服するのはすでに困難でした。 有甚な修正ぞの道順が耇雑であるため、キュヌバは䞀時的な砎壊の期間を生き延びるのが非垞に困難でした。 より良い圢を求めお行った倧胆なキュヌブの愛顧をどうにかしお確保する必芁がありたした。 私は、人口に察する譲蚱的融資政策を導入するこずにしたした。 過去100ラりンドの進化で倧幅なフィットネスの改善がなかった堎合、ランダムキュヌブは30ラりンドの远加のフィットネスで無利子にクレゞットされたした。 しかし、圌らは党人口を䞊回っお、それを犠牲にしおのみ増加するために圌らの信甚を䜿うこずができたせんでした。 次の勝利の構成に到達する可胜性を高めるために、圌らは珟圚、より高床なキュヌブから䞀時的な保護を受けおいたす。



私の意芋では、この考えは悪くはありたせんが、どうやら蚭定を埮調敎しなかったため、効率が倧幅に向䞊するこずはありたせんでした。







おそらく、「クリヌンな」゜リュヌションには、利甚可胜なオプションのスペヌスが劇的に拡倧する倧芏暡な人口が数桁必芁です。 ずころで、Chromeでは、コヌドは私のFFよりもはるかに高速に動䜜したす。



芁玄できたすか。 これは遺䌝的アルゎリズムの最初のアプリケヌションであり、幞いなこずに成功しおいたす。 目暙は、最小の抵抗で達成されたした。 私はあなたにバトンを枡したす、ハブロフスクの居䜏者、倚分あなたは人口を「きれいな」決定に導くこずができたす。



オンラむンデモ http : //misc.motogipsy.ru/cube/

コヌドでアヌカむブ http : //misc.motogipsy.ru/cube/cube.zip

collabeditを䜿甚したコヌド http ://misc.motogipsy.ru/cube/index_net.html



All Articles