前提・実現したいこと
巡回セールスマン(最短経路長を求める)の問題において、最近傍法を用いたプログラムを作りたいです。
最近傍法とは以下の方法です。
(1)適当な地点を選ぶ。
(2)その地点から最も近い地点を選択する。
(3)訪れた地点がなくなるまで(2)を繰り返す。
発生している問題・エラーメッセージ
数字を選択するところまでは出来たのですが、
その先でプログラムが強制終了してしまいます。
pt[0]=(0.251534 0.744804) pt[1]=(0.045473 0.989166) pt[2]=(0.559954 0.325205) pt[3]=(0.047273 0.975524) pt[4]=(0.963530 0.012970) r[0][0]=0.000000 r[0][1]=0.319646 r[0][2]=0.520755 r[0][3]=0.308146 r[0][4]=1.021039 r[1][0]=0.319646 r[1][1]=0.000000 r[1][2]=0.839961 r[1][3]=0.013760 r[1][4]=1.340070 r[2][0]=0.520755 r[2][1]=0.839961 r[2][2]=0.000000 r[2][3]=0.828104 r[2][4]=0.510260 r[3][0]=0.308146 r[3][1]=0.013760 r[3][2]=0.828104 r[3][3]=0.000000 r[3][4]=1.328923 r[4][0]=1.021039 r[4][1]=1.340070 r[4][2]=0.510260 r[4][3]=1.328923 r[4][4]=0.000000 1~5までの数の中から1つを入力してください:3
c
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> #define N 5 typedef struct xy{ double x; double y; }VTEX; int i,j,k,c,temp; VTEX pt[N]; double r[N][N]; double min,rmin; void ransuu(void){ srand((unsigned)time(NULL)); for(k=0;k<N;k++){ pt[k].x=(double)rand()/RAND_MAX; pt[k].y=(double)rand()/RAND_MAX; printf("pt[%d]=(%f %f)\n",k,pt[k]); } } void length(void){ for(i=0;i<N;i++){ for(j=0;j<N;j++){ r[i][j]=sqrt((pt[i].x-pt[j].x)*(pt[i].x-pt[j].x)+(pt[i].y-pt[j].y)*(pt[i].y-pt[j].y)); printf("r[%d][%d]=%f\n",i,j,r[i][j]); } } } void hantei(void){ //行が現在地点、列が目的地に対応する for(k=0;k<N;k++) r[k][k]=10.0; //同じところは訪れないよう経路の距離を大きな値に設定する printf("1~5までの数の中から1つを入力してください:"); scanf("%d",i); //今いる地点を地点iとする i=i-1; min=r[i][0]; for(k=0;k<N-1;k++){ for(j=0;j<N;j++) if(min>r[i][j]){min=r[i][j]; c=j;} //地点iからの最小距離を求め目的地をcとする for(k=0;k<N;k++) r[k][i]=10; //一度訪れた地点iに訪れないよう地点cに行くような経路の距離を大きい値にする temp=i; //i地点からc地点へ移動したので行列を入れ替える(c地点へ行く) i=c; c=temp; rmin=min++; //地点iから地点cまでの距離を加算していく printf("%f\n",rmin); } printf("最小経路長は%f\n",rmin); } int main(void){ ransuu(); length(); hantei(); return 0; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。