ページ 1 / 1
今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 03:08
by ryo
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;
}
ちなみに、これがその作成したプログラムです。
どこに何を加えればよいのかなど、なるべく詳しくお願いします
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 07:20
by beatle
もしかして
キューについての方と同じ方でしょうか?だとしたら、先にそちらへ回答の投稿をお願いいたします。
それから、ソースコードをそのまま貼付けられると非常に読みにくいため、codeタグで囲むようにしてください。
フォーラムルールと
投稿前チェックリストを是非御覧ください。
ソースコードをちらっと見ると、どうやら標準的なC言語ではなくて、Microsoft Visual C++専用C言語に見受けられますが、それでよろしいのでしょうか。
[hr]
追記:
経路探索との二重投稿です。
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 10:23
by ryo
>もしかしてキューについての方と同じ方でしょうか?だとしたら、先にそちらへ回答の投稿をお願いいたします。
いえ、私はこの方とは別人です。
すいませんでした、ルールをよく読まず投稿してしまい、皆さん不快な思いをされたと思います。
なので、改めてソースこーどを載せます。
因みに、Microsoft Visual C++専用C言語
問題としては、
・最初にスタート地点とゴールを決める
・いくつかの巡回する候補地と制限時間Tを決める
・その結果、いくつかの候補地を回りながら、目的地にたどりつく
というもので
今組んでいるプログラムのアルゴリズムとしては、
1、まず、全候補地を総距離が最少になるようにルートをつくり、
2.時間内で巡回できるか判定を行い、できれば出力して終了、
3、できない場合は最後の巡回巡回した地点に行かないようにルートを更新し、2へ
っと言ったものです。
今最短経路だけを出力するプログラムはできたのですが、上の手順でいう2と3の部分の作り方がどうしてもわかりません
どなたか分かるかたがいれば、教えてください
コード:
[code=c]
#include "stdafx.h"
#include <stdio.h>
#pragma warning(disable : 4996)
#include <stdlib.h>
#include <math.h>
#define N 5
struct POINT2
{
double x,y;
//POINT2*before; /* 前に通った点 */
//POINT2*after; /* 最後に通った点 */
};
POINT2 point[N]={{0,0},{6,7},{3,5},{10,6},{1,10}};
int flag[N]; /* 通った点の記憶 */
int trace[N];
int trace2[N];
double distance;
double T; /* 制限時間 */
double v =0; /* 速度 */
void search(int n,int k,double sum_d,double sum_t) /* 探索 */
{
int i;
double x,y,d,t;
++n;
if(n > (N-1))
{
//if(sum < distance)
if(sum_d < distance)
{
//distance = sum;
distance = sum_d; /* 新たな距離を代入 */
T = sum_t;
for(i=0;i<N;++i)
trace2[i]=trace[i];
}
return;
}
for(i=0;i<N;++i)
{
if(flag[i] == 0)
{
x=point[k].x-point[i].x;
y=point[k].y-point[i].y;
d=x*x + y*y;
d=sqrt(d); /* 二点間の距離 */
t=d/v; /* かかる時間 */
//if(distance > sum+d)
if(distance > sum_d+d)
{
flag[i] = 1;
trace[n] = i;
//search(n,i,sum+d);
search(n,i,sum_d+d,sum_t+t);
flag[i] = 0;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[]) /* main文 */
{
int i,k;
//T = 10;
distance = 10000000.0; /* 初期の長さ */
flag[0] = 1; /* スタートする点 */
trace[0]= 0;
printf("速度 = ");
scanf("%d\n",&v);
search(0,0,0.0,0.0);
printf("順番 点番号\n");
for(i=0;i<N;++i)
{
k=trace2[i];
printf("%4d %4d (%7.2f,%7.2f) \n",i,k+1,point[k].x,point[k].y);
}
printf("\n%lf\n",distance);
printf("%lf\n",T);
return 0;
}
[/code]
ちなみに、これがその作成したプログラムです。
本当に初心者なため、なるべく詳しくお願いします
何度もすいませんでした。
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 10:36
by non
質問です。
1 距離と時間との関係はどうなっていますか?
2 時間内に収まらないときは、最後の巡回地点だけ行かないでいいですね。途中でなく。
3 自分で作ったプログラムですよね。
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 10:38
by non
もう一つ
>・最初にスタート地点とゴールを決める
ゴールも最初から決まっているのですか?
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 13:01
by ryo
>nonさん
>1 距離と時間との関係はどうなっていますか?
すいません、説明不足でした
最初に移動速度も入力し、それを距離で割って時間を出しています
>2 時間内に収まらないときは、最後の巡回地点だけ行かないでいいですね。途中でなく。
はい、大丈夫です
>3 自分で作ったプログラムですよね。
厳密に言えば、友達に聞きながら作成したため、一人の力という訳ではありませんが、調べながら頑張ってます
>ゴールも最初から決まっているのですか?
はい、もともとスタートとゴールはあらかじめ決めて、そこにたどりつくまでに制限時間内で、どれだけ多く回れるかを
目的としています。
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 13:24
by non
ryo さんが書きました:
>ゴールも最初から決まっているのですか?
はい、もともとスタートとゴールはあらかじめ決めて、そこにたどりつくまでに制限時間内で、どれだけ多く回れるかを
目的としています。
そうすると、現在のプログラムは、ゴールが指定されていないということなりませんか?
また、現在のスタートは 0番目の地点となっていますが、スタート地点やゴール地点は固定ですか?
それとも、変更可能にするのでしょうか?
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 13:40
by ryo
non さんが書きました:ryo さんが書きました:
>そうすると、現在のプログラムは、ゴールが指定されていないということなりませんか?
また、現在のスタートは 0番目の地点となっていますが、スタート地点やゴール地点は固定ですか?
それとも、変更可能にするのでしょうか?
そうですね、現在はとりあえず固定した形で作成しました。
これから、入力できるようにしていきたいと思っています。
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 13:47
by non
ryo さんが書きました:そうですね、現在はとりあえず固定した形で作成しました。
これから、入力できるようにしていきたいと思っています。
じゃ、それは先に作ってもらわないと、先に進めませんね。
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 14:09
by ryo
non さんが書きました:ryo さんが書きました:そうですね、現在はとりあえず固定した形で作成しました。
これから、入力できるようにしていきたいと思っています。
じゃ、それは先に作ってもらわないと、先に進めませんね。
そうですね。
今作成中なのですが、よろしかったらそれについてのアドバイスもいただけないでしょうか?
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 14:28
by non
スタート地点がflag[0] = 1;
なら、ゴール地点に2でもいれておきますか。
再帰呼び出しの、 if(n > (N-1))
を1個前までにして、最後の経由地点からゴールまでの距離をそのときに一緒に求めるのかな?
Re: 今プログラムを作っているんですが...
Posted: 2011年12月12日(月) 14:48
by ryo
non さんが書きました:スタート地点がflag[0] = 1;
なら、ゴール地点に2でもいれておきますか。
再帰呼び出しの、 if(n > (N-1))
を1個前までにして、最後の経由地点からゴールまでの距離をそのときに一緒に求めるのかな?
なるほど。
そうですね、その時に距離をもとめるようにしています