道順組み合わせの最短距離有無の式について

このQ&Aのポイント
  • 最短距離でなく同じ所を2度通らない組み合わせには式や解き方が存在するのか?
  • 2度通らない条件での組み合わせの式が存在すれば、敷や解き方を教えていただけないか。
  • アルゴリズムを使用しなければ回答できない場合でも、アルゴリズムのさわりだけでも嬉しい。
回答を見る
  • ベストアンサー

道順組み合わせの最短距離有無の式について

最近、道順に関する組み合わせを題材にした組合せ爆発の動画が話題になっており、 それを見たのですが・・・ 同じ所を2度通らない道順の組み合わせでの式がわかりません・・・ 最短距離に関する組み合わせは、高校数学で習うと思うですが、最短距離でなく同じ所を2度通らない組み合わせに式など存在するのでしょうか?(画像参照) 2x2の場合、最短距離は6通りですが、2度通らない条件だと12になってしまいます。 3x3の場合、最短距離は20通りですが、2度通らない条件だと184通り 4x4の場合、最短距離は70通りですが、2度通らいない条件だと8512通りになります。 2度通らない条件での式が存在すれば、敷や解き方教えていただけないでしょうか? もし「アルゴリズム」というものを使用しなければ回答することができなければ、アルゴリズムのさわりだけでも教えていただけると嬉しいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.3

No.2です。 動画見ました。 あの終わり方はちょっと寂しいですね。 さて、道順の数を求める方法ですが、動画でも「最先端のアルゴリズム技術」と述べていますし、 No.2で示したリンク先にも正方形の場合は数が書いてあるだけであったので、やはりアルゴリズムを使うしかないのだと思います。 そこで実際にプログラムを書いてみました。言語はVBScript(WScript)ですが、VBAでも「Call Kumiawase_Bakuhatsu」の行を削除すれば動きます。 使ったアルゴリズムですが、行けるところに行ってゴールに到達したら数えるという単純なものなのです。 なお、このプログラムで実用的に計算できるのはせいぜい5x5だと思います。 もし6以上の数を入れて計算が終わらなくなったら、VBScriptならタスクマネージャからプロセスの終了を、VBAならBreak (Ctrl + Pause)を行ってください。 Option Explicit Dim N '1辺の点の数 兼 終点の座標 Dim No_Entry() '立入禁止地図。立入禁止(外、立入済)は1、立入可は 0 Dim Counter Dim x_Next, y_Next '次(周囲)の点の座標加算値の配列 Call Kumiawase_Bakuhatsu 'VBscriptの実行開始点・VBAでは削除(orコメントアウト) Sub Kumiawase_Bakuhatsu() '初期化と計数開始 Dim i N = InputBox("正方形の分割数(1辺の道の数)を入力してください") + 1 ReDim No_Entry(N + 1, N + 1) '立入禁止地図の初期化 For i = 0 To N + 1 '外にはみ出さないように周囲は立入禁止 No_Entry(0, i) = 1: No_Entry(N + 1, i) = 1 No_Entry(i, 0) = 1: No_Entry(i, N + 1) = 1 Next x_Next = Array(0, 0, -1, 1) '次(周囲)の点のx座標加算値・上下左右の順 y_Next = Array(-1, 1, 0, 0) '次(周囲)の点のy座標加算値・上下左右の順 Counter = 0 '道順数カウンタ初期化 Call Michi_Jun(1, 1) '道順数計数開始。開始点は座標(1,1) MsgBox N - 1 & " x " & N - 1 & vbCrLf & vbCrLf & Counter & " 通り" End Sub Sub Michi_Jun(ByVal x, ByVal y) '道順数計数 Dim i If x = N And y = N Then '終点なら道順が見つかったので Counter = Counter + 1 'カウントし、 Else '終点でないなら No_Entry(x, y) = 1 '現在地を立入禁止にし、 For i = 0 To 3 '次の点のうち行けるところに(再帰的に最後まで)行き If No_Entry(x + x_Next(i), y + y_Next(i)) = 0 Then Call Michi_Jun(x + x_Next(i), y + y_Next(i)) End If '(どこにも行けなければそのま現在地で) Next '行けるところすべてに行って現在地に戻ってきたら No_Entry(x, y) = 0 '現在地の立入禁止を解除し、 End If End Sub '戻る。

nakki-
質問者

お礼

2度も回答有り難うございます! ちょっと儚いですよね・・・ 数学の壮大さを目の当たりにしました( わざわざプログラムを書いてくださりありがとうございます! 戸惑いながらも、実際に実行してみましたー いやぁ・・・すごいですね 感激しました!! 5x5でも40秒かかってしまいました( 6x6は、5分たっても返答帰ってこないので、まだ放置していますw 簡単なものでも、結果が膨大になると、やはり時間も膨大にかかってしまうんですね( VBScript というものを初めて知る切っ掛けにもなりましたし、とても感謝しています。 ありがとうございます!

その他の回答 (2)

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.2

最短距離でない場合の式ですが、英語のページが1つだけみつかりました。 http://www.iwriteiam.nl/Crook_path.html チェスのrook path 問題というものと同等だと書いてありますが、rook pathっていったい何でしょうね。 まず、経路の数え方の基準ですが、質問者様は変の長さ(道の数)で数えていますがリンク先は点の数で数えていました。そのため、質問者様の数え方の方が1だけ大きくなっていますのでご注意ください。 以下、リンク先の内容を質問者様の数え方で書きます。 まず、1xnは2^nと単純です。 2以上の場合ですが、とても複雑なようです。 2xn、3xn、4xnの場合は、nが大きいところでの漸化式が書いてありましたが、正方形などnが大きくないところでは数が書いてあるのみでした。 ともかく難しい数学の話であるうでに英語なのでよくわからないというのが正直なところです。

参考URL:
http://www.iwriteiam.nl/Crook_path.html
nakki-
質問者

お礼

回答ありがとうございます! 数式で取り扱うと、とても難しくなるんですね・・・ やはり、2xn、3xn、4xnの個別の式はあるが、2x2、3x3、4x4...と大きくしていく際の式はないのか、気になります・・・ わざわざ英語の解説ページを探してくださりありがとうございます!

  • kotetu12
  • ベストアンサー率36% (9/25)
回答No.1

http://www.kwansei.ac.jp/hs/z90010/sugaku1/kakuritu/combi2/combi2.htm 詳しく書いてあります。 道順に応用出来るそうです。

nakki-
質問者

お礼

回答ありがとうございます!

nakki-
質問者

補足

リンク先を熟読してみましたが、残念ながら書かれているのは、既に式が分かっている「最短ルートでの道順」です。 最短ではなく、「『同じ所を2度通らず』スタートからゴールまで行く道順の個数」を求めたいのです。 様々な計算を行いましたが、見つからず・・・ 数学って難しいですよね・・・

関連するQ&A

  • 高1数学の道順の問題です

    (1)BからCまで、最短距離でいく道順は何通りですか (2)AからCまで、最短距離でいく道順は何通りですか 答えには、Bの一つ東の点をB1とするとBからCへいく最短の道順の数はB1からCへいく 最短の道順の数にひとしい。 とかいているのですがよく意味がわかりません これの基本問題の四角形の道順のとはどう違うのでしょうか 解説も一緒にお願いします

  • 高1数学の道順の問題です

    (1)BからCまで、最短距離でいく道順は何通りですか (2)AからCまで、最短距離でいく道順は何通りですか 答えには、Bの一つ東の点をB1とするとBからCへいく最短の道順の数はB1からCへいく 最短の道順の数にひとしい。 とかいているのですがよく意味がわかりません B1というのはどこのことなのか、 なぜB1とするとBからCへいく最短の道順の数はB1からCへいく 最短の道順の数にひとしいのかもわかりません これの基本問題の四角形の道順のとはどう違うのでしょうか 解説も一緒にお願いします

  • 確率 最短距離の問題

    考えてみましたが、よくわからないので教えてください。 横5マス、縦6マスの碁盤の目のようになっている道の最短距離の道順の総数の求め方は 11C5=11C6=462通り とあります。同じ物を含む順列の考え方を使えば普通にわかるのですがこのコンビネーションを使ったやり方がわかりません。 よろしくお願いいたします。

  • 2つの放物線間の最短距離

    2つの放物線間の最短距離をラグランジュの未定乗数法を用いて求める方法を教えていただけないでしょうか. 2つの式はそれぞれ y=x^2・・・(1) y=-3(x-1)^2・・・(2) です. 個人的には 式(2)上の1点を(a,b)と置く. 式(1)上の任意の一点(x,y)との距離を√(x-a)^2+(x-b)^2 と表す. f(x,y)=√(x-a)^2+(x-b)^2 g(x,y)=y-x^2=0 と置き,ラグランジュの未定乗数法を用いて(a,b)でのf(x,y)の最小値を出す. aについての増減表を書いて最短距離と放物線上の2点を求める. という方法で求められるのではないかと思ったのですが,最小値を求めることができませんでした. 図書館などで微積分の演習書を全部調べましたが同じような問題を見つけることができず,困っています. 宜しくお願いします.

  • 長方形の中の網目状に道がある。対角間を最短距離で進む時、道順は何通りあるか?

    ---- ---- ---- l   l   l   l ---- ---- ---- l   l   l   l --- - ---- ---- l   l   l   l ---- ---- ---- 図が悪いのですが、長方形の中に縦4本横3本の線が引いてあります。(網目状になっています。) 長方形の右下をA左上をBとします AB間を最短距離で進む時、道順は何通りあるか? 本日の数学の問題です。いったい何通りあるのですか?気になって仕方ありません。 ぼくは40本だと思うのですが。

  • この問題の解答お願いします

    (1)AからBまで、最短距離で行く道順は何通りあるか。 (2)BからCまで、最短距離で行く道順は何通りあるか。 (3)AからCまで、最短距離で行く道順は何通りあるか。 解説お願いしますm(__)m

  • 確率の問題です。教えてください!!

    座標平面上に2点A(0、-1)B(5,2)をとる。 x座標、y座標がともに整数である点を結んでできる道があり、点Aから点B へ最短距離で行く道順について考える。 道順は全部で何通りあるか。 (1)(i)x軸上を通るのは点(2.0)のみであるような道順は何通りあるか。 (ii)x軸上を通るのは2点(2,0)(3.0)を端点とする線分のみであるような 道順は何通りあるか。 (2) 一つの道順でx軸上を進む距離をXで表す。 (1)(i)はx=0、(ii)はx=1のそれぞれの場合の例である。 Xの期待値を求めよ。 考え方と解き方が分かりません。 詳しく教えて下さい!! よろしくお願いします

  • 点Qから最短距離の点Piを効率的に求めたい

    平面上にP1,P2,...,Pnが与えられています。 このとき、任意の点Qを与えると、Qからの距離の最短の点(等距離の点が複数あれば、そのうちの任意の1点)を返す関数(任意といった時点で数学的には関数でなくなっていますが)が欲しいのです。 単純に考えれば、forループで、全てのPiとの距離を求め、最短のPiを返せば良いのですが、点Qが移動する場合、直前のQに対応するPiである可能性が高いので、もう少し賢いアルゴリズムがある気がします。しかし、具体的なアルゴリズムが思いつきませんので、お知恵をお貸しください。 プログラミングはCを想定しています。

  • 楕円内の任意の点から楕円周までの最短距離

    長半径がaで、短半径がbである楕円内に、ランダムに点(座標X0,Y0)をプロットし、その点から楕円周までの最短距離をperlを使って計算したいと思っています。 最終的には、最短距離の分布がどのようになっているのかを求めたいと思っています。   この計算の結果は、細胞の形を楕円に近似したときに、特定の組織の位置がランダムな場所にあるのか、細胞の表面近くに存在する傾向があるのかを調べるためのコントロールデータとして使う予定でいます。   しかし、座標X0,Y0から、楕円周までの最短距離をどのようにして計算したらよいのか見当もつきません。計算過程は省いていただいても構いませんので、最終的にどのような式を使えば計算できるのか、教えていただけないでしょうか。 よろしくお願いします。

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

    膨大な数の組み合わせから正解の組み合わせを求めるという大規模組み合わせ問題があったとします。 このような問題を遺伝的アルゴリズムを用いて解こうとしているのですが、今用いている評価式より良いアイデアが自分では考えつかなかったため質問します。 以下、問題や用いている遺伝的アルゴリズムに関する詳しい説明です。 例えば、仮に、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になる、つまり正解の組み合わせが見つかれば、遺伝的アルゴリズムは終了する。 この評価式で遺伝的アルゴリズムを回しているのですが、この簡単な評価式では近似解に陥ったとき、解を求めるのがどうしても遅くなってしまいます。 全体的に長く、わかりにくい説明で申し訳ないのですが、この評価式の改善案、またはこの遺伝的アルゴリズムの改善案などがあれば教えていただきたいです。 以上、よろしくお願いします。