はじめに
テーマは「ルービックキューブの最短解を求める」ことです。「最短解」にこだわってぼちぼちとやっています。
今回C#のマルチスレッドに初めて挑戦してみました。「async/await」の使い方はまだよくわかっていないので使用していません。
単純に18個のTaskを作成して走らせました。結果を見る限りおそらく並列で動いています。
List<Task> create_task(int depth) { List<Task> task_list = new List<Task>(); for (int i = 0; i < 18; i++) { int temp_move = i; Task task = new Task(() => multi_task(scrambled_state, temp_move, depth)); task_list.Add(task); } return task_list; } for(int i = 0; i < 20; i++) { Console.WriteLine("Start searching lenght {0}", i + 1); var task_list = create_task(i); foreach (Task each_task in task_list) { each_task.Start(); } Task.WaitAll(task_list.ToArray()); if (Global.finished == true) break; }
結果
前回まで30分かかっていた16手問題が4分で解けました。Loading pretrained data... Start searching... Start searching lenght 1 Start searching lenght 2 Start searching lenght 3 Start searching lenght 4 Start searching lenght 5 Start searching lenght 6 Start searching lenght 7 Start searching lenght 8 Start searching lenght 9 Start searching lenght 10 Start searching lenght 11 Start searching lenght 12 Start searching lenght 13 Start searching lenght 14 Start searching lenght 15 Start searching lenght 16 B' R' D L2 D F2 L2 D U L2 B F2 R F' U R Finished!(00:04:08.6661349)
18手問題は1時間以上かかりました。
Loading pretrained data... Start searching... Start searching lenght 1 Start searching lenght 2 Start searching lenght 3 Start searching lenght 4 Start searching lenght 5 Start searching lenght 6 Start searching lenght 7 Start searching lenght 8 Start searching lenght 9 Start searching lenght 10 Start searching lenght 11 Start searching lenght 12 Start searching lenght 13 Start searching lenght 14 Start searching lenght 15 Start searching lenght 16 Start searching lenght 17 Start searching lenght 18 U2 L U L B2 D2 L' B2 L' D2 U R' U' L2 R B R2 U2 Finished!(01:18:13.1912207)
コード
GitHubに公開しています。「multi」という名のブランチに今回使用したコードがあります。github.com
事前学習したデータはGoogle Driveからダウンロード可能です。
動作環境
ASRock DeskMini H470 CPU: Core i7 11700 メモリ:16G 2667MHz
CPU使用率は100%になります。ここからも並列処理ができているのではないかと推測されます。
CPUクーラーにはNoctua NH-L9i chromax.blackというのを使用しています。使用率100%でもCPU温度は70℃前後で安定しています。
さいごに
上記は.NET Core 3.1で作っています。.NET 6.0がまもなくリリースされると思います。パフォーマンスの向上があるとのことなのでどれほど時間が短縮するかリリースされたら試してみようと思います。参考にさせて頂いたサイト
ルービックキューブを解くプログラムを書いてみよう(前編:キューブを操る実装) - Qiitaルービックキューブを解くプログラムを書いてみよう(中編:IDA*探索) - Qiita
ルービックキューブを解くプログラムを書いてみよう(後編:状態のindex化, Two-Phase-Algorithm) - Qiita
前回までの記事
touch-sp.hatenablog.comtouch-sp.hatenablog.com