#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开始。