蚁群算法--第四次作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题
目 请以100个城市的旅行商问题为例,写出使用20只人工蚂蚁进行旅行商问题求解的基本步骤。 次
数
第四次作业 姓名
周璐
学号
53070711
班级
7班
正文
Q: 请以100个城市的旅行商问题为例,写出使用20只人工蚂蚁进行旅行商问题求解的基本步骤。 A :核心公式:
τ是信息素浓度因子;η是可见度因子,通常取为城市间距离的倒数;α和β用来控制信
息素和可见度的相对重要性;N i
k 为蚂蚁k 的可访问城市集合 ;Q 为常量。 数据结构:
– 信息素矩阵τ(100×100阶,记录信息素浓度)
– 可见度矩阵η(100×100阶,通常取为距离(i, j)的倒数) – 禁忌表Tabu (20×100阶,记录蚂蚁k 走过的城市)
初始化:
– 20蚂蚁随机分布到100个城市
环游:
– 按照第一个核心公式
计算
转移概率
– 蚂蚁依次选择路径直到返回出发点
更新信息素浓度
– 按照第二个核心公式计算t+1时刻的信息素浓度
停止条件
– 全部蚂蚁选择了同一条路线 – 算法运行到最大迭代次数 –
旅行商问题代码思路大体如下:
/****************************************************************************/ /初始化蚁群
/****************************************************************************/ m=20; //蚁群中蚂蚁的数量,当m接近或等于城市个数n时,本算法可以在最少的迭代次数内找到最优解
n=20; //表示TSP问题的规模,亦即城市的数量,这里为100
D[100][100]={…}; //表示城市完全地图的赋权邻接矩阵,记录城市之间的距离
Nc_max=200; //最大循环次数,即算法迭代的次数,亦即蚂蚁出动的拨数(每拨蚂
蚁的数量都是20)
alpha=1; //蚂蚁在运动过程中所积累信息(即信息素)在蚂蚁选择路径时的相对重要程度,alpha过大时,算法迭代到一定代数后将出现停滞现象
beta=5; //启发式因子在蚂蚁选择路径时的相对重要程度
rho=0.5; //(0 数),1-rho表示信息素的持久性系数 Q=100; //蚂蚁释放的信息素量,对本算法的性能影响不大 /****************************************************************************/ /变量初始化 /****************************************************************************/ eta=1/D; //启发式因子,这里设为城市之间距离的倒数pheromone=ones(n,n); //信息素矩阵,这里假设任何两个城市之间路径上的初始信 息素都为1 tabu_list=zeros(m,n); //禁忌表,记录蚂蚁已经走过的城市,蚂蚁在本次循环中不 能再经过这些城市。当本次循环结束后,禁忌表被用来计 算蚂蚁当前所建立的解决方案,即经过的路径和路径的长 度 Nc=0; //循环次数计数器 routh_best=zeros(Nc_max,n); //各次循环的最短路径 length_best=ones(Nc_max,1); //各次循环最短路径的长度 length_average=ones(Nc_max,1);//各次循环所有路径的平均长度 while Nc //将m只蚂蚁放在n个城市上 rand_position=[]; for (i=1;i rand_position=[rand_position,randperm(n)]; end tabu_list(i,0)=(rand_position(1:m));//这里i从0取到19,1:m表示随着i 的增大而讲tabu_list从随机位置1 初始化到位置m。将蚂蚁放在城市上 之后的禁忌表,第i行表示第i只蚂 蚁,第i行第一列元素表示第i只蚂 蚁所在的初始城市 /****************************************************************************/ /m只蚂蚁按概率函数选择下一座城市,在本次循环中完成各自的周游 /****************************************************************************/ for j=2 to n for i=1 to m city_visited=tabu_list(i,1:(j-1));//已访问的城市。1:(j-1)表示从1到 j-1 city_remained=zeros(1,(n-j+1)); //待访问的城市 probability=city_remained; //待访问城市的访问概率 cr=1; for k=1 to n //for循环用于求待访问的城市。比如如果城市个 数是5,而已访问的城市city_visited=[2 4],则 经过此for循环后city_remanied=[1 3 5] if length(find(city_visited==k))==0 city_remained(cr)=k; cr=cr+1; end end /****************************************************************************/ /for循环计算待访问城市的访问概率分布,此概率和两个参数有关,一是蚂蚁当前所在城 市(即city_visited(end))和待访问城市(即city_remained(k))路径上的信息素,一是 这两者之间的启发因子即距离的倒数 /****************************************************************************/ for k=1 to length(city_remained) probability(k)=(pheromone(city_visited(end),city_remained(k)))^ alpa*(eta(city_visited(end),city_remained(k)))^beta; //即作业第一页提到的核心公式一 end probability=probability/sum(probability); //按概率选取下一个要访问的城 pcum=cumsum(probability); select=find(pcum>=rand); to_visit=city_remained(select(1)); tabu_list(i,j)=to_visit; end end if Nc>0 tabu_list(1,:)=routh_best(Nc,:);//将上一代的最优路径(最优解)保留下来, 保证上一代中的最适应个体的信息不会丢失 end //记录本次循环的最佳路线 total_length=zeros(m,1); //m只蚂蚁在本次循环中分别所走过的路径长度