旅行商问题 贪心算法

  • 问题描述

这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到触发的城市之前,对每个城市都只访问一次。

  • 解决方法

贪心选择法:每次都将剩余没有去过的城市依据与现在这个城市之间的距离进行排序,找出离现在这个城市距离最近的,然后去这个城市。

  • 代码
/*
	贪心算法 
*/ 
#include <stdio.h>
# include <stdlib.h>  
# include <time.h>
#define N 200                //城市数目  
#define NO_PATH 0         //没有通路  
#define MAX_WEIGHT 4000  
int City_Graph[N+1][N+1];  //保存图信息  
int x[N+1];                //x[i]保存第i步遍历的城市  
int isIn[N+1];             //保存 城市i是否已经加入路径  
int bestw;                 //最优路径总权值  
int cw;                    //当前路径总权值
int bw;                    //深度搜索完成总权值
int bestx[N+1];            //最优路径  
//-----------------------------------------------------------------  

int main(void)
{  
    int i,j;  
	// 随机生成数 
	srand((unsigned)time(NULL));
    for(i = 1; i <= N; i++) {
		for(j = 1; j <= N; j++) {
			int num = 0;
			num = rand() % 201;
			City_Graph[i][j] = num;
			printf("%d ", City_Graph[i][j]);
		} 
	} 
    
    //测试递归法,初始化  
    for (i=1;i<=N;i++)
	{  
        x[i] = 0;               //表示第i步还没有解  
        bestx[i] = 0;           //还没有最优解  
        isIn[i] = 0;            //表示第i个城市还没有加入到路径中  
    }  
       
    x[1] = 1;                   //第一步 走城市1  
    isIn[1] = 1;                //第一个城市 加入路径  
    bestw = MAX_WEIGHT;  		// 因为要求最小值先设置为极大值 
    cw = 0;  					// 用于保存每一种可能的路径和值 

	for(i = 2; i <= N; i++) {// 此时i代表现在在选择第i个城市
		int a = MAX_WEIGHT;// 保存剩余城市中的最短的路,因为求的是最短的路,所以这里初始化为极大值 
		int b = -1;// 保存准备选择的城市的序号 
		for (j = 1; j <= N; j++) {// 从第二个城市开始选择,看是不是最短的路,且未选择过 
			if(City_Graph[x[i-1]][j] < a && !isIn[j] && City_Graph[x[i-1]][j] != NO_PATH) {
			 	a = City_Graph[x[i-1]][j];  
			 	b = j;
			} 
		}	
		cw = cw + a;
		isIn[b] = 1;
		x[i] = b;	
	}
	cw = cw + City_Graph[x[N]][1];
    printf("最优值为%d\n",cw);  
    printf("最优解为:\n");  
    for(i=1;i<=N;i++)
	{  
        printf("%d ",x[i]);  
    }  
    printf("\n");
	return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值