C++手敲蚁群算法解决旅行商问题

利用蚁群算法解决旅行商问题

919106840637实验3
作为第三个实验,老师要求我们利用仿生智能算法来对旅行商问题TSP进行求解。可以选用遗传算法、蚁群算法、粒子群算法、鱼群算法等智能算法进行求解,我在这里选择的是蚁群算法。

实验语言

C++

实验内容

随机生成100个结点(或更多结点)的图,在任意两结点之间赋予一条边,然后在这些边上赋予随机代价。最后从遗传算法、蚁群算法、粒子群算法、鱼群算法(上课介绍过),以及蛙跳算法、萤火虫算法,蝙蝠算法(课上没有介绍过)等仿生类算法中选择一个算法在这个图上求解从一个结点开始,经过且只经过每个结点一次,最后返回起点的最短路径的问题。

按照实验内容,节点数最少要100个,经过实践发现花费时间太长了,于是写了个缩略版的只有20个节点的。

实验思想及部分代码

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <windows.h>
#include <vector>
#include <algorithm>

什么是蚁群算法?蚂蚁在移动的时候会在路径上留下信息素,其他蚂蚁在寻找去往目的地的路径时,常常会顺着信息素浓度高的路径移动,而最优路径往往能拥有最高浓度的信息素。蚁群算法就是结合这种特性,利用多个类似蚂蚁的智能体agent来获取问题的最优解。

TSP,即旅行商问题,又称TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。TSP问题是一个NPC问题。

关于蚁群算法可以参考这篇文章:蚁群算法
如何用蚁群算法求解旅行商问题?

  1. 初始化每个节点之间的信息素。信息素的初始化值为蚂蚁数量/当前最短路径(可以用贪心算法求解)。
  2. 随机投放蚂蚁至各个节点,蚂蚁数量一般为节点数量的1.5倍。
  3. 对于每只蚂蚁,寻找一条前进路径:根据当前蚂蚁所处节点与已经经过的节点,计算当前节点与剩余节点间的权重,其权重的算法可以参见上面所发的文章。然后根据权重不同来计算蚂蚁选择对应节点的概率,利用轮盘赌法来选择下一步的节点。
  4. 当所有蚂蚁选取好路径后,需要对节点间的信息素浓度进行更新,更新算法也可以参见上述文章。我在这使用的是0.5倍原信息素浓度加上该路径长度的倒数(所有经过这两个节点的蚂蚁的路径长度倒数之和)。
  5. 重复步骤2,直至达到一定的迭代次数。

这是蚂蚁判断下一个节点的代码

int decide_city(ant a){
   
	int now = a.now_position;
	vector<int> t = a.path;
	float sum = 0;
	float weight[100];
	float p[100];
	for(int i=0;i<100;i++){
   
		weight[i] = 0.0;
		p[i] = 0.0;
	}
	for
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值