您的位置:首页 > 其它

遗传算法的简单应用-巡回旅行商(TSP)问题的求解

2015-06-21 00:46 316 查看
上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多,

就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略,

才能较好的实现。

这次的TSP问题的题目是:

随机产生10~30个城市,每个城市之间的距离也是随机产生,距离的范围是[1,50],求最优的路径

==========================================================

下面就是具体的求解,由于我的策略是基于知网上的一种改进的遗传算法求解TSP问题》这篇文章,

所以把这篇文章先放上来。下面我简单介绍一下这篇文章关于求解TSP问题的策略,然后附上参照这篇

文章写的代码。

策略简述:

1、染色体编码

为了充分利用城市间相邻边的信息和距离的信息,不采用二进制编码而是采用整数编码,即每个染

色体都是一个1到N的排列,表示周游路线的城市间的先后顺序序列。

/// <summary>
/// 插入式变异(ISM)
/// 思路:1.产生两个随机位置;2.将第二个位置的数放在第一个位置的数的前面
/// </summary>
/// <param name="str1">要变异的个体</param>
/// <returns>变异过后的个体</returns>
static string Opreation_Mutation(string str1)
{
int pos1 = rd.Next(1, city_count);//产生两个位置
int pos2 = rd.Next(1, city_count);
if (pos1 < pos2)
{
string s = str1[pos2 - 1].ToString();
return str1.Insert(pos1 - 1, s).Remove(pos2, 1);
}
else if (pos1 > pos2)
{
string s = str1[pos1 - 1].ToString();
return str1.Insert(pos2 - 1, s).Remove(pos1, 1);
}
else//如果相等的两个位置,则重新产生小范围的随机数
{
int pos3 = rd.Next(1, city_count / 2);
int pos4 = rd.Next(city_count / 2, city_count);
string s = str1[pos2 - 1].ToString();
return str1.Insert(pos1 - 1, s).Remove(pos2, 1);
}
}


View Code
其中的方法,实现不唯一,时间比较敢,也没有作一定的优化,只是为了熟悉算法而写的。

希望能帮到初学者,也欢迎各位提出修改意见。

完整代码可在这下载

https://github.com/hwqdt/Catcher.TSP
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: