最短経路問題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
j-back
記事: 4
登録日時: 12年前

最短経路問題

#1

投稿記事 by j-back » 12年前

どうしたらいいかわからないです。
eil51の最短経路を求めるプログラミングを作ってます。
自分が書いたプログラムの出発点は原点(0,0)なんですが、出発点を原点ではなく都市にしたいです。あと、次に訪れる都市をランダムではなくその都市から近い都市を訪問するようにしたいです。
初心者でなのでコードはわかりづらいと思いますがアドバイスをください

コード:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

#define N 51	//都市の数

void main()
{
	int a;	//乱数
	int b=0;	//カウント
	int i;
	int goukei; 	//総距離
	int x,y;	//座標
	int dis;	//距離
	int v[N];	//訪問フラグ
	int num;	//都市の番号
	
	int n[N];	//numを入れる配列
	int e[N];	//xを入れる配列
	int f[N];	//yを入れる配列
	
	FILE *fp1;
	int *p=&x,*q=&y;
	
	fp1=fopen("eil51.txt","r");
	if(fp1==NULL){
		printf("ファイルをオープンできませんでした\n");
		exit(1);
	}
	
	//ファイルから各配列に代入
	for(i=0;i<N;i++){
		fscanf(fp1,"%d",&num);		
		fscanf(fp1,"%d",&x);
		fscanf(fp1,"%d",&y);
		
		n[i] = num;
		e[i] = x;
		f[i] = y;
		
	}
	
	fclose(fp1);
	
	//0を代入する(訪れてないことを示す)
	for(i=0;i<N;i++){
		v[i] = 0;
	}
	
	srand((unsigned)time(NULL));
	x=0,y=0; 	//原点
	
	//乱数を使って番号と距離を表示
	while(b != N){
		a=rand()%N;
		if(v[a]==0){
			
			v[a]=1;		//訪れた都市にマーキング
			dis = sqrt((e[a]-x)*(e[a]-x)+(f[a]-y)*(f[a]-y));
			*p=e[a];	//座標をxに代入
			*q=f[a];	//座標をyに代入
			b += v[a];		//何回訪れたかカウント
			
			printf("%d 距離%d %d\n",n[a],dis,b);
			goukei += dis;
		}
	}
	x=0,y=0;
	
	dis = sqrt((e[a]-x)*(e[a]-x)+(f[a]-y)*(f[a]-y));
	printf("0 距離 %d\n",dis);
	printf("総距離 %d",goukei+dis);
}

box
記事: 2002
登録日時: 14年前

Re: 最短経路問題

#2

投稿記事 by box » 12年前

そもそも、今のコードは思ったとおりに動いているんですね?
でもって、それを改造したいということでよろしいでしょうか。
元のコードがちゃんと動いていないのに、それを改造しようとすると
ものすごく深みにはまるような気がします。

今のコードには何だかムダなところが見受けられます。
j-back さんが書きました:

コード:

    int *p=&x,*q=&y;
pとqの使い道を教えてください。何のために存在しているのでしょうか。
j-back さんが書きました:

コード:

    for(i=0;i<N;i++){
        fscanf(fp1,"%d",&num);		
        fscanf(fp1,"%d",&x);
        fscanf(fp1,"%d",&y);

        n[i] = num;
        e[i] = x;
        f[i] = y;
}
numとかxとかyとかを使わずに、直接nとかeとかfとか(変数名をちゃんと付ける方がいいような気がします)に
代入してもいっこうに差し支えないのではないでしょうか。

j-back さんが書きました: 自分が書いたプログラムの出発点は原点(0,0)なんですが、出発点を原点ではなく都市にしたいです。

コード:

    srand((unsigned)time(NULL));
    x=0,y=0; 	//原点
乱数を使って適当に決めた都市の座標を原点にするようなコードを書けばいいのではないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 最短経路問題

#3

投稿記事 by みけCAT » 12年前

j-back さんが書きました:次に訪れる都市をランダムではなくその都市から近い都市を訪問するようにしたいです。
1度訪れた都市は再び訪れない仕様だと仮定します。
今回の場合、都市の数が51ということなので、今いる都市から他のまだ訪れていない都市までの距離をそれぞれ計算し、
その距離が最小の都市を選べばよいです。時間計算量はO(N^2)になるはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 最短経路問題

#4

投稿記事 by みけCAT » 12年前

使用しているeil51.txtは、ここのものでいいですか?
http://www.otaru-uc.ac.jp/~g2002306/experience.html

【追記】違うようですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 最短経路問題

#5

投稿記事 by みけCAT » 12年前

これが読み込もうとしているeil51.txtでしょうか?
フォーマットも合っていそうです。
https://github.com/almirfilho/traveling ... /eil51.txt
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 最短経路問題

#6

投稿記事 by みけCAT » 12年前

変数goukeiを初期化していないため、出力される結果がおかしくなっているようです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

j-back
記事: 4
登録日時: 12年前

Re: 最短経路問題

#7

投稿記事 by j-back » 12年前

>>boxさん
pとqは特に意味はないです。

>>みけCATさん
これが読み込もうとしているeil51.txtでしょうか?
フォーマットも合っていそうです。
https://github.com/almirfilho/traveling ... /eil51.txt
↑で合ってます

アドバイスを頂いて、一応できました。ありがとうございました

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 最短経路問題

#8

投稿記事 by みけCAT » 12年前

j-back さんが書きました:アドバイスを頂いて、一応できました。ありがとうございました
ルール上、解決したコードを提示してください。

解決でしたら、解決チェックもお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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