ホームページへ戻る  書き込みリストへ戻る
「コンピュータ&パズル」訪問者の自由メッセージコーナー

お気づきの点や感想要望などなんでもOK!


AIUEO 投稿者:DAI  投稿日:08月23日(金)17時28分01秒

わかりません。誰か教えて!!!!!!!!!!!!!!!!!!! 生意気かも知れませんが、本っっっ当わかりません


AIUEO 投稿者:DAI  投稿日:08月23日(金)17時19分47秒

はははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははは。ふぅ


re:UNITILE  投稿者:高橋謙一郎  投稿日:08月22日(木)22時21分36秒

mtkさん、こんばんは。

何とも悩ましい面白いテーマですね。レベル29に達している人はどんなロジックを持って
いるのでしょうかねぇ。

【方法1/正攻法】
1.空欄を埋める優先順位が関係してくるのは行(列)に複数の空欄がある箇所に限られる。
2.青か赤かを決める選択肢は必要ない。(最後に必然的に決めることが出来る)
3.あるマスが最終的に何色になるのかを確定出来る箇所があり枝刈りに使用出来る。
   a.ある行(列)の空欄が1ならその空欄の両脇の総てのマスは将来必ず1回反転する。
   b.ある行(列)の空欄が2ならその空欄に挟まれたマスは将来必ず2回(0回)反転する。

この段階でプログラムした結果がレベル20(21個)に手が届く事はありませんでした。
もっとも問題によっては直ぐに解けたり長考したりと安定した性能にはなっていません。

【方法2/条件式法】
mtkさんが最後に書いている、青青□青青□赤赤 と □□赤赤赤赤赤赤 は同じという
意味が理解出来ていませんが、空欄にアルファベットの名前を付けたとして、
「A地点よりもB地点を先に埋める必要がある」
「B地点よりもC地点を先に埋める必要がある」
というようなものが一般的には確かに見える箇所があります。それを巧くプログラム化出来
ればいいと言うことでしょうか。こういう条件式が都合よく繋がってくれればいいのですが。

【方法3/AI法】
恐らくは、GA(遺伝的アルゴリズム)とかNN(ニューラルネットワーク)とかを使ってみる
のが正解かも知れないような気もしています。(解が複数ある内の1つだけ見つければ良いので)

方法2か方法3か迷うところです。それとも方法1の改善か。


re:UNITILE 投稿者:mtk  投稿日:08月22日(木)17時21分18秒

高橋さん、こんにちは。

>最も、平凡なソルバーなら簡単に作れると思うのですが

簡単ではなかったのですがとりあえず作れました。そして、そのプログラムで解けるのは
Level-10まで(20秒ぐらい。というのはパソコン自体初心者なので、時間がかかりすぎると
       なぜか不安になるので)。

>ところで、青か赤かを決める選択肢は無くなってしまうような気がします。

これはすぐわかったのですが、次に枝刈りをしようということになってそこで
行き詰まってしまいました。
ところで、プログラムがさっぱりなのでUNITILE ばっかりしていたらいいコツを見つけました。
プログラムにできない自分には意味がないのでお役に立てたらうれしいです。

・自力で解く時に使うやつ
21101       0:空欄
12212       1:赤
01121       2:青

左上のかどを見てください。そのタイルは1行目と1列目のヒントのタイルです。
次にその下を見てください。2行目には空欄がないので、1列目だけのヒントになっています。
つまり、そのタイルは赤で決定です。赤ということは次の空欄か端まですべて奇数回反転する
ことです。また、1回反転すること同じです。青は偶数回反転するので、0回反転するのと同じ
です。

うえの説明はたぶん無駄だと思います。が、次は結構自信があります。

・自力で解くときに使わないやつ&使えないやつ
22022011    (数字は上と同じ)

00111111

この二つは同じです。どういう事がいいたいかというと、行または列の優先順位の候補が
一箇所のタイルが決定しただけで求めれることです。

どうか無駄(高橋さんがすでに知っていること)にならないように。


re:UNITILE 投稿者:高橋謙一郎  投稿日:08月22日(木)00時02分51秒

mtkさん、失礼しました。甘く考えすぎていたようです。

さっそくプログラムを書いて試してみましたが、Level-17(空欄18個)で
長考状態に陥ってしまいました。ランキングを見るとLevel-29(空欄30個)
まで解いている人がいますね。

> 空欄の量がかなり多い問題でも高速に解けるソルバーを作ることが
> 出来そうな印象を受けました。

これは甘かった。何かあるんでしょうね。考えてみます。


re:ブラックボックスの解を最短で見つける 投稿者:高橋謙一郎  投稿日:08月21日(水)20時34分23秒

ボール5個で無限ループに陥るボールの配置はという質問:

オリジナルルールの場合、ボールにぶつかった時に光が吸収されるという自然な流れ
としての結論を得たので、独自ルールでもボールにぶつかった時に光が反射されると
いう自然なルールでプログラムしています。

質問の答えは総てプログラムの中にあります。自分で解析する気は無いのですか。


re:UNITILE 投稿者:高橋謙一郎  投稿日:08月21日(水)20時24分51秒

mtkさん、こんばんは。

UNITILE というパズルは乱数を使って完成型から逆向きにタイルを抜いて
問題を作成していると思われるので「解は必ずある」というのは当然だと
思われます。また解が複数あるようだという感想も当然かも知れません。

空欄を埋める優先順位と青か赤かを決める二重の選択要素があるので探索
量は空欄の個数をnとして n!×2のn乗 になると思われます。しかし、
空欄を埋める優先順位が関係してくるのは行または列に複数の空欄がある
箇所に限られます。そこで、そのような箇所にだけ空欄を埋める優先順位
のパターンを生成して探索するだけで良いことに気づきます。その結果と
して、殆どの場合には解が複数あることにもなります。

ところで、青か赤かを決める選択肢は無くなってしまうような気がします。
探索量を(n−α)! にする方法があると直感しました。それと、普通に
思い付く枝刈り法もあるようなので、空欄の量がかなり多い問題でも高速
に解けるソルバーを作ることが出来そうな印象を受けました。
(実際にやってみないと何とも言えませんが)

最も、平凡なソルバーなら簡単に作れると思うのですが、どんな処で行き詰
まったのでしょうか。どういうアルゴリズムを使うのかと聞かれてもバック
トラッキングしか無いでしょう。


UNITILE 投稿者:mtk  投稿日:08月21日(水)12時09分53秒

プログラムを勉強中で、このサイトにたどり着きC言語がパズルを解くのにいいとかかれていたので、
UNITILE(ゆにたいると読むらしい)というライツアウト風のパズルを解くプログラムを
考えていますが、行き詰まってしまいました。そこで、どういうアルゴリズムを使うかなど、
解説をお願いします。

内容を簡単に言うと、10x10のボードに問題として青と赤のタイルと空欄があって、空欄を
うめてすべてを青にすると言うものです。空欄を埋めるとき、青か赤かを選べます。
空欄を埋めると、その行・列のタイルがすべて反転します。ただし、空欄の位置からボードの端に
むかって反転していき、途中で空欄があるとそれ以降は反転されません。

過去の投稿を見ていると、解がないとか解が複数あるとかいうパズルはだめみたいですが
「解は必ずある」とかかれていたのでそれはいいのですが、数は自分で解いているといっぱいある
みたいです。

オンラインで実際できます。ルール説明もあります。↓

http://www.ramox.com/unitile.html


re:ブラックボックスの解を最短で見つける  投稿者:major  投稿日:08月21日(水)09時54分19秒

前回解がもとまらないパターンについては教えていただいたのですが、ボール5個で無限ループに
陥るボールの配置というのはどのようなものでしょうか?


re:ブラックボックスの解を最短で見つける 投稿者:高橋謙一郎  投稿日:08月21日(水)07時21分44秒

majorさんの独自ルールでは「吸収」という概念がなく必ずどこかから光が
出で来るという構想だったと思います。その為には「ループ吸収」が発生
しないように「ボールは4個以内」でなければなりません。
(さらに例題では7箇所も吸収されるという設定です。)

majorさんの独自ルールのルーチンには光が吸収されたというチェックは
入れていません。PCが固まったのは例題がボール5個なので光のループが
発生し、そこから永遠に抜け出せないでいるからです。

majorさんの独自ルールで面白いのは「ボール1個で最短4手」という結果
になることです。main()の中をこのように設定を変えて実行してみて下さい。

    BALL_CNT = 1;
    already  = 0;


 ホームページへ戻る 書き込みリストへ戻る