遗传算法求解旅行商问题

1.问题描述

旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D=[dij],其中dij表示城市i到城市j的距离,i,j=1,2 … n,则问题是要找出遍访每个城市恰好一次的一条回路并使其路径长度为最短。

2.算法设计

首先随机生成种群,以及种群的个体数量n固定不变,同时在这个问题中我们假设种群中的某个个体的DNA是某条从0出发,经过所有城市一次,最终回到0的一条路径,以该路径进行移动,每条路径的路径和作为其个体对于环境的适应性,其路径和越短,该个体的适应性也就越强。

设计进化方案:

假设进化比例为A,按照递减的概率从适应性最高的个体开始进行进化选择,并不是适应性高的个体一定被选择,而实被选择的概率更高,依次查询后只准许A*n个个体进行选择进化,被选择的个体复制自身一份,替换掉适应性最低的一个个体。

设计杂交方案

由于每个个体的DNA在该问题中是旅行路径,因此对于DNA的杂交方案有着特殊的需求,例如有两个个体[1,2,3,4,5],[1,3,4,5,2],若随便选择某个位置进行单点杂交,如果选择0位则两个个体没有形成新的个体,相当于没有杂交,若是选择1位杂交,则产生两个个体[1,3,3,4,5][1,2,4,5,2]出现了重复路径,与题意不和,因此也存在问题。因此我们设定一种规则,首先查找X,Y两个个体的第一个不相同的基因的位置(在本例中为1位),然后再X,Y中分别找到其对应位置的基因,对X,Y来说就是基因2,3,对X来说也就是1,2位,对Y来说就是1,4位,那么交换X的2,3位,交换Y的1,4位。得到结果[1,3,2,4,5]
[1,2,4,5,3]对于基因位置1来说,两个个体完成了杂交

设计变异方案

变异方案相比杂交方案简单的多,按照一定概率选择某个个体,随机选择两个位置的基因,让这两个位置的基因交换位置即视为该个体变异。

3.程序流程

在这里插入图片描述

4.核心伪代码

确定种群规模N及终止进化准则,在中随机选取N个元以组成初始种群,置k=0
初始化Pm,Pc,M,G,Tf等参数。随机产生第一代种群Pop
do
{
    
  计算种群Pop中每一个体的适应度F(i)。
  初始化空种群newPop
  do
  {
   
    根据适应度以比例选择算法从种群Pop中选出2个个体
    if ( random ( 0 , 1 ) < Pc )
    {
   
      对2个个体按交叉概率Pc执行交叉操作
    }
    if ( random ( 0 , 1 ) < Pm )
    {
   
      对2个个体按变异概率Pm执行变异操作
    }2个新个体加入种群newPop中
} until ( M个子代被创建 )
用newPop取代Pop
}until ( 任何染色体得分超过Tf, 或繁殖代数超过G )

5.部分代码以及解释

完整代码见git:sunxueliang96/Machine-learning-stuffs/tree/master/计算智能相关算法

首先初始化种群,随机生成一些基因,再随机生成一些个体

def get_random_gene():#随机生成一些路径作为种群基因,显然基因长度为32
	path = list(range(l))[1:31]
	random.shuffle(path)
	path.insert(0,0)
	path.append(0)
	return path
def get_random_init():#随机生成num个初始个体作为种群,返回df
	parents = []
	[parents.append(get_random_gene()) for i in range(nums)]
	return pd.DataFrame(parents
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值