• 締切済み

Microsoft Visual Studio 2005の関数のことで

Microsoft Visual Studio 2005の関数のことで聞きたいことがあります。 6地点への配達物がある。この5地点を1回だけとおり、移動距離が最小となる巡回順路を求めよ。 6地点の座標は次の通りである。  a(2,2), b(3,3), c(5,4), d(4,2), e(2,5), f(5,0)、ただし、第1番目はaを訪問することとする。 という問題なのですが、どうやってプログラムを書けばいいのかわかりません… 一応、ヒントとして、2地点(x1,y1),(x2,y2)の距離は、√(x1-x2)^2+(y1-y2)^2で算出できるとあります。 そして、もう一つのヒントが、地点a,b,c,d,e,fを1から6の地点とする。 第1の地点、第2の地点。。。第6の地点の地点に対して、1から6を割り当てる。 たとえば、経路として 1-2-3-4-5-6 は一巡の経路になる。一方、1-2-1-3-4-5と なる経路は、a-b-aというように元に戻っているので一巡の経路ではない。 このように、第1の地点に1から6、第2の地点に1から6のように、第1の地点から 第6の地点のそれぞれを1から6の割り当てを行う。この中で、一度、割り当てた地点 が再度割り当てられて場合は、一巡経路でないとして組み合わせから外せば、一巡 経路を求めることができる。その一巡経路の距離を算出し、最短の経路を求めるプロ グラムを作成する。 もうお手上げ状態なので、どなたかわかる方がいましたら、教えて欲しいです。 よろしくお願いします。

noname#114320
noname#114320

みんなの回答

回答No.2

6つの点を並べてできる順列は6!通り。 そのそれぞれに対し移動距離を求め、最小となるものを探す。 6!=720通りなら総当たりでも大した時間はかかりません。

回答No.1

とりあえずC# http://ideone.com/saAA9 自分はC/C++をつかいこなせてないのでそういうコードになっていない。 確かVBカテにも提出されていた質問だったから VB.NETをご所望で、こちらの気が向いたら書き直すかも。 #自分のってやさしくないコードだなあ…

関連するQ&A

  • Microsoft Visual Studio 2005の関数のことで

    Microsoft Visual Studio 2005の関数のことで聞きたいことがあります。 6地点への配達物がある。この5地点を1回だけとおり、移動距離が最小となる巡回順路を求めよ。 6地点の座標は次の通りである。  a(2,2), b(3,3), c(5,4), d(4,2), e(2,5), f(5,0)、ただし、第1番目はaを訪問することとする。 という問題なのですが、どうやってプログラムを書けばいいのかわかりません… 一応、ヒントとして、2地点(x1,y1),(x2,y2)の距離は、√(x1-x2)^2+(y1-y2)^2で算出できるとあります。 そして、もう一つのヒントが、地点a,b,c,d,e,fを1から6の地点とする。 第1の地点、第2の地点。。。第6の地点の地点に対して、1から6を割り当てる。 たとえば、経路として 1-2-3-4-5-6 は一巡の経路になる。一方、1-2-1-3-4-5と なる経路は、a-b-aというように元に戻っているので一巡の経路ではない。 このように、第1の地点に1から6、第2の地点に1から6のように、第1の地点から 第6の地点のそれぞれを1から6の割り当てを行う。この中で、一度、割り当てた地点 が再度割り当てられて場合は、一巡経路でないとして組み合わせから外せば、一巡 経路を求めることができる。その一巡経路の距離を算出し、最短の経路を求めるプロ グラムを作成する。 もうお手上げ状態なので、どなたかわかる方がいましたら、教えて欲しいです。 よろしくお願いします。

  • Microsoft Visual Studio 2005の関数なのです

    Microsoft Visual Studio 2005の関数なのです。 6地点への配達物がある。この5地点を1回だけとおり、移動距離が最小となる巡回順路を求めよ。 6地点の座標は次の通りである。  a(2,2), b(3,3), c(5,4), d(4,2), e(2,5), f(5,0)、ただし、第1番目はaを訪問することとする。 という問題があるのですが、これは、どうやってやればいいのでしょう? ここまでくると、もうサッパリです。 よろしければ、教えていただきたいです。

  • Microsoft Visual Studio 2005の関数なのです

    Microsoft Visual Studio 2005の関数なのですが・・・ 今まではこういう風にやっていたのですが・・・ #include<stdio.h> int main() { double a,b,n; a=10.0; b=20.0; printf("実数A=%f",a); printf("\n実数B=%f",b); n=a+b; printf("\n加算:%lf\n",n); return 0 } 今日から関数を使うことになりました。 関数を使ったやり方がわからないので、教えていただきたいです。 問題は… 2つの実数X,Yを定義し、それぞれ、20.0, 30.0 を代入した後、その加算、減算、積算、除算、あまりの算出を関数を用いて行い、その結果が画面に表示せよ。除算の場合の割る値が0の場合は、エラーを画面に表示すること。 よろしくお願いします。 ちなみに、言語はC++です。

  • Microsoft Visual Studio 2005の関数なのです

    Microsoft Visual Studio 2005の関数なのです Microsoft Visual Studio 2005の関数なのですが・・・ 今まではこういう風にやっていたのですが・・・ #include<stdio.h> int main() { double a,b,n; a=10.0; b=20.0; printf("実数A=%f",a); printf("\n実数B=%f",b); n=a+b; printf("\n加算:%lf\n",n); return 0 } 今日から関数を使うことになりました。 関数を使ったやり方がわからないので、教えていただきたいです。 問題は… 2つの実数X,Yを定義し、それぞれ、20.0, 30.0 を代入した後、その加算、減算、積算、除算、あまりの算出を関数を用いて行い、その結果が画面に表示せよ。除算の場合の割る値が0の場合は、エラーを画面に表示すること。 よろしくお願いします。 ちなみに、言語はC++です。

  • 2点間の距離を変えない1次変換

    お世話になります。 【問題】 行列 ( a b ) ( c d ) が、2点間の距離を変えない1次変換であるとき、ad - bc の値を求めよ。 【正解】 ad - bc = ±1 【自分の解答】 2点をA ( x1 , y1 ) , B ( x2 , y2 )、行列によって移される点をA' , B' とすると A' ( a*x1 + b*y1 , c*x1 + d*y1 ) B' ( a*x2 + b*y2 , c*x2 + d*y2 ) となる。 条件より ( A , B 間の距離 ) = ( A' , B' 間の距離 ) なので ( A , B 間の距離 )^2 = ( A' , B' 間の距離 )^2 よって ( x2 - x1 )^2 + ( y2 - y1 )^2 = { ( a*x2 + b*y2 ) - ( a*x1 + b*y1 ) }^2 + { ( c*x2 + d*y2 ) - ( c*x1 + d*y1 ) }^2 =( a^2 + c^2 )( x2 - x1 )^2 + 2( ab + cd )( x2 - x1 )( y2 - y1 ) + ( b^2 + d^2 )( y2 - y1 )^2 ∴ a^2 + c^2 = 1 ab + cd = 0 b^2 + d^2 = 1 (ここから不明) 【質問】 途中まで上のように頑張ってみましたが、正しいかわかりません。 正しければ続きかヒントを、間違いであれば修正かヒントを下さいませんか。 よろしくお願いします。

  • 関数f(x1,x2,x3,x4,x5)が最大値となるようなx1,x2,x3,x4,x5の求め方

    変数を5つもつ関数f(x1,x2,x3,x4,x5)があります。 関数f(x1,x2,x3,x4,x5)は、一言では言い表せないような複雑な式とします。 y=f(x1,x2,x3,x4,x5)としたとき、 yが最大になるようなx1,x2,x3,x4,x5はどのようにして求めればよいでしょうか? 例えば、、、 (1) x2,x3,x4,x5を適当な値に固定し、x1を変化させてyが最大となるようなx1を求める。(このときのx1をaとする) (2) x1をaに、x3,x4,x5を適当な値に固定し、x2を変化させてyが最大となるようなx2を求める。(このときのx2をbとする) (3) x1をaに、x2をbに、x4,x5を適当な値に固定し、x3を変化させてyが最大となるようなx3を求める。(このときのx3をcとする) (4) x1をaに、x2をbに、x3をcに、x5を適当な値に固定し、x4を変化させてyが最大となるようなx4を求める。(このときのx4をdとする) (5) x1をaに、x2をbに、x3をcに、x4をdに固定し、x5を変化させてyが最大となるようなx5を求める。(このときのx5をeとする) このとき、f(a,b,c,d,e)は最大値?? 多分、違いますよね。

  • 関数

    関数 y=f(x)とx=f(y)は関数として、等しいというのは合っていますか? また、(1)f(x)=e^x/(e^x+1)のときy=f(x)の逆関数y=g(x)を求めよ。 (2)(1)のf(x)、g(x)に対し、 (A)∫(a~b)f(x)dx+∫(f(a)~f(b))g(x)dx=bf(b)-af(a)をしめせ。 (解答) f(x)の値域は、0<y<1{(e^x)+1}y=e^x (1-y)e^x=y⇔x=log(y/1-y) xとyを入れ替えて、g(x)=log(x/1-x) (2)I=∫(f(a)~f(b))g(x)dxとする。 f(x)はg(x)の逆関数だから、y=g(x)より、x=f(y) dx=f‘(y)dy また、g(f(a))=a,g(f(b))=bとあるのですが、 これらは、y=g(x)とx=f(y)を合成したものだ、としても、本質的には、問題ないですよね

  • 二次関数の係数と切片 オーバーフローになってしまいます

    二次関数の通る、二つの座標(x1,y1)、(x2,y2)から y=ax+bの、aとbを求めるプログラムを目指して作ったのですが、 実行すると値がNANになってしまいます。 アドバイスしていただけないでしょうか? ソースです ↓ #include<stdio.h> double main(){ double x1,x2,y1,y2,a,b,a1,a2; printf("x1="); scanf("%f",&x1); printf("y1="); scanf("%f",&y1); printf("x2="); scanf("%f",&x2); printf("y2="); scanf("%f",&y2); printf("***RESULT***\n"); printf("y=%f x+ %f",a,b); a1=y1-y2; a2=x1-x2;      a=a1/a2; b=y1-a*x1; return 0; }

  • 2点の座標と弧の関係

    早速ですが、皆様のお知恵を貸してください。 今悩んでいるのは、昇華型プリンターから排出されたペーパーのカットされた瞬間 における、ペーパー先端の位置座標を計算で出そうとしております。 分かっているのは、紙の長さ(弧長)とその自由高さ(カールしてますので)。 プリンターのカッターの位置座標とペーパーを支えているプリンターの出口座標だけです。 CADで描けばすぐ出せるのですが、何百回も行うので、エクセルで集計したいと 考えています。当然計算と実際の値が違うことも承知しております。 計算してもどうしてもシュミレーション値と算出値が合わないので何卒、解る方がおりましたら 力を貸してください。 また、ネットで円と円の交点を求める計算式を見つけたのですがこれもまた良く解りません?円1(X1,Y1)半径R1、円2(X2,Y2)半径R2の時、 A=Y1-Y2 B=X2^2+R2^2-X1^2+A^2-R2^2 C=-4*((X1-X2)^2+A^2) D=8*A^2*X1-4*B*(X1-X2) E=4*A^2*X2^2-4*A^2*X1^2-B^2 とすると(X、Y)座標は F=(ーD+SQRT(D^2-4*C*E))/(2*C)と(ーDーSQRT(D^2-4*C*E))/(2*C)・・X座標 G=Y1+SQRT(R1^2-(F-X1)^2)・・Y座標と言うのですが、 何故A式を行うのか?。B、C、D,E式はどんな方程式から出てくるのか? Fは二次方程式の解の公式で、C~Eを当てはめている事は分かります。 以上、長くなりましたが、解る方がいればこれについてもお願いいたします。

  • エクセルにおけるデータ入替えについて

    こんにちは,毎回お世話になっております. エクセルについての質問です.以下のようにデータを並べ替えたいのですが,どうすればよろしいでしょうか.ご教授宜しくお願いいたします.(ずれててわかりにくいと思いますが,大文字のアルファベットはエクセルの行や列の場所,x1,x2,x3・・・,y1,y2,y3・・・は数字と思ってください.) A B A x1 x2 B y1 y2 C x3 x4 D y3 y4 E x5 x6 F y5 y6 ↓ A B A x1 y1 B x2 y2 C x3 y3 D x4 y4 E x5 y5 F x6 y6

専門家に質問してみよう