c言語初心者です。
今プログラムをc言語で作成しているのですが....
問題としては、
・最初にスタート地点とゴールを決める
・いくつかの巡回する候補地と制限時間Tを決める
・その結果、いくつかの候補地を回りながら、目的地にたどりつく
というもので
今組んでいるプログラムのアルゴリズムとしては、
1、まず、全候補地を総距離が最少になるようにルートをつくり、
2.時間内で巡回できるか判定を行い、できれば出力して終了、
3、できない場合は最後の巡回巡回した地点に行かないようにルートを更新し、2へ
っと言ったものです。
今最短経路だけを出力するプログラムはできたのですが、上の手順でいう2と3の部分の作り方がどうしてもわかりません
どなたか分かるかたがいれば、教えてください
#include "stdafx.h"
#include <stdlib.h>
#include <math.h>
#define N 5
struct POINT2
{
double x,y;
};
POINT2 point[N]={{0,0},{6,7},{3,5},{10,6},{1,18}};
int flag[N]; /* 通った点の記憶 */
int trace[N];
int trace2[N];
double distance;
void search(int n,int k,double sum) /* 探索 */
{
int i;
double x,y,d;
++n;
if(n > (N-1))
{
if(sum < distance)
{
distance = sum;
for(i=0;i<N;++i)
trace2=trace;
}
return;
}
for(i=0;i<N;++i)
{
if(flag == 0)
{
x=point[k].x-point.x;
y=point[k].y-point.y;
d=x*x + y*y;
d=sqrt(d);
if(distance > sum+d)
{
flag = 1;
trace[n] = i;
search(n,i,sum+d);
flag = 0;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[]) /* main文 */
{
int i,k;
distance = 10000000.0; /* 初期の長さ */
flag[0] = 1; /* スタートする点 */
trace[0]= 0;
search(0,0,0.0);
printf("順番 点番号\n");
for(i=0;i<N;++i)
{
k=trace2;
printf("%4d %4d (%7.2lf,%7.2lf) \n",i,k+1,point[k].x,point[k].y);
}
printf("\n%lf\n",distance);
return 0;
}
ちなみに、これがその作成したプログラムです。
どこに何を加えればよいのかなど、なるべく詳しくお願いします。
経路探索
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 経路探索
同じ内容の質問がありますので、こちらも閉鎖させて頂きます。
「今プログラムを作っているんですが... • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9750
「今プログラムを作っているんですが... • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9750
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。