第11講 数独の問題を解くプログラムVer1の解説 
第1話 Ver1の変更点
Ver0からの変更点は、
Sub bangousakusei()
    Dim i1, i2, i3 As Integer
    g = 0
    For i = 1 To 9
        For j = 0 To 8
            For k = 0 To 8
                If cnn(j, k) = i Then
                    iz(g) = j
                    jz(g) = k
                    g = g + 1
                End If
            Next
        Next
    Next
    hs = g
End Sub
が加わったことです。
すでに解説したようにVer0では

*0 *1 *2 *3 *4 *4 *5 *8 *8
4 9 11 12 13 14 15 6 17
8 19 1 21 2 23 4 25 26
6 28 29 30 4 32 33 34 35
36 37 2 1 40 5 8 43 44
45 46 47 48 8 50 51 52 9
54 55 8 57 5 59 3 61 7
63 7 65 66 67 68 69 4 6
72 4 9 2 76 77 78 79 80

黄色の順番の通りに、数字を入れていきました。
実はこれは、効率的な問題の解き方とは言えません。
問題を解くときの鉄則は、最も条件の厳しいところからクリアしていくことです。
学校では年度当初に時間割を組みますが、
これがかなり複雑なパズルです。
現在の高校では、普通高校でも選択、組授業、習熟別授業などが実施され、時間割はかなり複雑になっているからです。
時間割を組んでいくときの鉄則は、一番条件の厳しい授業から入れていくということです。
例えば体育は、2クラスを4,5分割(まず男女に分かれ、さらに剣道や柔道などに分かれたりします)して4,5人で担当します。
グランドが2つあったとしても、雨の日のことを考えれば同時には1展開しかできません。
数学や英語なら教室の数だけ同時に展開できるのとは、対照的です。
体育教室が1つだけしかないとして時間割を組んでいきます。
この条件のキツイ体育を後回しにしてしまうと、
後で動きがとれなくなり、にっちもさっちもいかなくなります。
条件の厳しい体育、家庭科、複数クラス複数分割(例えば、2クラスを数U、W、古典の3分割するなど)から入れていき、
最後は、私たちが単駒と呼んでいる授業(一クラス一科目担当者一人)で単位数の少ない科目と組んでいくのが時間割のコツです。
単位数が少ない単駒は自由に動かすことができるからです。

数独の問題もまず、一番条件の厳しいセルから数字を入れ、次に2番目に条件の厳しいセル、
3番目に条件の厳しいセルという入れていく方が、問題がスピーディに解けます。
条件の厳しい順に番号を付け替えると下のようになります。

80 9 10 33 48 *4 *5 *8 11
*4 *9 12 34 13 35 14 *6 15
*8 16 *1 49 *2 36 *4 17 0
*6 37 18 19 *4 38 20 50 39
21 1 *2 *1 40 *5 *8 3 4
41 22 42 23 *8 43 44 51 *9
5 24 *8 25 *5 26 *4 27 *7
45 *7 6 28 29 46 30 *4 *6
31 *4 *9 *2 47 52 2 7 32

どうしてそうなるかは次話に譲ることにしましょう。
この番号の付け替えによって、この問題の場合2倍スピードアップします。さらに、下の問題

*1 ** ** ** ** ** *4 ** **
* * 3 9 * 6 * * *
* * * * * * * * *
* * * * * 5 * * *
* * 6 * * * * * 3
* * * * 1 4 * 8 *
* * * 2 * * * 3 6
5 * * * * * * * *
4 * * 8 * * * * *

では、なんと14倍にもなります。条件のキツイ順にするだけでこれだけ威力を発揮します。



尚、魔方陣のプログラムや数独のプログラムは実は時間割にも応用できます。
市販の時間割ソフトが正直にいって、余りできの良いものとは言えません。
時間割ソフトだけでは、1日に同じ授業が2時間入ったり、一人の担当者が同時間に複数担当することになっているなどの問題を
最終的にクリアできず、最後の詰めは結局手作業で行っています。
プロの方が、研究して作った割には本当にお粗末です。
本サイトの魔方陣プログラムは、時間割より複雑な問題(例えば、26次魔方陣)
を0.1秒もかからず解いてしまいます。
魔方陣や数独を解くプログラムを応用すれば、
時間割ソフトも作れます。
時間割も縦の条件(1日に同じ教科が2時間以上入ってはいけないなど)、
横の条件(担当者が出る教室は、1つであるなど)をクリアしながら進めていくので、まさに数独や魔方陣と同じです。
ただ、個人で時間割ソフトを作るとなると、缶詰作業で少なくとも3ヶ月は必要です。
実際にプログラムを組んでみると、
思うように動かないなどいろいろ不都合が出てきて完全に完成させるまでは、1年ぐらいかかってしまうかもしれません。
いろいろな仕事で追われている私には、その時間はありません。
もし、ソフトメーカーの方がいらっしゃいましたら、本サイトの数独などのプログラムを参考に完全な時間割ソフトを作ってみませんか。
かなり売れるし、時間割で1週間近くも缶詰作業を強いられている時間割係の先生方から感謝されますよ。
売れる理由は、簡単です。少なくとも学校は1年に1回は時間割を組まなければなりませんし、
先に触れたように現在市販されている時間割ソフトは出来が大変悪いからです。
全国にどれだけ学校があるか正式に調べたことはありませんが、甲子園に参加する高校数が5千校近くありますよね。
中学校はその数倍はあるはずですから、中高で2万校は下らないはずです。
さらに、最近は小学校でも教科担任制を取っているところもありますから、需要は相当ありますよ。


第10講7話へ 第2話へ


VB入門講義応用編トップへ

VB入門講義トップへ