模拟退火算法解决旅行商问题 c++代码,通过邻接矩阵存储城市信息

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#include<time.h>
#include<math.h>
#define T0 50000.0	//初始温度
#define T_end (1e-8)
#define q 0.98	//退火系数
#define L 1000	//每个温度时的迭代次数,即链长
int N;



int city_list[100];	//用于存放一个解 
int city_list1[100];	//用于输出最后解 
int G[100][100];

int create_new()
{
	int x=0+rand()%((N-1)-0+1);//生成第一个随机数
	int y;
	int t=0+rand()%((N-1)-0+1);//t=min+rand()%(max-min+1);
	while(t==x){
		t=0+rand()%((N-1)-0+1);
	}
	y=t;//生成一个和x不同的随机数 
	int m=city_list[x];
	city_list[x]=city_list[y];
	city_list[y]=m;
	

}

int path_len(int num[])
{
	int path=0;

	for(int i=0;i<N-1;i++)
	{
		path+=G[num[i]][num[i+1]];
	}
	path+=G[num[N-1]][num[0]];
	return path;
 } 


int main()
{
	cout<<"输入多少个城市"<<endl;
	cin>>N;
	cout<<"输入城市的邻接矩阵"<<endl;
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			cin>>G[i][j];
		}
	}
//	cout<<"输入起始城市"<<endl;
//	cin>>city_list[0];
	
	for(int i=0;i<N;i++)	//生成第一个初始化解 
	{
		city_list[i]=i;city_list1[i]=i;
	 }
	 
	int T=T0;
	 while(T>T_end)      //当温度大于T_end,进行存储 
	 {
	 	for(int i=0;i<L;i++)//每一个温度迭代这么多次 
	 	{
	 	create_new();   //生成一份随机解 
	 	int p1=path_len(city_list);//暂存解耗费大小 
	    int p2=path_len(city_list1);//最后解耗费大小 
	    
		if(p1<p2)	//如果路径总值最小,就将暂存解解赋值给最后解 
		{
			cout<<"输出接近最后解的暂存解向量:";
			for(int j=0;j<N;j++)
			{
				cout<<city_list[j]<<"->";//将解进行赋值 
			 }
			 cout<<city_list1[0];
			 cout<<endl;
			for(int j=0;j<N;j++)
			{
				city_list1[j]=city_list[j];//将解进行赋值 
			 }
	
			 cout<<p1<<endl;
			 
		}
		
		 }
		 
		T*=q;
		
	 }
	 //打印最后结果
	 for(int i=0;i<N;i++)
	 {
	 	cout<<city_list1[i]<<"->";
	  }
	  cout<<city_list1[0];
	  cout<<"最短路径长度:"<<path_len(city_list1);
 } 

通过邻接矩阵来存储城市路径信息

测试结果

 

 

注:源代码的城市信息从零开始,书上的城市信息从1开始。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下Python模拟退火算法解决旅行商问题旅行商问题(Traveling Salesman Problem,TSP)是指在所有城市之间建立完全图,每对城市之间有一条权值为正的边。旅行商要从某个城市出发,遍历所有城市一次后回到出发的城市,且使所走过的路程最短。这是一个NP难问题,因此需要采用一些启发式算法来求解。 模拟退火算法(Simulated Annealing,SA)是一种基于概率的全局优化算法,可以用于求解TSP问题。其基本思想是通过一定的概率规律,在搜索过程中跳出局部最优解,并逐渐降低温度以达到全局最优解。 下面是一个简单的Python代码实现,使用模拟退火算法解决TSP问题: ```python import random import math def distance(city1, city2): return math.sqrt((city1[0] - city2[0]) ** 2 + (city1[1] - city2[1]) ** 2) def TSP(cities, T_init, T_end, alpha, iter_max): n = len(cities) cur_solution = list(range(n)) random.shuffle(cur_solution) cur_cost = sum(distance(cities[cur_solution[i]], cities[cur_solution[i-1]]) for i in range(n)) T = T_init while T > T_end: for i in range(iter_max): new_solution = cur_solution.copy() a = random.randint(0, n-1) b = random.randint(0, n-1) new_solution[a], new_solution[b] = new_solution[b], new_solution[a] new_cost = sum(distance(cities[new_solution[i]], cities[new_solution[i-1]]) for i in range(n)) delta_cost = new_cost - cur_cost if delta_cost < 0 or math.exp(-delta_cost/T) > random.random(): cur_solution = new_solution.copy() cur_cost = new_cost T *= alpha return cur_cost, cur_solution if __name__ == '__main__': cities = [(0, 0), (1, 2), (3, 1), (5, 2), (6, 4), (4, 6), (1, 5), (2, 3)] T_init = 100 T_end = 0.1 alpha = 0.99 iter_max = 1000 cost, solution = TSP(cities, T_init, T_end, alpha, iter_max) print('最短路径长度为', cost) print('最短路径为', solution) ``` 该代码定义了一个`distance`函数用于计算两个城市之间的距离,以及一个`TSP`函数用于求解TSP问题。其中,`cities`参数是一个城市列表,`T_init`和`T_end`分别是初始温度和最终温度,`alpha`是温度下降系数,`iter_max`是每个温度下的迭代次数。代码中使用了随机交换两个城市的方法来产生新解,并使用Metropolis准则来决定是否接受新解。最终返回的是最短路径长度和最短路径的顺序。 以上就是一个简单的Python模拟退火算法解决TSP问题的例子,希望能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值