模拟退火求解TSP问题<2变换法产生路径>

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">模拟退火解TSP</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp">/*
 * @file					SA.cpp
 * @brief				SA解TSP
 * @author/Univ.			taoxiaoxiao/XMU
 * @date				11-2-2014
*/

#include <iostream>
#include <fstream>
#include <random>
using namespace std;

#define max 51					//最大的输入规格
int a[max][max];				//距离矩阵
int curPath[max], newPath[max], bestPath[max];  //当前解、新解、最优解
int length, bestLength = 0;			//解的结果、最优解的结果
int n;						//输入的节点数
int Lk= 2000;					//Mapkob链长
double t = 100.0, alpha = 0.9;			//温度、衰减速度

double rand1()
{
	//产生0-1间随机数

	static default_random_engine e;			//引擎
	static uniform_real_distribution<double> u(0, 1);	//分布

	return u(e);
}

int rand2(int n)
{
	static default_random_engine e;			//引擎
	static uniform_int_distribution<int> u(1, n);		//分布
	return u(e);
}

inline void swap(int &a, int &b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int getLength(int *p)
{
	int len = 0;
	for (int i = 1; i <= n - 1; ++i)
	{
		len += a[p[i]][p[i + 1]];
	}
	len += a[p[n]][p[1]];

	return len;
}

/*2变换法产生新路径*/
int getNewPath()
{
	//获得新路径,并求出新长度
	int k, m;
	int newLen = 0;

	/* 2分交换 */
	while (1)
	{
		k = rand2(n);
		m = rand2(n);
		if (k != m)
			break;
	}
	/* 新路径 */
	swap(newPath[k], newPath[m]);
	newLen = getLength(newPath);

	return newLen;
}

void sa()
{
	int i, count;
	int newLength, delta;
	int s = 0;
	int bChange = 0;

	/*初始化操作*/
	for (i = 1; i<= n; i++)
	{
		bestPath[i]=newPath[i]=curPath[i] = i;
	}
	length = getLength(curPath);
	bestLength = length;

	/*按Metropolis接受准则进行迭代*/
	while (1)
	{
		count = 0;
		//对每个温度tk产生Lk个解 Lk个解构成一个mapkob链
		while (1)
		{
			newLength = getNewPath();
			delta = newLength - length;
			if (delta <= 0 || (delta>0 && exp(-delta / t)>rand1()))
			{
				//是否接受新解
				bChange = 1;
				for (i = 1; i <= n; i++)
				{
					curPath[i] = newPath[i];
				}
				length = newLength;
				if (length < bestLength)
				{
					bestLength = length;
					for (i = 1; i <= n; i++)
					{
						bestPath[i] = curPath[i];
					}
				}
			}
			if (++count >= Lk)
				break;
		}//1-while

		t = alpha * t;			//降温
		if (1==bChange)
		{
			s = 0;
			bChange = 0;
		}
		else
		{
			s++;
		}
		if (s == 2 || t <=1e-6)
		{
			//停止准则
			//温度接近零或者有两次结果没变化时
			break;
		}
	}//2-while
}

int main()
{
	ifstream infile("file2.txt");

	int i, j;
	if (infile.is_open())
		cout << "open file successful." << endl;
	else
	{
		cout << "open file error." << endl;
		return 0;
	}
	while (!infile.eof())
	{
		infile >> n;
		for (i = 1; i <= n; ++i)
		{
			for (j =1; j <= n; ++j)
				infile >> a[i][j];
		}
	}
	infile.close();

	sa();
	for (i = 1; i <= n; ++i)
		cout << bestPath[i] << "->";
	cout << bestPath[1] << endl;
	cout << bestLength << endl;
	system("pause");

	return 0;
}

file2.txt

运行结果

时间: 2024-12-17 04:57:13

模拟退火求解TSP问题<2变换法产生路径>的相关文章

遗传算法的C语言实现(二)-----以求解TSP问题为例

上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤.这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择.交叉.变异等核心步骤的实现.而且这一次解决的是离散型问题,上一次解决的是连续型问题,刚好形成对照. 首先介绍一下TSP问题.TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还没有找到一个多项式时间的有效算法.TS

基于遗传算法求解TSP问题(Java界面)

近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一样的,追加了Java用Graphics画点及画线做路径展示,展示部分做得比較粗糙,须要的拿走,效果图例如以下. 下载地址:http://download.csdn.net/detail/wangqiuyun/7406201 另C#界面版:http://blog.csdn.net/wangqiuyun

基于贪心算法求解TSP问题(JAVA)

前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值. TSP问题

自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题

前言 上次出了邻域搜索的各种概念科普,尤其是LNS和ALNS的具体过程更是描述得一清二楚.不知道你萌都懂了吗?小编相信大家早就get到啦.不过有个别不愿意透露姓名的热心网友表示上次没有代码,遂不过瘾啊~哎,大家先别急,代码有得你们酸爽的-- 不过由于ALNS的代码量实在太大,小编打算把这个做成一个系列来一一为大家讲解,好让小伙伴们彻底把这个算法框架的代码吃透.今天暂时还是先不对代码进行讲解,先来教大家怎么使用ALNS的框架求解一个TSP问题吧~ 环境准备 小编的演示是基于Windows 10 x

遗传算法求解TSP问题

遗传算法是一种启发式搜索,属于进化算法的一种.它最初是人们根据自然界对物种的自然选择和遗传规律而设计的.它模拟自然界物种的自然选择.遗传和变异等,对一个种群的基因进行改良. 遗传算法需要设置交叉概率.变异概率和迭代次数等参数,且算法的收敛性受其参数设置影响较大. 遗传算法中把每一个候选解看做是一个个体,个体组成的集合看作是一个种群.遗传算法通过对每个解进行二进制编码把每个解转化为0-1字符串,其中每一个位叫做一个基因.不同基因的组合构成的个体的表现型也不同.它从一个初始种群开始,经过N次迭代最终

人工智能作业homework3——模拟退火解决TSP

模拟退火算法 受固体退火过程的启发,Kirkpatrick等人意识到组合优化问题与固体退火过程的类似性,将组合优化问题类比为固体的退火过程,提出了求解组合优化问题的模拟退火算法. 表7.3给出了组合优化问题与固体退火过程的类比关系. 表7.3:组合优化问题与退火过程的类比 固体退火过程 组合优化问题 物理系统中的一个状态 组合优化问题的解 状态的能量 解的指标函数 能量最低状态 最优解 温度 控制参数 设一个定义在有限集S上的组合优化问题,i∈S是该问题的一个解,f(i)是解i的指标函数.由表7

利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示

HTML5提供了Canvas对象,为绘图应用提供了便利. Javascript可运行于浏览器中, 而不需要安装特定的编译器: 基于HTML5和Javascript语言, 可随时编写应用, 为算法测试带来便利. 针对TSP问题, 编写了Ant colony algorithm, 用于演示该算法, tsp_ant_colony_algorithm.html代码如下: <html> <head> <meta charset = "utf-8" / > &l

蚁群算法求解TSP问题

蚁群算法的第一个算法就是蚂蚁系统,而蚂蚁系统有三种基本模型分别是 蚁周模型.蚁密模型.蚁量模型.三种模型的实现大致相同,主要区别是在信息素 的更新方式上.在用蚂蚁系统解决T SP问题时,蚁量模型和蚁密模型是蚂蚁在构建 一条合法路径的过程中进行信息素的更新的,当蚂蚁走过一条边之后,就对该边进 行信息素的更新,即为局部更新方式.而蚁周模型是在所有蚂蚁都构建了一条合 法路径之后才对各边进行信息素更新的,也即全局更新方式. 并且这三种模型中蚂蚁在自己所走过的路线上释放的信息素的量也是有所 不同的,在蚁密

多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程

TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值.这篇文章解决的tsp问题的输入描述是: TSP问题的动态规划解法: 引用一下这篇文章,觉得作者把动态规划算法讲的非常明白:https://blog.csdn.ne