今プログラムを作っているんですが...

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ryo

今プログラムを作っているんですが...

#1

投稿記事 by ryo » 14年前

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;
}

ちなみに、これがその作成したプログラムです。
どこに何を加えればよいのかなど、なるべく詳しくお願いします

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 今プログラムを作っているんですが...

#2

投稿記事 by beatle » 14年前

もしかしてキューについての方と同じ方でしょうか?だとしたら、先にそちらへ回答の投稿をお願いいたします。

それから、ソースコードをそのまま貼付けられると非常に読みにくいため、codeタグで囲むようにしてください。
フォーラムルール投稿前チェックリストを是非御覧ください。

ソースコードをちらっと見ると、どうやら標準的なC言語ではなくて、Microsoft Visual C++専用C言語に見受けられますが、それでよろしいのでしょうか。
[hr]
追記:経路探索との二重投稿です。

ryo

Re: 今プログラムを作っているんですが...

#3

投稿記事 by ryo » 14年前

>もしかしてキューについての方と同じ方でしょうか?だとしたら、先にそちらへ回答の投稿をお願いいたします。

いえ、私はこの方とは別人です。
すいませんでした、ルールをよく読まず投稿してしまい、皆さん不快な思いをされたと思います。
なので、改めてソースこーどを載せます。

因みに、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]

ちなみに、これがその作成したプログラムです。
本当に初心者なため、なるべく詳しくお願いします
何度もすいませんでした。

non
記事: 1097
登録日時: 15年前

Re: 今プログラムを作っているんですが...

#4

投稿記事 by non » 14年前

質問です。
1 距離と時間との関係はどうなっていますか?
2 時間内に収まらないときは、最後の巡回地点だけ行かないでいいですね。途中でなく。
3 自分で作ったプログラムですよね。
non

non
記事: 1097
登録日時: 15年前

Re: 今プログラムを作っているんですが...

#5

投稿記事 by non » 14年前

もう一つ
>・最初にスタート地点とゴールを決める
ゴールも最初から決まっているのですか?
non

ryo

Re: 今プログラムを作っているんですが...

#6

投稿記事 by ryo » 14年前

>nonさん
>1 距離と時間との関係はどうなっていますか?
すいません、説明不足でした
最初に移動速度も入力し、それを距離で割って時間を出しています

>2 時間内に収まらないときは、最後の巡回地点だけ行かないでいいですね。途中でなく。
はい、大丈夫です

>3 自分で作ったプログラムですよね。
厳密に言えば、友達に聞きながら作成したため、一人の力という訳ではありませんが、調べながら頑張ってます

>ゴールも最初から決まっているのですか?
はい、もともとスタートとゴールはあらかじめ決めて、そこにたどりつくまでに制限時間内で、どれだけ多く回れるかを
目的としています。

non
記事: 1097
登録日時: 15年前

Re: 今プログラムを作っているんですが...

#7

投稿記事 by non » 14年前

ryo さんが書きました: >ゴールも最初から決まっているのですか?
はい、もともとスタートとゴールはあらかじめ決めて、そこにたどりつくまでに制限時間内で、どれだけ多く回れるかを
目的としています。
そうすると、現在のプログラムは、ゴールが指定されていないということなりませんか?
また、現在のスタートは 0番目の地点となっていますが、スタート地点やゴール地点は固定ですか?
それとも、変更可能にするのでしょうか?
non

ryo

Re: 今プログラムを作っているんですが...

#8

投稿記事 by ryo » 14年前

non さんが書きました:
ryo さんが書きました:
>そうすると、現在のプログラムは、ゴールが指定されていないということなりませんか?
また、現在のスタートは 0番目の地点となっていますが、スタート地点やゴール地点は固定ですか?
それとも、変更可能にするのでしょうか?
そうですね、現在はとりあえず固定した形で作成しました。
これから、入力できるようにしていきたいと思っています。

non
記事: 1097
登録日時: 15年前

Re: 今プログラムを作っているんですが...

#9

投稿記事 by non » 14年前

ryo さんが書きました:そうですね、現在はとりあえず固定した形で作成しました。
これから、入力できるようにしていきたいと思っています。
じゃ、それは先に作ってもらわないと、先に進めませんね。
non

ryo

Re: 今プログラムを作っているんですが...

#10

投稿記事 by ryo » 14年前

non さんが書きました:
ryo さんが書きました:そうですね、現在はとりあえず固定した形で作成しました。
これから、入力できるようにしていきたいと思っています。
じゃ、それは先に作ってもらわないと、先に進めませんね。
そうですね。
今作成中なのですが、よろしかったらそれについてのアドバイスもいただけないでしょうか?

non
記事: 1097
登録日時: 15年前

Re: 今プログラムを作っているんですが...

#11

投稿記事 by non » 14年前

スタート地点がflag[0] = 1;
なら、ゴール地点に2でもいれておきますか。
再帰呼び出しの、 if(n > (N-1))
を1個前までにして、最後の経由地点からゴールまでの距離をそのときに一緒に求めるのかな?
non

ryo

Re: 今プログラムを作っているんですが...

#12

投稿記事 by ryo » 14年前

non さんが書きました:スタート地点がflag[0] = 1;
なら、ゴール地点に2でもいれておきますか。
再帰呼び出しの、 if(n > (N-1))
を1個前までにして、最後の経由地点からゴールまでの距離をそのときに一緒に求めるのかな?
なるほど。

そうですね、その時に距離をもとめるようにしています

閉鎖

“C言語何でも質問掲示板” へ戻る