【C#】ルービックキューブの最短解を求めたい Part 3 並列処理で速度アップ

はじめに

テーマは「ルービックキューブの最短解を求める」ことです。
「最短解」にこだわってぼちぼちとやっています。

今回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%になります。ここからも並列処理ができているのではないかと推測されます。
f:id:touch-sp:20210909210141p:plain:w400
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.com
touch-sp.hatenablog.com

この記事の後に書いたつづき

touch-sp.hatenablog.com