• ベストアンサー

複数の点を最短距離で全て繋ぐアルゴリズム

C++で以下のようなプログラムを書こうと思うのですが、 効率的なアルゴリズムが思い浮かびません。 よい方法をご存知の方がおりましたら教えてください。 ------------------------ xy平面上に複数の点があります。 それぞれの点の座標は全て分かっています。 今、原点から出発して全ての点を直線で結んでいくのですが このとき引く直線の長さの総計が最小になるような 結び方を見つけたいのです。 全ての結び方をしらみつぶしに調べると (点の数)! 通りの総直線距離を計算しなければならず 点が増えるとかなり苦しいことになります・・・

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

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

> 具体的に細かなアルゴリズムの組み方まで示したページは > なかなか見つからないですね・・・ こちら、GAの本なんかに載っているような標準的な方法ですが、図表なんかが多くて解説がわかりやすいです。 参考文献・資料も一緒に見ると良いとおもいます。 アルゴリズム入門 : 第 5 章 知識情報処理入門 http://www.microsoft.com/japan/msdn/academic/Articles/Algorithm/05/ #MSのサイト内ってのが灯台下暗しというか…。

参考URL:
http://www.microsoft.com/japan/msdn/academic/Articles/Algorithm/05/

その他の回答 (3)

  • goma_2000
  • ベストアンサー率48% (62/129)
回答No.4

GA等のヒューリスティクスを使うにしろ、全ての点の距離は計算しなくてはなりません。これらのヒューリスティクスな手法は、点の組み合わせを求める時に使用するものです。点の数が多い場合には距離を求めるのが難しい場合もありますからね。 今回は2次元であると条件が決まってますので、高速に解くには2次元をメッシュに切って解くのが良いでしょう。これは、メッシュ内の点同士の連結とメッシュ間の連結を分けて考える方法になります。当然、距離の計算は劇的に少なくなります。 例えば、x、y座標、それぞれに対して、10区間に分けるとすると、100個のメッシュが出来ます。このメッシュ間の距離を求めて、どのメッシュを繋いでいけばよいかを求めます。また、これとは独立に、メッシュ内に複数の点が含まれる場合には、メッシュ内での点の結び方を求めます。これらを総合すれば解が得られます。 どうでしょうか。

  • 2531kbps
  • ベストアンサー率13% (183/1333)
回答No.2

点の数や、制限時間でアルゴリズムは決まってくるんじゃないかなあ? GA(遺伝的アルゴリズム)は、大学時代隣の研究チームがやってましたが、処理中の経過を見るだけでも楽しかったです。 コストをかけられるなら、ここからここまでの処理をお前がやれと別PCに仕事を投げても良いし。このシステムを作るのも大変だ・・・。 コンピューター群が多ければ、仕事を投げる仕事も別PCに任せた方がよいです(笑)。場合によっては仕事の振り分けが間に合わず、ひまなPCが出てきます。

参考URL:
http://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

こちらは「巡回セールスマン問題」と呼ばれる、アルゴリズムの計算速度などの比較にも使われるようなモデル問題です。 逆に「巡回セールスマン問題」の解法などとして情報収集すると、過去に先人達が築き上げた色んなアルゴリズムが見つかると思います。 割と新しい方法で、最適解の保障が無い方法ですと、遺伝的アルゴリズムとか。 -- > 全ての結び方をしらみつぶしに調べると > (点の数)! 通りの総直線距離を計算しなければならず > 点が増えるとかなり苦しいことになります・・・ この方法は基準になりますから、一度組んでみてどれくらい遅いのか?というのを実感するのも良いかも。 点の数を調整すれば、計算に100年かかるって事も無いですし。

tententen_april
質問者

お礼

ありがとうございます。 そういえば聞いた事があるような気がします。 手法の簡単な紹介がされたページはたくさん見つかるのですが、 具体的に細かなアルゴリズムの組み方まで示したページは なかなか見つからないですね・・・

関連するQ&A

  • 原点が複数存在する座標系は可能ですか?

    普通のxy軸を持った座標は二本の直線が交差しているかたちで原点がひとつだけありますが、いま円を描いて、この円に内接する形で星型を描くと二本の線分(?)が交差する点が10個できますが、これは全て同じような原点の資格を持っているように思われます。このような複数の原点を持った座標を使っていろいろな関数のグラフを描くと全く違うものになりそうにも思うのですが、どうなのでしょう。

  • 空間図形なんですが・・・

    xy平面上の点A(rcosA,rsinA)を、x軸となす角θ(0≦θ,A≦π/2,θ≦A/2)のxy平面上の直線を軸として回転させたとき、 (1)点Aが描く円の方程式。 (2)(1)の円がxz平面と交わる点Bの座標。 (3)原点と点Bを結ぶ直線OBがx軸となす角度。 どうやって解けばいいですか?教えてください。

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

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

  • n角形の重心を求めるアルゴリズム

    平面2次元のn角形の頂点のデータがあります。n点の座標ですから(x,y)がn個並んでいます。そのような図形の図心(重心)の座標を計算するアルゴリズムがないでしょうか。最終的にはプログラムとして離散的な処理をするため、1%ぐらいの誤差は許容範囲です。n角形と言ってもせいぜいn=3,4,5,6程度です。 欲を言うと、3次元も考えており、平面に含まれることが分かっているn個の点(3次元空間内)を平面の2次元空間に変換して重心を求め、それを3次元空間に引き戻せば3次元での重心となります。そのためにも2次元での重心の座標を求めるアルゴリズムが必要なのです。 よろしくお願いします。

  • 座標平面上の距離の和の最小値

    はじめまして、こんにちは。 質問なんですが、 原点をOとする座標平面上に点Aがある。点Pは直線y=1/2x+2の上を動く このとき (1)OP^2+PA^2を最小とする点Pの座標を求めよ。 (2)OP+PAを最小とする点Pの座標を求めよ。 という問題なんですが、(1)と(2)の問いの違いがわかりません。 (1)では、P(a,1/2a+2)とおいて、OP^2とPA^2それぞれの2点間の距離を使い求めるとういことは理解できますが、(2)の解答には「点Oに関してy=1/2x+2に対する対称な点をとる」と書かれています。これ以外に解答の仕方はないのでしょうか。

  • 空間座標 球面上の点と空間にある点の距離について

    空間座標において 「『球面上の点と空間にある点P』との(最短)距離」は球面中心と点Pを結んだ距離と球面の半径と差で求めると思うのですが、感覚的にはわかる気がしますし、平面座標だと分かりますが、空間座標になると本当にそうなのかと思ってしまいます。式で証明することができるのでしょうか。 また、「『球面上の点と直線の点』との距離」や「『球面上の点と平面の点』との距離」も同じように球面の半径から直線の点もしくは平面の点に垂線を下ろして考えるのでしょうか。

  • 数学の問題がわかりません。

    3次元空間における点Pはx,y,zの直交座標系で成分(1,1,1)を持つとしたとき、原点と点Pを通る直線をLとする。 (i)点Pを通り、直線Lと垂直な平面をQとするときのQとxy平面の交線の式を求めよ (ii)点Pを通り、直線Lと30度の角度をなす直線を直線L周りに回転させる。 このとき、直線とxy平面の軌跡は楕円を描く。この楕円の中心を求めよ。 という問題なのですが、どう解けばいいかがわかりません。 どのように導入をするのか、式をつかえばいいかがわからないので 教えて頂きたいです。 よろしくお願いします。

  • 整数の問題で、127x-37y=0とこの直線上にない格子点との距離を求める問題

    整数問題から、ユークリッダ互徐法の問題で、 「xy平面上の直線127x-37y=0と、この直線上にない平面上の格子点(x、y座標とも整数の点)との距離の最小値を求めよ」という問題で、分からないので解答を見たところ、 格子点を(a、b)[a、bは整数]とおいて、直線127x-37y=0との距離より |127a-37b|/√(127^2+(-37)^2)より、(a、b)はこの直線上にないので、 127a-37b≠0なので、127a-37b=1になることがあれば、距離の最小値となるので、 1/√(127^2+(-37)^2)=1/√17498 とあります。 なぜ、127a-37b=1が最小値となるのでしょうか? 右辺の値が1であることの根拠が分かりません。 127と37が互いに素、即ち127と37の最大公約数が1のとき、 127a-37b=1となる整数a、bは右辺=1のときしか、 存在しないという意味でしょうか? どうか、よろしくお願いします。

  • 2次元平面における2点間の平均距離

    xy座標平面上の(0,0),(a,0),(0,b),(a,b)の4点からなる平面AB. その平面ABに含まれる2点を任意に選んだ時 その2点間の距離をa,bを使って表したいです. お願いします.

  • 2点間の距離の公式と点と直線の公式の関係

    xy平面上に放物線y=x^2と点P(0,b)を考える。ただしb>0とする。点X(t,t^2)がこの放物線上を動くとき線分BXの長さの最小値を求めよ。」という問題なのですが、解答では、2点間の距離の公式から立式して解いているのですが、私は、点X(t,t^2)における接線を求めて、その直線と点において、点と直線の公式を使って求めようとしましたが、どこが行けないのでしょうか、確かに回りくどいですが、まちがってはいませんよね。点と直線の公式では、 BX^2={(t^2 + b)^2} / 4t^2 + 1 になってしまって、2点間の距離の公式の結果と違ってしまいました。よろしくお願いします。

専門家に質問してみよう