プログラミングパズルに関心のある人は雑談しましょう!
早速のお返事で嬉しく思います。 が、なかなかうまくいくものではないですねぇ(笑 標準化もよく考えられているものだと思いますし、 それで膨大な数の局面がでてきてしまっては仕方ないかもしれませんね。 私は、もうちょっと抽象度の高い標準化を考えていたのですが、 もしかしたら同じ結果に終わるかもしれません。 もうすこし試行(思考?)してみます。
sa-toさん、こんばんは。 究極のナンプレ問題はとても好奇心をそそる魅力的なテーマながら難しいですね。 解答パターンはどうあるべきか。実は私も過去にsa-toさんと同じことを思ったことが あり、そのときの検討内容と結果を書きます。 【本質的に変わらない解答パターンの変換ルール】 3×3のブロックを単に「ブロック」と呼ぶことにし、ブロックを3個つなげたエリアを 「行ブロック」あるいは「列ブロック」と呼ぶことにすると、本質的に変わらない変換は、 ルール1: 行ブロックを入れ替える 6 通り ルール2: 列ブロックを入れ替える 6 通り ルール3: 行ブロック内の行を入れ替える 6×6×6 通り ルール4: 列ブロック内の列を入れ替える 6×6×6 通り ルール5: 行列を交換する(90度回転) 2 通り ルール6: 数字そのものを入れ替える 9! 通り その総数は、1,218,998,108,160 通り。 あまりにも多すぎるので本質的に同一面であるかのチェックは、このままではかなり困難と 思われます。そこで「標準型」という考え方を導入してみました。ある任意の解答パターンを この標準型に変換すると本質的に同一面かのチェックが一発で可能になるというものです。 【標準型への変換(私が採用した方法)】 9個のブロックを左上の位置にルール1またはルール2を使って置く方法は、 6×6 通り 次にそのブロック内の9個総てのマスを左上の位置にルール3またはルール4で 移動し、その左上マスの数字と同じ数字が下図★の位置にくるようにルール3 またはルール4で移動する方法は結局、 9 通り ★□□□□□□□□ □□□★□□□□□ □□□□□□★□□ □★□□□□□□□ □□□□★□□□□ □□□□□□□★□ □□★□□□□□□ □□□□□★□□□ □□□□□□□□★ 最上段行の数字が[123456789]となるようにルール6を使い変換する 1 通り ルール5により行列を交換(90度回転)して、上記の行程と同じ変換を行う 2 通り この時点で標準型の候補が648通り得られるが、左上マスから順に右方向へ次は 2行目に移ってマスの数字を1列に並べ81桁の数値として比較し648通りの中で 最も小さい値になるものを標準型とします。どんなパターンでもこの標準型に変換 することで同一面かどうかのチェックが出来るようになります。 【本質的に異なる解答パターン(標準型)は何通りあるか】 この問題を解くために解答パターンを下図のように固定して、空きマスになっている 2行目の左位置から順に解として成立する数字を再帰を使って配置していきます。 総てのマスが埋まったら648通りの標準型の候補に変換し、今作ったパターンが 81桁の数値として最小値であるならば標準型なのでカウントします。 123456789 □□□1□□□□□ □□□□□□1□□ □1□□□□□□□ □□□□1□□□□ □□□□□□□1□ □□1□□□□□□ □□□□□1□□□ □□□□□□□□1 【実行結果】 この探索が有限時間内に終ることはありませんでしたが、予想に反して本質的に 異なる解答パターンは膨大な量になってしまうという結果だけは得ました。 探索を打ち切ったときの標準型パターン量は概数すら忘れましたが、とんでもなく 多くなると判断できた時点で、迷わず探索を打ち切りました。このようなことが あったので、解答パターンを総て洗い出しておくというアイデアは消滅したのです。 # 考え方とプログラムに間違いは無かったとしての話ですが。
こんばんは。sa-toと申します。 私は以前からこのサイト等でナンプレの問題には興味をもっており、 自分なりに究極のナンプレ問題についていろいろ考えてきました。 #まぁ、成果はでてないのですが。 ナンプレ問題を扱う上で私がずっと気になっているのが、 「本質的に異なる解答はなん通りなのか?」 ということです。 たとえば、あるひとつの解答図があったとして、 ある行とある行を、ある列とある列を、いれかえた場合でも解として成立しますよね。 また、解答図中の数字の1と数字の2を全部いれかえたとしても、解として成立します。 そのようにしてできた解答図群はおなじ解とみなすことができると思います。 ようするに、上記の操作によって、解空間全体が、いくつかの同値類に分割できると思うのですが、 それはいったい何種類なんでしょうか。 直感的に私はこれはかなり少ない数になるのではないかとおもっています。 それらの解の特徴を抽出することで、究極のナンプレ問題に近づくことはできないでしょうか? どう思われますか?
としひでさん、さっそくの挑戦ありがとうございます。 この問題には、いろいろな複線のテーマが潜んでいると思っています。 ★より高速なソルバーを開発しなければならない。 ★解答パターンにヒント数を少なくする為の素質の良し悪しはあるのか。 → あるとすればそれはどんな要素なのか。 ★この問題が解けるアルゴリズムはきっと究極のナンプレ問題解決に役立つ。 当時、私が解答図から逆解析して問題図を見つけられる可能性もわずかにある と思ったのは、より少ないヒント数のナンプレ問題を乱数により作っていた時に、 解答図を先に作って冗長性のあるヒントマスを消していくという方法を採って いたからです。「解答図が先にある」というアプローチは決して斬新なものでは ありませんが、素質の良い解答図に出会っていたとしても、それからヒント数の 少ないナンプレ問題を効率よく導き出せないなら、その方法もあまり意味がない と感じていたのです。そんな思いを込めた再挑戦の第一歩がこの問題なのです。 この問題が解けて、さらにどれだけ速く解けるようになるかという先には大きな 展開があるに違いありません。 ところで、この問題のアプローチとしては、やはり乱数を使うのでしょうね。 乱数をどう使うのか、そこがポイントだと思っています。
なかなか難しそうですね。 問題を生成してSolverに突っ込んでみるという至極単純な方法では、 ヒント数23までしか求まりませんでした。 Solver自身の高速化だけでは限界がありそうです。
BBS-23にて: > ところで、ナンバープレイスにおける「ヒント数17個の記載」には > せめて「答え図」だけでも載っていませんでしたか。答え図そのもの > に特別な数字の配置がある可能性もあります。答え図から逆解析して > 問題図を見つけられる可能性もわずかにあるような気もします。 稲葉さんからヒント数17の問題図を教えて頂いたので、このテーマの事 を忘れていたのですが、はたしてあの時「答え図」からヒント数17の 問題図を見つけることは出来たのだろうか。 そこで、改めて提起したい問題はこうです。 【問題】 下図が解答図となるヒント数17のナンプレ問題を見つけなさい。 324 795 168 768 412 539 159 836 472 835 649 721 217 583 946 946 271 853 671 358 294 492 167 385 583 924 617
いみわかんねー
解く方法が簡単に見えたパズルだったのですが、まさかAI系のアルゴリズムを 使うことが最適な方法だとは思いもしませんでした。 今更ながら、難易度のピークは真中ぐらいにあることはなんとなくそうかなと思 っていました。 いきなり難しいアルゴリズムを勉強するのは大変そうなので基本のものから勉強 したいと思います。いろいろとありがとうございました。
突然ですが、UNITILEが解決しました。 空欄1個〜空欄100個を各20問ずつ合計2000個の問題を乱数で作って解かせてみた のですが総て解けました。空欄50個のちょっと手前で約1分かかったケースがありま したが、ほとんどの場合は直ぐに解けます。(ランキングの UNI-BEER は私です) どうやったかと言うとHP開設者の人に迷惑がかかりそうなのでズバリとは言えません が、とにかくとても小さなプログラムです。(方法3の超簡易版かな.....) 困りますね良く解けすぎるのも。何も書けなくなりました。
先ほどは弟が 失礼しました。DAIは、私の父と結婚して最初の方は普通にしていたのですが、一週間程たったら、部屋にこもってしまい、部屋を出るときは、バイトの時だけで本当に失礼しました。私も時々ここに来ますので(多分)