お気づきの点や感想要望などなんでもOK!
悩めるプログラマの高橋です。
ありがとうございます。執筆依頼があったのが6月、やっと発売されました。
と言っても私はまだ現物を見ていません。私の住んでいる山形は書籍関係の
発売はすべて1日遅いのです。明日2,3冊買占めようと思っています(記念に)。
記事の終盤はgeepgreenさんとの話がなかったら書けなかったもので当時の
旬の話題を書いてしまいました。どうもありがとうございます。
それから広井さんがX68000の電脳倶楽部に書いた記事を先に読んでいたなら
私の今回の記事も別のものになっていたろう、とそれが残念です。
こんばんは、deepgreenです。
おめでとうございます。そして,お疲れ様でした。
早速、高橋さんの力作を読ませていただきました。素晴らしい内容です。
この記事を読むと、深さ優先探索の好きな私も、IDAをやってみようかと
気持ちがゆらぎます。ちょっと浮気かな。
アンコールではないですけど、続編をつい期待したくなりますね。
15パズルは、IDAで意外とよい成績がでましたね。実用上は結構いける
かもしれません。
こんばんは、広井です。
> 皆さん方には物足りなく感じてしまう内容になっていると思います。申し訳ありません。
いえいえ、そんなことはありません。
最近、アルゴリズムの解説記事を掲載する雑誌が少ないなかで、
パズルを題材にアルゴリズム入門的な記事を執筆されたことは、
とても素晴らしいことです。
どのプログラミング言語を使うにしても、けっきょく
「アルゴリズム+データ構造=プログラム」にかわりはありません。
アルゴリズムの学習はとても重要なことだと思います。
これは、パズルを解くアルゴリズムについて入門的かつ網羅的な記事を書いて
ほしいという執筆依頼があって、C言語は知っているけどパズルを解くような経験
があまり無い読者を対象にして書かせていただいたものです。だから、皆さん方
には物足りなく感じてしまう内容になっていると思います。申し訳ありません。
ホームページを開設しているとこんなこともあるんですね。原稿料をあてにして
ノートパソコンを買ってしまいました。今それを無線LANで使ってます。
こんばんは、広井です。
私が毎月購読しているプログラミング系の雑誌に「C MAGAZINE」があります。
11月号(10月18日発売予定)の内容をホームページで確認したのですが、
特集「パズルを解くアルゴリズム」は高橋謙一郎さんが執筆されたのですね。
11月号、とても楽しみです。
動きが制御できないっす
deepgreenさんの方法を読んだとき1時間44分で探索が終わるハズが無い
と最初に思ってしまいました。探索量を概算で見積ると依然として膨大だか
らです。
> 探索時間を速くするため、予め各領域のpushパターン(3^6個)に
> ついて、重複解もふくめて手数を求めておく。
「重複解もふくめて」ここが凄いアイデアですね。これによって処理がとて
も軽くなります。1時間44分というのには納得出来ます。しかし、ほんと
deepgreenさんて頭が良く廻るなあ。驚かされっぱなしです。
皆さん、ありがとうございます。deepgreenです。
幅優先探索の結果、25手の解は存在しないことがわかりました。
(従って、24手の解が最長手数となります。)
補足:幅優先探索の課題は、状態を記憶するスぺース量にあります。この場合
も、単純な方式では3^22=3.14*10^10となり、破綻する。
しかし、状態を記憶せず、生成できれば話は変わります。
[概要]
問題面ではなく解のpushパターンをベースに考えます。
pushパターン(p)に対して26個の0解を重ねた重複解を生成し、
pの手数が最小となるのものを代表とする。
5x5を以下の5つの領域に分割する。
AAABB
AAABB この分割は高橋さんと同じですね
CCEBB
CCDDD
CCDDD
pushパターンpの各領域の手数をa、b、c、d、eとする。
0解のパターンからeの地点は無条件に2としてよい。
探索時間を速くするため、予め各領域のpushパターン(3^6個)に
ついて、重複解もふくめて手数を求めておく。
m=a+b+c+dとなる(a,b,c,d)の組み合わせパターンを生
成する。次に、(a,b,c,d)を満たすすべてのpushパターンp
について、pが代表かどうかをテストする。
まず、m=22から始めて、解が1つ見つかれば、mを+1して、23,
24と探索を続ける。解が存在しないところで終了すればよい。
(m=22は24手の解の確認の意味で探索)
(a、b、c、d)の選び方
領域の対象性から、a,b,c,dは以下の条件の範囲に限定してよい。
a>=b,c,d
a=dのとき、b>=c
a<=12(領域の大きさは6なので)
(結果)
m=22(24手の解)は以下のパターンを検出したが、m=23は
解が存在しなかった。
m=22の解のパターン 対応する問題面
22202 20222
00002 01211
10201 00110
20020 02020
02220 22001
探索時間は、ThinkPad(Pentium 133MHz)で 1時間44分
高橋です。私もギブアップしそうです。
幅優先探索が使えないなら深さ優先探索を使うことになります。
再帰を使って解の存在する問題面(3^22個)を作り、27通りの解
の中から最適解を選ぶことになります。(重いなぁ)
ただし0解パターンを見ると中央の1箇所に影響を与えること
が出来ないのでその場所は2回押すべきです。そうなるとその
場所を2回押すための条件式があります。それはこの式です。
13: ------------1------------ 111211-22-121--22---1----
右辺の計算結果が2になるように問題面を作ってやる必要があ
ります。この制約を受けて計算量は 3^21 に減らすことが出来
ます。後は対称性を考慮して探索量を減らすことが考えられます。
例えば下図の問題面でAの領域にある1の個数よりもB,C,D
の各領域で1の個数が超えてはいけない、とする方法です。
問題面
AAABB
AAABB
CCEBB
CCDDD
CCDDD
この方法で探索量をどの程度減らせるかは見積もれませんが、
仮に約1/3〜1/4に減らせたとして 3^22 よりも最終的にその
約1/10に減らせそうですが、まだだひと工夫ほしいところです。
他に探索量を減らすアイデアはないでしょうか。
こんばんは、広井です。
3色版ライツアウトの最長手数、これは難しいですね。
3 ^ 22 は、とても大きな数字です。24 手の問題を見つけた
だけでも凄いことだと思います。私も考えてみましたが、ギブ
アップしそうです。