第12講 数独の問題を解くプログラムVer2解説
第2話 変更の狙い
Ver1では、
** | ** | ** | ** | ** | *4 | *5 | *8 | ** |
4 | 9 | ** | ** | ** | ** | ** | 6 | ** |
8 | ** | 1 | ** | 2 | ** | 4 | ** | ** |
6 | ** | ** | ** | 4 | ** | ** | ** | ** |
** | ** | 2 | 1 | ** | 5 | 8 | ** | ** |
** | ** | ** | ** | 8 | ** | ** | ** | 9 |
** | ** | 8 | ** | 5 | ** | 3 | ** | 7 |
** | 7 | ** | ** | ** | ** | ** | 4 | 6 |
** | 4 | 9 | 2 | ** | ** | ** | ** | ** |
Sub mondaikaisekiにおいて問題の解析を行い、各空欄に入れることの出来る候補リストとその最大個数を調べ、
その結果最大個数が
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | 3 | 3 | 3 | 4 | 5 | 4 | 5 | 8 | 3 |
1 | 4 | 9 | 3 | 4 | 3 | 4 | 3 | 6 | 3 |
2 | 8 | 3 | 1 | 5 | 2 | 4 | 4 | 3 | 1 |
3 | 6 | 4 | 3 | 3 | 4 | 4 | 3 | 5 | 4 |
4 | 3 | 1 | 2 | 1 | 4 | 5 | 8 | 2 | 2 |
5 | 4 | 3 | 4 | 3 | 8 | 4 | 4 | 5 | 9 |
6 | 2 | 3 | 8 | 3 | 5 | 3 | 3 | 3 | 7 |
7 | 4 | 7 | 2 | 3 | 3 | 4 | 3 | 4 | 6 |
8 | 3 | 4 | 9 | 2 | 4 | 5 | 1 | 2 | 3 |
であり、例えばセル(2,5)に入れることの出来る候補リストは、
k | 0 | 1 | 2 | 3 |
dhs1(2,5,k) | 3 | 6 | 7 | 9 |
であることを解明したのでした。そして、最大個数分析に基づいて、Sub bangousakuseiによって
条件の厳しさ順である番号付け(ランク付け)を行い、ランクが
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | 80 | 9 | 10 | 33 | 48 | *4 | *5 | *8 | 11 |
1 | *4 | *9 | 12 | 34 | 13 | 35 | 14 | *6 | 15 |
2 | *8 | 16 | *1 | 49 | *2 | 36 | *4 | 17 | 0 |
3 | *6 | 37 | 18 | 19 | *4 | 38 | 20 | 50 | 39 |
4 | 21 | 1 | *2 | *1 | 40 | *5 | *8 | 3 | 4 |
5 | 41 | 22 | 42 | 23 | *8 | 43 | 44 | 51 | *9 |
6 | 5 | 24 | *8 | 25 | *5 | 26 | *4 | 27 | *7 |
7 | 45 | *7 | 6 | 28 | 29 | 46 | 30 | *4 | *6 |
8 | 31 | *4 | *9 | *2 | 47 | 52 | 2 | 7 | 32 |
であることを明らかにしました。そして、このランクと候補リストによって数独の問題を解く作業に入っていったわけです。
Ver1では問題解析とランク付け(番号付け)一番最初にやるだけで、
試行錯誤過程を始めるのですが、ここに大きな問題があります。
なぜなら、
*0 |
すなわちセル(2,8)から可能な数字を入れていきますが、
** | ** | ** | ** | ** | *4 | *5 | *8 | ** |
4 | 9 | ** | ** | ** | ** | ** | 6 | ** |
8 | ** | 1 | ** | 2 | ** | 4 | ** | *3 |
6 | ** | ** | ** | 4 | ** | ** | ** | ** |
** | ** | 2 | 1 | ** | 5 | 8 | ** | ** |
** | ** | ** | ** | 8 | ** | ** | ** | 9 |
** | ** | 8 | ** | 5 | ** | 3 | ** | 7 |
** | 7 | ** | ** | ** | ** | ** | 4 | 6 |
** | 4 | 9 | 2 | ** | ** | ** | ** | ** |
数字を入れた瞬間に、候補リスト、最大個数が変わってしまいます。
例えば、先のセル(2,5)の候補リストから3が外され
k | 0 | 1 | 2 | 3 |
dhs1(2,5,k) | 3 | 6 | 7 | 9 |
が
k | 0 | 1 | 2 |
dhs1(2,5,k) | 6 | 7 | 9 |
に変わります。最大個数も
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | 3 | 3 | 3 | 4 | 5 | 4 | 5 | 8 | 3 |
1 | 4 | 9 | 3 | 4 | 3 | 4 | 3 | 6 | 3 |
2 | 8 | 3 | 1 | 5 | 2 | 4 | 4 | 3 | 1 |
3 | 6 | 4 | 3 | 3 | 4 | 4 | 3 | 5 | 4 |
4 | 3 | 1 | 2 | 1 | 4 | 5 | 8 | 2 | 2 |
5 | 4 | 3 | 4 | 3 | 8 | 4 | 4 | 5 | 9 |
6 | 2 | 3 | 8 | 3 | 5 | 3 | 3 | 3 | 7 |
7 | 4 | 7 | 2 | 3 | 3 | 4 | 3 | 4 | 6 |
8 | 3 | 4 | 9 | 2 | 4 | 5 | 1 | 2 | 3 |
から
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | 3 | 3 | 3 | 4 | 5 | 4 | 5 | 8 | 2 |
1 | 4 | 9 | 3 | 4 | 3 | 4 | 2 | 6 | 2 |
2 | 8 | 2 | 1 | 4 | 2 | 3 | 4 | 2 | 3 |
3 | 6 | 4 | 3 | 3 | 4 | 4 | 3 | 5 | 3 |
4 | 3 | 1 | 2 | 1 | 4 | 5 | 8 | 2 | 1 |
5 | 4 | 3 | 4 | 3 | 8 | 4 | 4 | 5 | 9 |
6 | 2 | 3 | 8 | 3 | 5 | 3 | 3 | 3 | 7 |
7 | 4 | 7 | 2 | 3 | 3 | 4 | 3 | 4 | 6 |
8 | 3 | 4 | 9 | 2 | 4 | 5 | 1 | 2 | 2 |
に変わってしまいます。最大個数に基づいてランク付けが行われますので、
*3 |
を入れたことによって、ランクも変わってしまいます。
空欄に数字を入れる度に、最大個数、候補リスト、ランク付けが変わってしまうのに、
Ver1ではそれに対応していなかったのです。
Ver2では、空欄に入れる度に、問題解析とランク付けをするように変更して、
問題を解くスピードを上げたのです。この変更によって、
*1 | ** | ** | ** | ** | ** | *4 | ** | ** |
* | * | 3 | 9 | * | 6 | * | * | * |
* | * | * | * | * | * | * | * | * |
* | * | * | * | * | 5 | * | * | * |
* | * | 6 | * | * | * | * | * | 3 |
* | * | * | * | 1 | 4 | * | 8 | * |
* | * | * | 2 | * | * | * | 3 | 6 |
5 | * | * | * | * | * | * | * | * |
4 | * | * | 8 | * | * | * | * | * |
の問題ならVer1に比べて17.5倍のスピードアップとなります。
Ver0と比べるなら約250倍となります。