• 締切済み

アルゴリズムについて

<課題> A列、B列に各20個の箱があったとします。この箱には1個までのボールが入ります。A列の箱にボールをランダムに10個入れました。この10個のボールを上から順番に隙間なくB列の箱に移し替える事が目的で、移し替える手段としてボール1個のみ掴むことの出来るアーム(アーム1)とボールを5個一括で掴むことの出来るアーム(ただし箱1個間隔のアームとする)(アーム5)を使って最短回数でB列に移すアルゴリズムを教えてください。 条件1.今回は10個のボールと書きましたが動的な数値であると解釈してください。 条件2.A列の箱内で移し替えを行ってもいいですが回数はカウントされるものとします。 条件3.アーム5は列の両端の箱からはみ出してはいけないものとします。 以上、よろしくお願いします。

みんなの回答

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

「最短回数のアルゴリズム」とありますが、数学的に証明できるようなものでないと 最短回数を保証できないですよ。 ある開始状態からの最短回数と手順をプログラムで求めればいいのでしたら、 全ての可能な手順を順に行ってみるのが単純で理屈もいらないです。

  • Largo_sp
  • ベストアンサー率19% (105/538)
回答No.1

難しい問題なのかなぁ... まず、単純に、 1.全部ばらばらな時...アーム1ですべて移し変えるのが最短 ですよね...5つ並べても運ぶ動作を含めて5回ですから 2.単独で2~4個が隣り合っているいる時...その集まりに寄せるように集めてアーム5を使う... 3.複数ある場合...最多で集まっているところに集める  このとき、サイドに近い部分から集める。 (正確にはできるだけ5(n-1)個目から5n個めの部分であつめる) これをアルゴリズム化すればいいのではないでしょうか... もっと細かい条件が必要かなぁ....

cyan1110
質問者

補足

返答ありがとうございます。私にはまだ上記の3項をプログラムに変換するだけの能力がないです。もし差し支えなければ中心核となるアルゴリズム化のプログラムを教えていただけないでしょうか?

関連するQ&A

  • アルゴリズムで

    今エクセルにて簡単なデータ処理をしているのですが、どうしても浮かばないアルゴリズムがあるので、教えて下さい。 Excel2003 VBAにおいて、 A列にアルファベットが並んでいます。 B列、C列には適当な数値が入っています。 Do~LoopにてA列の空白欄までループを回していて、その中で決めたアルファベットが来た時(例えばF)に、そこから次の指定したアルファベット(例えばS)が来るまでB列のセルの数字とC列のセルの数字を足したものをD列のセルに記入します。 決めたアルファベットには規則性はないのですが、一度使った全てのアルファベットが終わるまで来ません。 具体的に描かせてもらうと、A~LまでK~Zまでが分かれており、A~Lはランダムに順に並んでおり、次に順にK~Zまではランダムに並び。全てのアルファベットが終わったら、またらA~Lまでランダムに並び、次にK~Zまで並びます。 これが、何回も続いています。 先の例えに準じて書かせていただくと、Fが来たらそこからB列とC列の計算を始めて、Sが来たらその計算を終える。 また、次にFが来たら、B列とC列の計算を始めてSが来たらその計算を終える。 と言うものです。 これに関して、どうしてもアルゴリズムが浮かびません。 y=1 Do Until Cells(y,1).Value = "" If Cells(y,1).Value = "F" Then … End If y=y+1 Loop と考えたのですが、こうなるとFが来た時だけしか処理をしません。 ランダムに来るFからSの部分を計算するにはどうしたらよいでしょうか? お知恵を拝借させて下さい。 お願いします。

  • かけ算に関してのアルゴリズム

    アルゴリズムに関して全くの初心者なので、お力を貸してくれると幸いです。 タイトルにもありますが、かけ算を使ってのアルゴリズムですが、足し算なり、引き算なりを使ったほうが効率がいいのですが、どのようにすればいいのか悩んでおります。 x=a*b-c*c+bd y=b*b-cc+a*d と全部で6つののかけ算があります。 新しい変数(例えば、temp=c*c のような)を作ってもかまいませんので、 かけ算の使用回数を3回までに押さえたいのです。 私が考えたのは、 x=b(a+d)-temp y=b(b+a)-temp+a(d-b) ほかに効率の良いアルゴリズムはありますでしょうか? よろしくお願いします

  • COUNTIF 検索条件

    エクセルで表を製作し、A列にはあ~おの文字列がランダムに配置されており、B列にはA~Dの文字列が同じくランダムに配置されている場合の状態にあります。 A列で"あ"が何個あるか=COUNTIF(A:A,"あ")でカウントできるのはわかったのですが、 A,B列内でA列で”あ”であり、かつB列で”A”であるという 検索条件が2つ「あ かつ A」である場合の個数のカウントはどのように指定したらよいのでしょうか。 初歩的な質問かとは存じますが アドバイスをお願いします。

  • エクセルの数をかぞえる関数のAND

    EXEL2003を使用しています。 A列には空白セル、「Y」「B」がランダムに入っています。 B列には、人物の名前「中村」「高橋」「村田」がランダムに入っています。 A列が「Y」で、B列が「高橋」の行の数だけをカウントする条件付関数はどうなるでしょうか? COUNTIFとAND関数を使用すると思うのですが、使い方がわかりません。 よろしくお願いします。

  • アルゴリズムについて(ちょい難問だと思います)

    (a,b)が(a>b)かつ(b>=0)を満たすとき x = a; y = b; while(y>0){ r = (xをyで割った余り); x = y; y = r; } return x;  (xを出力) というa,bの最大公約数を求めるアルゴリズムがあるとする。 ここでwhile文の実行回数(while文を行う回数)を L(a,b)とし、 F(n)をフィボナッチ数列とすると、 (つまり、F(0)=0,F(1)=1,F(2)=1, F(n+2)=F(n+1)+F(n) (n>=0)) 「L(a,b)=n」 ならば 「a >= F(n+1)」であることを示せです。 どうフィボナッチとループ回数を比較できるのか? うまく思いつきませんでした・・・ どなたかうまい方法思いついた方お願いします。

  • 確率が苦手で困っています。どなたかご教示ください。

    確率が苦手で困っています。解き方を教えていただけませんでしょうか。 ----------- 1~aまでの数字が書かれたボールが箱Aの中に入っています。しかし、箱Aの中には小さい箱Bが入っていて箱Bにはa個のボールのうちb(<=a)が入っています。 Sさんはb個のボールのうちc(<=)個にはどの数字が書いてあるかを知っています。 (Sさんは、箱Bの中に1~aまでの数字が書かれたボールのうちランダムに選ばれたb個が入っていることと、箱Bに入ってるb個のうちc個のボールに書かれている数字を知っていることになります。) このとき,箱Bから1個のボールを取り出したときにそのボールに書いてある数字をSさんが予想することになりました。 Sさんの予想が当たる確率は? ----------- というものです。 どなたかご教示いただけませんでしょうか。

  • 探索アルゴリズムの名称について

    以下の探索もしくは組み合わせのアルゴリズムに名称があるのかを教えていただければ幸いです. ある変数a1,a2,a3・・・,b1,b2,b3・・・があり(それぞれ小さい順にソートされている), このaとbにより影響する評価関数が最小となる最適な組を探索するアルゴリズムです. (1)まずa1・b1のペアを用いた時の値を算出する. (2)次にa2・b1のペアとa1・b2のペアでの値をそれぞれ算出し,小さい方を見つける. (今回はa1・b2のペアの方が小さかったとします.) (3)次にa2・b2のペアとa1・b3のペアでの値をそれぞれ算出し,小さい方を見つける. (2),(3)の様な処理を繰り返し行い,最小となるa・bの組を探索する. 以上の様なアルゴリズムなのですが,名称があるのかをお聞きしたいと思います. 言葉で書くとイメージしづらいですが,小学・中学ぐらいで勉強した最短経路問題のように 格子状の図を書くと分かりやすいと思います. 二方向のみをみて探索していきます. 個人的には,二分木探索に近いと思うのですがどうでしょうか? ただ,進み方によっては,同じ組み合わせを探索する事も出来るので, 完全な二分木探索ではないような気がします. 皆様のお力をお貸しいただければありがたいです. お願いいたします.

  • エクセルにて出現回数のカウントについて

    エクセルにて A列に、あ、い、う、がアトランダムに入力されている場合、B列に1を入れておくと、 SUMIFを使ってあ、い、う、がそれぞれ何個出てきたか、1をカウントすることで判りますが、 B列に1を入れずに、単純にあ、い、う、が何個あるか数えたいのですが、 実現可能でしょうか? 宜しくお願いいたします。

  • 分岐処理(アルゴリズム)

    C言語の初心者です。 C言語の分岐処理の書き方(アルゴリズム)について 分からない事があり質問しました。 A、B、C、Dという変数があり、 この変数にはランダムに、ある浮動小数が代入されます。 A、B、C、Dの値を比較して、 (1)一番小さい値が存在する場合 (2)一番小さい値が2つ存在する場合 (3)上記以外の場合 といったように場合分けを行い、 (1)一番小さい値をディスプレイに表示。 (2)アルファベット順で早い方  (Ex. AとBならA、但しDとAの場合はD)  をディスプレイに表示。 (3)Aをディスプレイに表示。 といったように、場合分けによってそれぞれ 処理を行いたいのです。 条件を&&や||で増やせばできると思うのですが、 端的に書くにはどうしたらよいか悩んでいます。 よろしくお願いします。

  • 遺伝的アルゴリズムの評価式に関する質問です。

    膨大な数の組み合わせから正解の組み合わせを求めるという大規模組み合わせ問題があったとします。 このような問題を遺伝的アルゴリズムを用いて解こうとしているのですが、今用いている評価式より良いアイデアが自分では考えつかなかったため質問します。 以下、問題や用いている遺伝的アルゴリズムに関する詳しい説明です。 例えば、仮に、23, 21, 65, 78, 43, 78, 83, 56, 78 ,89 の10個の数の組み合わせがあるとき、 合計して109になる組み合わせ(23,21,65)を見つけたいという問題です。(正解の組み合わせは複数個あっても、一個見つかれば良い。また正解の組み合わせは必ずあるものとする。) この問題を遺伝的アルゴリズム(GA)を使って解くとします。 以下、簡単なGAの説明です。 表現型に2進数ビット列を用いる。 個体数は200とし、初期個体はランダムで生成する。 評価式はf(x) = b/(b+|b-t|)(bは正解の組み合わせの合計値で、tは2進数ビット列で1を立てた場所の数の合計値である。)。終了条件はこの評価値がf(x)=1になることである。 交叉は一様交叉で突然変異も行う。 表現型について詳しく説明すると、 コード化に 0と 1の並びである2進数ビット列を用いて、 その場所に対応する数を加算する場合は1を, 逆に加算しない場合は0を遺伝子の表現型に立てビット列を生成しました。 例えば今回の正解の組み合わせ(109)を2進数ビットで表すと下のようになる。 23, 21, 65, 78, 43, 78, 83, 56, 78 ,89 1 1 1 0 0 0 0 0 0 0 ←2進数ビットを用いた表現型。 (1が立っている場所の数が加算されて合計で109となり、これが正解の組み合わせであることがわかる。) そして、この遺伝的アルゴリズムの評価式を f(x) = b/(b+|b-t|) とします。(bは正解の組み合わせの合計値で、tはビット列で1を立てた場所に対応する数の合計値である。) 評価式f(x)=1になる、つまり正解の組み合わせが見つかれば、遺伝的アルゴリズムは終了する。 この評価式で遺伝的アルゴリズムを回しているのですが、この簡単な評価式では近似解に陥ったとき、解を求めるのがどうしても遅くなってしまいます。 全体的に長く、わかりにくい説明で申し訳ないのですが、この評価式の改善案、またはこの遺伝的アルゴリズムの改善案などがあれば教えていただきたいです。 以上、よろしくお願いします。

専門家に質問してみよう