遗传算法 TSP问题 C++实现 (三)

话不多说,进入主题,作者为了写这三篇已经要饿死了。


更新.
*附上运行截图
*吐槽一下TSP的交叉算法,交叉算法相比区间倒置的变异操作来说效率差太多了,还耗费了好大精力。。


交叉算法

交叉算法其实说起来很简单,就是将两个选择的个体的随机DNA片段交换。
简单吧,但是在具体实现起来还是有一些细节问题。比如新过来的DNA片段可能有重复.

个体1DNA: | 1 | 2 | 3 | 4 | 5 | 6 |

个体2DNA: | 2 | 3 | 5 | 1 | 6 | 4 |

假设两个个体的第3,4位DNA片段要交换(上述加粗部分),则交换后为:

个体1DNA: | 1 | 2 | 5 | 1 | 5 | 6 |

个体2DNA: | 2 | 3 | 3 | 4 | 6 | 4 |

可见,这样的交换出现了两个问题:
1)重复:第一个个体中”5”,”1”与原DNA片段重复,第二个个体中的”3”,”4”与其原DNA片段中的”3”,”4”重复
2)缺失: 第一个个体缺少”3”,”4”,第二个个体缺少”5”,”1

缺失和重复的原因是:把自己的部分基因交出去的同时,得到的交叉基因不一定和损失的基因相同(不计次序),所以交叉后,损失的基因确确实实给了对方个体,而得到的基因却与原有的冲突。

解决办法是:
1)记录下真正损失的基因,即在对方的交叉基因中不重复的基因。上例中即:
第一个个体真正损失: | 5 | 1 |
第二个个体真正损失: | 3 | 4 |
这个例子中还没有变化,如果交叉基因有重复的,则不一样了,如:

个体1DNA: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

个体2DNA: | 2 | 3 | 5 | 1 | 6 | 4 | 8 | 7 |

此时交叉基因中出现了重复部分: “5”,”6”,”4”,这些基因在交叉中看似损失,其实又补充回来了。所以就不需要记录,此时的损失基因为:
第一个个体真正损失: | 3 |
第二个个体真正

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值