それはアルゴリズムではありません。アルゴリズムは「答え」ではなく「答えを出す手順」です。答えが出たならば、それはアルゴリズムではないのです。それはパズルです。 そしてこのパズルは、隠されたルールを暴く遊びです。隠されたルールとは即ち「二つのバケツを使って差の量の水を量ることが可能」というルールです。 このルールが無い限り解くことは不可能なので、このルールに気付くことを楽しむ遊びです。隠されたルールを見付けなければ解けないならば「アルゴリズム」ではあり得ません。 ・N個のバケツがあり、それぞれは容量を持っている。 ・バケツはその容量以下の水を保持することができる。 ・バケツを満杯にすることで、そのバケツの容量の水を量ることができる。 ・水は無限に使用出来る。 ・バケツに保持されている水は捨てることができる。 ・バケツAとバケツBとがある時、バケツAに保持されている水をバケツBへ移すことができる。この時、バケツAにバケツB(に既に水が入っていた場合にはその分を差し引いた残り)の容量より多くの水が入っていたならば、バケツBの水が一杯になる分の容量だけしかバケツAの水は減らない。 この最後のルールが発見されない限りこのパズルは解けず、この最後のルールが発見された後はアルゴリズムを構築可能になります。 これを解くアルゴリズムは総当たりですね。いえ、A*探索アルゴリズムじゃないと拙いですね。ヒューリスティック関数が効率悪そうですが、(目的の水量マイナス全バケツの水の総量)の絶対値、とかならば機能するでしょうかね。あー、それでも無限ループが発生しますね。全バケツの保持水量でメモ化が必要ですね。 状態としては、N個のバケツ(容量と保持している水量)ですね。余談ながら、全部のバケツの最大公約数が水量の最小単位になります。 状態遷移は、バケツの水を満杯にする(N手)、バケツの水を捨てる(N手)、バケツの水を移動する(N*(N-1)手)の合計 N*(N+1) 通りですね。一手番で、この中のどれかを選ぶことになります。当然、満杯のバケツに水を入れたり空のバケツの水を捨てるのは無駄な行為ですので無条件で枝刈りするとして。 バケツがどれか一つでも目的の水量になったら終了。 これがアルゴリズムです。この手順を、バケツの個数と容量が明らかになった「パズル」に対して適用して計算します、計算機が。人間は計算しません。それがプログラムです。
なるほど:1
あまりいい例えとは思いませんね。 問題の答えは、 1)5Lのバケツをいっぱいにして 2)その水を3Lのバケツがいっぱいになるよう移し、 3)3Lのバケツの水を一旦棄てて 4)5Lのバケツに残った2L相当の水を3Lのバケツに移し、 5)その後、5Lのバケツを満杯にして、 6)3Lのバケツの余っている部分に入れる だと思いますが、これアルゴリズムですかね。むしろ人間向きのパズルだと思うのですが。 アルゴリズムというのは、例えば、「数字の10000から20000の間にある素数を抽出しなさい」といった、やろうと思えばできなくはないが、膨大な単純作業が発生するため、人力で行うのが現実的でないものを機械に行わせる場合の計算手順だと思うのですが違いますかね。
ありがとう:1
< 質問に関する求人 >
ITエンジニア(東京都)この条件の求人をもっと見る
求人の検索結果を見る
< いつもと違うしごとも見てみませんか? >
覆面調査に関する求人(東京都)この条件の求人をもっと見る