蚁群算法TSP问题matlab源代码

合集下载

蚁群算法

蚁群算法

蚁群算法报告及代码一、狼群算法

狼群算法是基于狼群群体智能,模拟狼群捕食行为及其猎物分配方式,抽象出游走、召唤、围攻3种智能行为以及“胜者为王”的头狼产生规则和“强者生存”的狼群更新机制,提出一种新的群体智能算法。

算法采用基于人工狼主体的自下而上的设计方法和基于职责分工的协作式搜索路径结构。如图1所示,通过狼群个体对猎物气味、环境信息的探知、人工狼相互间信息的共享和交互以及人工狼基于自身职责的个体行为决策最终实现了狼群捕猎的全过程。

二、布谷鸟算法

布谷鸟算法

布谷鸟搜索算法,也叫杜鹃搜索,是一种新兴启发算法CS算法,通过模拟某些种属布谷鸟的寄生育雏来有效地求解最优化问题的算法.同时,CS也采用相关的Levy飞行搜索机制蚁群算法介绍及其源代码。

具有的优点:全局搜索能力强、选用参数少、搜索路径优、多目标问题求解能力强,以及很好的通用性、鲁棒性。

应用领域:项目调度、工程优化问题、求解置换流水车间调度和计算智能

三、差分算法

差分算法主要用于求解连续变量的全局优化问题,其主要工作步骤与其他进化算法基本一致,主要包括变异、交叉、选择三种操作。

算法的基本思想是从某一随机产生的初始群体开始,利用从种群中随机选取的两个个体

的差向量作为第三个个体的随机变化源,将差向量加权后按照一定的规则与第三个个体求和而产生变异个体,该操作称为变异。然后,变异个体与某个预先决定的目标个体进行参数混合,生成试验个体,这一过程称之为交叉。如果试验个体的适应度值优于目标个体的适应度值,则在下一代中试验个体取代目标个体,否则目标个体仍保存下来,该操作称为选择。在每一代的进化过程中,每一个体矢量作为目标个体一次,算法通过不断地迭代计算,保留优良个体,淘汰劣质个体,引导搜索过程向全局最优解逼近。

2023年苏北数学建模竞赛题解答

2023年苏北数学建模竞赛题解答

数学建模

王迪 B09010601 通信工程

郑佳佳 B09010603 通信工程

孟天舒 B09010604 通信工程

题目旅游线路旳优化设计

摘要

本题为经典旳旅行商问题(TSP),是组合数学中一种古老而又困难旳问题,它易于描述却难以完全处理,属于NP完全问题。对于规模较小旳旅行商问题,可以通过穷举得到最优解,但伴随问题规模旳增大空间复杂度急剧增长,需要通过启发式算法求解。

由意大利学者M.Dorigo于1992年首先提出旳蚁群系统(AntColonySystem, ACS)是一种新生旳仿生进化算法, 合用于求解复杂组合优化问题, 在处理TSP 问题方面获得了较为理想旳效果。在此,我们以改善旳蚁群算法为基础建立数学模型来设计这些旅游者在五一开始旳路线,试图能得到某些合理旳结论。

(1)第一问是经典旳费用TSP问题。对于此问题我们套用基本蚁群算法,查找到都

市坐标以及旅游费用,并建立求解矩阵。通过MATLAB软件旳模拟,求出若

干优化解,取相对最优解作为计算成果。所求得旳路线为徐州出发——洛阳

市龙门石窟——西安市秦兵马俑——山西祁县乔家大院——青岛市崂山—

—北京八达岭长城——江西九江庐山——黄山市黄山——常州中华恐龙园

——舟山市普陀山——武汉市黄鹤楼——返回徐州,合计3201元。

(2)第二问为时间TSP问题。由于时间在详细操作上旳波动性,根据数据所得结论

将时间旳TSP转化为距离TSP问题。求解出旳路线为:徐州出发——常州中

华恐龙园——舟山市普陀山——黄山市黄山——九江市庐山——武汉市黄

鹤楼——洛阳市龙门石窟——西安市秦始皇兵马俑——祁县乔家大院——

城市间蚁群算法matlab实现

城市间蚁群算法matlab实现

城市间蚁群算法matlab实现

%% I. 清空环境变量

clear all

clc

%% II. 导入数据31个城市的坐标

load citys_data.mat

%% III. 计算城市间相互距离

n = size(citys,1);

D = zeros(n,n);

for i = 1:n

for j = 1:n

if i ~= j

D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));

else

D(i,j) = 1e-4; %用很小的值代替0 公式需要

end

end

end

%% IV. 初始化参数

m = 50; % 蚂蚁数量

alpha = 1; % 信息素重要程度因子beta = 5; % 启发函数重要程度因子rho = 0.1; % 信息素挥发因子

Q = 1; % 常系数

Eta = 1./D; % 启发函数

Tau = ones(n,n); % 信息素矩阵

Table = zeros(m,n); % 路径记录表m个蚂蚁走过的路径

iter = 1; % 迭代次数初值

iter_max = 200; % 最大迭代次数

Route_best = zeros(iter_max,n); % 各代最佳路径

Length_best = zeros(iter_max,1); % 各代最佳路径的长度Length_ave = zeros(iter_max,1); % 各代路径的平均长度

%% V. 迭代寻找最佳路径

while iter <= iter_max

% 随机产生各个蚂蚁的起点城市

蚁群算法源代码1

蚁群算法源代码1

1.#include<iostream>

2.#include<math.h>

3.#include<time.h>

ing namespace std;

5.

6.//该程序是以蚁群系统为模型写的蚁群算法程序(强调:非蚂蚁周模型),以三个著名的TSP问题

为测试对象

7.//通过微调参数,都可以获得较好的解

8.

9./*

10.//----------(1)问题一:Oliver 30 城市 TSP 问

题 best_length = 423.7406; ------------------------

11.//该程序最好的结果是423.741,可运行多次获得

12.//城市节点数目

13.#define N 30

14.//城市坐标

15.double C[N][2]={

16. {2,99},{4,50},{7,64},{13,40},{18,54},{18,40},{22,60},{24,42},{25,62},{25

,38},

17. {37,84},{41,94},{41,26},{44,35},{45,21},{54,67},{54,62},{58,35},{58,69},

{62,32},

18. {64,60},{68,58},{71,44},{71,71},{74,78},{82,7},{83,46},{83,69},{87,76},{

91,38}

19.};

20.//----------上面参数是固定的,下面的参数是可变的-----------

21.//蚂蚁数量

22.#define M 30

蚁群算法matlab代码讲解

蚁群算法matlab代码讲解

蚁群算法matlab代码讲解

蚁群算法(Ant Colony Algorithm)是模拟蚁群觅食行为而提出的一种优化算法。它以蚁群觅食的方式来解决优化问题,比如旅行商问题、图着色问题等。该算法模拟了蚂蚁在寻找食物时的行为,通过信息素的正反馈和启发式搜索来实现问题的最优解。

在蚁群算法中,首先需要初始化一组蚂蚁和问题的解空间。每只蚂蚁沿着路径移动,通过信息素和启发式规则来选择下一步的移动方向。当蚂蚁到达目标位置后,会根据路径的长度来更新信息素。

下面是一个用MATLAB实现蚁群算法的示例代码:

```matlab

% 参数设置

num_ants = 50; % 蚂蚁数量

num_iterations = 100; % 迭代次数

alpha = 1; % 信息素重要程度因子

beta = 5; % 启发式因子

rho = 0.1; % 信息素蒸发率

Q = 1; % 信息素增加强度因子

pheromone = ones(num_cities, num_cities); % 初始化信息素矩阵

% 初始化蚂蚁位置和路径

ants = zeros(num_ants, num_cities);

for i = 1:num_ants

ants(i, 1) = randi([1, num_cities]);

end

% 迭代计算

for iter = 1:num_iterations

% 更新每只蚂蚁的路径

for i = 1:num_ants

for j = 2:num_cities

% 根据信息素和启发式规则选择下一步移动方向

next_city = choose_next_city(pheromone, ants(i, j-1), beta);

一些解决TSP问题的算法及源代码

一些解决TSP问题的算法及源代码
begin
generate(S′form S); {从当前回路S产生新回路S′}
Δt:=f(S′))-f(S);{f(S)为路径总长}
IF(Δt<0) OR (EXP(-Δt/T)>Random-of-[0,1])
S=S′;
IF the-halt-condition-is-TRUE THEN
termination=true;
end
dE = max(all_dE);
dE = max(all_dE);
temp = 10*dE; % Choose the temperature to be large enough
fprintf('Initial energy = %f\n\n',energy);
% Initial plots
3.5.3模拟退火算法的参数控制问题
模拟退火算法的应用很广泛,可以求解NP完全问题,但其参数难以控制,其主要问题有以下三点:
(1)温度T的初始值设置问题。
温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一、初始温度高,则搜索到全局最优解的可能性大,但
因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。实际应用过程中,初始温度一般需要
Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件S。

蚁群算法(ACO)解决TSP问题

蚁群算法(ACO)解决TSP问题

蚁群算法(ACO)解决TSP问题

⼀、蚁群算法

1.基本原理

蚁群算法(Ant Colony Optimization,ACO)是⼀种基于种群寻优的启发式搜索算法,有意⼤利学者M.Dorigo等⼈于1991年⾸先提出。该算法受到⾃然界真实蚁群集体在觅⾷过程中⾏为的启发,利⽤真实蚁群通过个体间的信息传递、搜索从蚁⽳到⾷物间的最短路径等集体寻优特征,来解决⼀些离散系统优化中的困难问题。

经过观察发现,蚂蚁在寻找⾷物的过程中,会在它所经过的路径上留下⼀种被称为信息素的化学物质,信息素能够沉积在路径上,并且随着时间逐步挥发。在蚂蚁的觅⾷过程中,同⼀蚁群中的其他蚂蚁能够感知到这种物质的存在及其强度,后续的蚂蚁会根据信息素浓度的⾼低来选择⾃⼰的⾏动⽅向,蚂蚁总会倾向于向信息素浓度⾼的⽅向⾏进,⽽蚂蚁在⾏进过程中留下的信息素⼜会对原有的信息素浓度予以加强,因此,经过蚂蚁越多的路径上的信息素浓度会越强,⽽后续的蚂蚁选择该路径的可能性就越⼤。通常在单位时间内,越短的路径会被越多的蚂蚁所访问,该路径上的信息素强度也越来越强,因此,后续的蚂蚁选择该短路径的概率也就越⼤。经过⼀段时间的搜索后,所有的蚂蚁都将选择这条最短的路径,也就是说,当蚁巢与⾷物之间存在多条路径时,整个蚁群能够通过搜索蚂蚁个体留下的信息素痕迹,寻找到蚁巢和⾷物之间的最短路径。

蚁群算法中,蚂蚁个体作为每⼀个优化问题的可⾏解。⾸先随机⽣成初始种群,包括确定解的个数、信息素挥发系数、构造解的结构等。然后构造蚁群算法所特有的信息素矩阵每只妈蚁执⾏蚂蚊移动算⼦后,对整个群体的蚂蚁做⼀评价,记录最优的蚂蚁。之后算法根据信息素更新算⼦更新信息素矩阵,⾄此种群的⼀次选代过程完成。整个蚂蚁群体执⾏⼀定次数的选代后退出循环、输出最优解。

(整理)蚂蚁算法源代码如下

(整理)蚂蚁算法源代码如下

源代码如下:

/*ant.c*/

#define SPACE 0x20

#define ESC 0x1b

#define ANT_CHAR_EMPTY '+' #define ANT_CHAR_FOOD 153

#define HOME_CHAR 'H'

#define FOOD_CHAR 'F'

#define FOOD_CHAR2 'f'

#define FOOD_HOME_COLOR 12 #define BLOCK_CHAR 177

#define MAX_ANT 50

#define INI_SPEED 3

#define MAXX 80

#define MAXY 23

#define MAX_FOOD 10000

#define TARGET_FOOD 200

#define MAX_SMELL 5000

#define SMELL_DROP_RATE 0.05 #define ANT_ERROR_RATE 0.02 #define ANT_EYESHOT 3

#define SMELL_GONE_SPEED 50 #define SMELL_GONE_RATE 0.05 #define TRACE_REMEMBER 50

#define MAX_BLOCK 100

#define NULL 0

#define UP 1

#define DOWN 2

#define LEFT 3

#define RIGHT 4

#define SMELL_TYPE_FOOD 0

#define SMELL_TYPE_HOME 1

#include "stdio.h"

蚁群算法java实现以及TSP问题蚁群算法求解

蚁群算法java实现以及TSP问题蚁群算法求解

蚁群算法java实现以及TSP问题蚁群算法求解

1. 蚁群算法简介

蚁群算法(Ant Clony Optimization,ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题提供了一个新的可能性。蚁群算法最早是由意大利学者Colorni A., Dorigo M. 等于1991年提出。经过20多年的发展,蚁群算法在理论以及应用研究上已经得到巨大的进步。

蚁群算法是一种仿生学算法,是由自然界中蚂蚁觅食的行为而启发的。在自然界中,蚂蚁觅食过程中,蚁群总能够按照寻找到一条从蚁巢和食物源的最优路径。图(1)显示了这样一个觅食的过程。

图(1)蚂蚁觅食

在图1(a)中,有一群蚂蚁,假如A是蚁巢,E是食物源(反之亦然)。这群蚂蚁将沿着蚁巢和食物源之间的直线路径行驶。假如在A和E之间突然出现了一个障碍物(图1(b)),那么,在B点(或D点)的蚂蚁将要做出决策,到底是向左行驶还是向右行驶?由于一开始路上没有前面蚂蚁留下的信息素(pheromone),蚂蚁朝着两个方向行进

的概率是相等的。但是当有蚂蚁走过时,它将会在它行进的路上释放出信息素,并且这种信息素会议一定的速率散发掉。信息素是蚂蚁之间交流的工具之一。它后面的蚂蚁通过路上信息素的浓度,做出决策,往左还是往右。很明显,沿着短边的的路径上信息素将会越来越浓(图1(c)),从而吸引了越来越多的蚂蚁沿着这条路径行驶。

2. TSP问题描述

蚁群算法最早用来求解TSP问题,并且表现出了很大的优越性,因为它分布式特性,鲁棒性强并且容易与其它算法结合,但是同时也存在这收敛速度慢,容易陷入局部最优(local optimal)等缺点。

蚁群算法路径规划MATLAB程序

蚁群算法路径规划MATLAB程序

function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q) %% --------------------------------------------------------------- % ACASP.m % ACS for Path Planning %% --------------------------------------------------------------- % input parameters % G gragh, which is 01 matrix, 1 represents obstcles % Tau initial pheromone matrix % K iterative times % M ant number for once iteration % S Start Point % E Goal point % Alpha parameter indicates the importance of pheromone % Beta parameter indicates the importance of visibility % Rho pheromone evaporation rate % Q pheromone accumulation parameter % % output parameters % ROUTES the route that every ant in every iteration % passes % PL the length that every ant in every iteration % passes % Tau output updated pheromone %% -------------------- variableinitialization----------------------------- D=G2D(G); N=size(D,1);%N is the peoblem scale(pixel number) MM=size(G,1); a=1;% edge length of pixel Ex=a*(mod(E,MM)-0.5);% goal point coordinate if Ex==-0.5 Ex=MM-0.5; end Ey=a*(MM+0.5-ceil(E/MM));% Y coordinate of goal point Eta=zeros(1,N); %construct the initialization matrix for i=1:N ix=a*(mod(i,MM)-0.5); if ix==-0.5 ix=MM-0.5; end iy=a*(MM+0.5-ceil(i/MM)); if i~=E Eta(1,i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5; else Eta(1,i)=100; end end ROUTES=cell(K,M);% use cell construct to load the passing route of every ant for every iteration PL=zeros(K,M);% use matrix to load the passing length of every ant for every iteration %% -----------iteration time is k, ant number is M-------------------- for k=1:K disp(k); for m=1:M %% First step: status initialization W=S;%set current point as the starting point Path=S;%initialize the passing route PLkm=0;%initialize the passing length TABUkm=ones(1,N);%initialize the forbbiden table TABUkm(S)=0;% eliminate this point for it is the starting point DD=D;%initialize adjacency matrix %% Second Step:Choose the nodes that can step forward DW=DD(W,:); DW1=find(DWfor j=1:length(DW1) if TABUkm(DW1(j))==0 DW(j)=inf; end end LJD=find(DWLen_LJD=length(LJD);%number of points can be selected %% Colony stop condition:there is no food or go into a impass while W~=E&&Len_LJD>=1 %% Third Step:the method to choose the next step PP=zeros(1,Len_LJD); for i=1:Len_LJD PP(i)=(Tau(W,LJD(i))^Alpha)*(Eta(LJD(i))^Beta); end PP=PP/(sum(PP));%construct probability distributing Pcum=cumsum(PP); S

(完整版)蚁群算法matlab程序实例整理

(完整版)蚁群算法matlab程序实例整理

function [y,val]=QACS

tic

load att48 att48;

MAXIT=300; % 最大循环次数

NC=48; % 城市个数

tao=ones(48,48);% 初始时刻各边上的信息最为1

rho=0.2; % 挥发系数

alpha=1;

beta=2;

Q=100;

mant=20; % 蚂蚁数量

iter=0; % 记录迭代次数

for i=1:NC % 计算各城市间的距离

for j=1:NC

distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2);

end

end

bestroute=zeros(1,48); % 用来记录最优路径

routelength=inf; % 用来记录当前找到的最优路径长度

% for i=1:mant % 确定各蚂蚁初始的位置

% end

for ite=1:MAXIT

for ka=1:mant %考查第K只蚂蚁

deltatao=zeros(48,48); % 第K只蚂蚁移动前各边上的信息增量为零

[routek,lengthk]=travel(distance,tao,alpha,beta);

if lengthk<routelength % 找到一条更好的路径

routelength=lengthk;

bestroute=routek;

end

for i=1:NC-1 % 第K只蚂蚁在路径上释放的信息量

deltatao(routek(i),routek(i+1))=deltatao(routek(i),routek(i+1))+Q/lengthk ;

蚁群算法matlab代码

蚁群算法matlab代码

蚁群算法matlab代码

蚁群算法,英文名为Ant Colony Algorithm,缩写为ACO,是一种启发式算法,是一种模拟蚂蚁寻找食物路径的算法。在实际生活中,蚂蚁找到食物并返回巢穴后,将其找到食物的路径上的信息素留下,其他蚂蚁通过检测信息素来指导寻路,成为了一种集体智慧行为。ACO也是通过模拟蚂蚁寻找食物路径的方式来寻找优化问题的最优解。在ACO算法中,信息素是一个重要的概念,代表了走过某一路径的“好概率”,用这个“好概率”更新一些路径上的信息素,使得其他蚂蚁更可能选择经过这条路径,从而实现路径优化的目的。

在本文中,我们将讨论如何使用Matlab实现蚁群算法来优化问题。

1. 设定问题

首先,我们要选取一个优化问题,并将其转换为需要在优化过程中进行选择的决策变量。例如,我们想要优化旅行商问题(TSP)。在TSP中,我们需要让旅行商以最短的距离经过所有城市,每个城市仅经过一次,最终回到出发的城市。我们可以将每个城市编号,然后将TSP转化为一个最短路径选择的问题,即最短路径从编号为1的城市开始,经过所有城市,最终回到编号为1的城市。

2. 设定ACO参数

在使用ACO优化问题时,需要设定一些参数,这些参数会影响算法的表现。ACO算法需要设定的参数有:

1.信息素含量:初始信息素的大小,即每个路径上的信息素浓度。

2.信息素挥发速度:信息素的随时间“减弱”程度。

3.信息素加成强度:蚂蚁经过路径后增加的信息素量。

4.启发式权重:用于计算启发式因子,即节点距离的贡献值。

5.蚂蚁数量:模拟蚂蚁数量,即同时寻找路径的蚂蚁个数。

蚁群算法及MATLAB程序(详细)

蚁群算法及MATLAB程序(详细)

蚁群算法介绍:

(1)寻找最短路径的蚁群算法来源于蚂蚁寻食的行为。蚁群寻找食物时会派出一些蚂蚁分头在四周游荡, 如果一只蚂蚁找到食物, 它就返回巢中通知同伴并沿途留下“ 信息素”(外激素pheromone)作为蚁群前往食物所在地的标记。信息素会逐渐挥发,如果两只蚂蚁同时找到同一食物, 又采取不同路线回到巢中, 那么比较绕弯的一条路上信息素的气味会比较淡, 蚁群将倾向于沿另一条更近的路线前往食物所在地。蚁群算法设计虚拟的“蚂蚁”, 让它们摸索不同路线, 并留下会随时间逐渐消失的虚拟“信息素”, 根 据“信息素较浓的路线更近”的原则, 即可选择出最佳路线.

(2) 为了模拟实际蚂蚁的行为, 首先引进如下记号: 设m 是蚁群中蚂蚁的数, ij d (i,j=1,2,...,n)表示城市i 和城市j 之间的距离, i b t 表示t 时刻位于城市i 的蚂蚁的个数,

则有 1n

i i m

b t

ij t

表示t 时刻在城市,i j 连线上残留的信息素。初始时刻,各条路径上的信息素相等,设0ij c c 为常数。蚂蚁1,2,,k k m 在运动过程中,根据各条路径上的信息

素决定转移方向。k ij P t 表示在t 时刻蚂蚁k 由城市i 转移到城市j 的概率:

,0,k

ij ij k

ik ik

ij k

k

tabu k

t t t P j tabu j tabu (1) 其中:ij n 为先验知识或称为能见度,在TSP 问题中为城市i 转移到城市j 的启发信息,一般地取1ij d ij n ,为在路径上残留信息的重要程度;为启发信息的重要程度;与实际蚁群不同,人工蚁群系统具有记忆能力,1,2,,k tabu k m 用以记录蚂蚁K 当前所走过的城市,称为禁忌表(下一步不充许选择的城市),集合k tabu 随着进化过程进行动态调整。

蚁群算法的Matlab程序

蚁群算法的Matlab程序

#include

#include

#include

#include

#define citynumber 5

#define Q 100

#define p 0.5

#define NM2 1000

#define A 1

#define B 5

int ccdi=-1;//全局变量,用在myrand()中

float myrand()//产生0-1随机数,100个,每调用一次,结果不同

{srand(time(0));

float my[100];

ccdi++;

if (ccdi==100)

ccdi=0;

for(int mi=0;mi<100;mi++)

{float fav=rand()%10000;

my[mi]=fav/10000;}

return my[ccdi];

}

double fpkij(double T[citynumber][citynumber],double n[citynumber][citynumber],int tabu[citynumber][citynumber],int k,int s,int i,int j )

//定义函数用于计算Pij

{

//double A=0.5,B=0.5;

double sumup,pkij,sumdown;

sumdown=0;

for(int aTi=0;aTi

{

for(int aTj=0;aTj

aT[aTi][aTj]=pow(T[aTi][aTj],A);

}

for(int bni=0;bni

{

for(int bnj=0;bnj

bn[bni][bnj]=pow(n[bni][bnj],B);

蚁群算法TSP问题matlab源代码

蚁群算法TSP问题matlab源代码

function

[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta ,Rho,Q)

%%===================================================== ====================

%% ACATSP.m

%% Ant Colony Algorithm for Traveling Salesman Problem

%% ChengAihua,PLA Information Engineering University,ZhengZhou,China

%% Email:aihuacheng@

%% All rights reserved

%%-------------------------------------------------------------------------

%% 主要符号说明

%% C n个城市的坐标,n×2的矩阵

%% NC_max 最大迭代次数

%% m 蚂蚁个数

%% Alpha 表征信息素重要程度的参数

%% Beta 表征启发式因子重要程度的参数

%% Rho 信息素蒸发系数

%% Q 信息素增加强度系数

%% R_best 各代最佳路线

%% L_best 各代最佳路线的长度

%%===================================================== ====================

matlab蚁群算法代码

matlab蚁群算法代码

matlab蚁群算法代码

以下是一个简单的MATLAB蚁群算法代码示例,其中使用了一个二维网格作为蚂蚁的住所,并在网格上放置了一些随机的节点作为蚂蚁的出发和目的地,每个蚂蚁沿着最短路径搜索路径从一个节点到另一个节点。

```matlab

% 定义蚂蚁的参数

num_nodes = 10; % 网格节点数

num_tasks = 100; % 任务数

num_neighbors = 50; % 蚂蚁之间的连接数

% 随机放置节点

nodes = randi(num_nodes, num_nodes);

% 创建蚂蚁的基本队列

蚂蚁_queue = queue();

% 定义蚂蚁的基本策略

def_蚂蚁_策略 = {

[set_task(i, j, k)]= {1},

[set_neighbor(i, j, k)]= {2},

[set_task(i, j, k)]= {3},

};

% 更新蚂蚁的状态

def_蚂蚁_update = {

for i = 1:num_tasks

for j = 1:num_neighbors

if get(蚂蚁_queue, -1, 1) == num_tasks

get(蚂蚁_queue, -1, 1) = set_task(i, j, k);

set(蚂蚁_queue, -1, 1) = set_neighbor(i, j, k); end

end

end

};

% 定义蚂蚁的搜索函数

function 蚂蚁_function(i, j, k, task, target) % 计算当前蚂蚁的最短路径

path = [zeros(1, num_neighbors); 1];

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

function

[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta ,Rho,Q)

%%===================================================== ====================

%% ACATSP.m

%% Ant Colony Algorithm for Traveling Salesman Problem

%% ChengAihua,PLA Information Engineering University,ZhengZhou,China

%% Email:aihuacheng@

%% All rights reserved

%%-------------------------------------------------------------------------

%% 主要符号说明

%% C n个城市的坐标,n×4的矩阵

%% NC_max 最大迭代次数

%% m 蚂蚁个数

%% Alpha 表征信息素重要程度的参数

%% Beta 表征启发式因子重要程度的参数

%% Rho 信息素蒸发系数

%% Q 信息素增加强度系数

%% R_best 各代最佳路线

%% L_best 各代最佳路线的长度

%%===================================================== ====================

%%第一步:变量初始化

n=size(C,1);%n表示问题的规模(城市个数)

D=zeros(n,n);%D表示完全图的赋权邻接矩阵

for i=1:n

for j=1:n

if i~=j

D(i,j)=max( ((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5,min(abs(C(i,3)-C(j,3)),144-

abs(C(i,3)-C(j,3))) );%计算城市间距离

else

D(i,j)=eps;

end

D(j,i)=D(i,j);

end

end

Eta=1./D;%Eta为启发因子,这里设为距离的倒数

Tau=ones(n,n);%Tau为信息素矩阵

Tabu=zeros(m,n);%存储并记录路径的生成

NC=1;%迭代计数器

R_best=zeros(NC_max,n);%各代最佳路线

L_best=inf.*ones(NC_max,1);%各代最佳路线的长度

L_ave=zeros(NC_max,1);%各代路线的平均长度

while NC<=NC_max%停止条件之一:达到最大迭代次数

%%第二步:将m只蚂蚁放到n个城市上

Randpos=[];

for i=1:(ceil(m/n)) %ceil(A)生成大于等于A的最小整数

Randpos=[Randpos,randperm(n)]; %randperm(n)生成1到n的随机排列

end

Tabu(:,1)=(Randpos(1,1:m))';

%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游

for j=2:n

for i=1:m

visited=Tabu(i,1:(j-1));%已访问的城市

J=zeros(1,(n-j+1));%待访问的城市,应该可以省

P=J;%待访问城市的选择概率分布

Jc=1;

for k=1:n

if length(find(visited==k))==0 %如果visited里没有k

J(Jc)=k;

Jc=Jc+1;

end

end

%下面计算待选城市的概率分布

for k=1:length(J)

P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);%需要修改end

P=P/(sum(P));

%按概率原则选取下一个城市

Pcum=cumsum(P); %这样做是为了使Pcum能取到1

Select=find(Pcum>=rand);

to_visit=J(Select(1)); %把大于rand的第一个数的序号作为下一个城市在J中的序号Tabu(i,j)=to_visit;

end

end

if NC>=2

Tabu(1,:)=R_best(NC-1,:); %上一次的最佳路线作为本次的第一只蚂蚁的路线

end

%%第四步:记录本次迭代最佳路线

L=zeros(m,1);

for i=1:m

R=Tabu(i,:);

for j=1:(n-1)

L(i)=L(i)+D(R(j),R(j+1));

end

L(i)=L(i)+D(R(1),R(n)); %从终点回到起点

end

L_best(NC)=min(L);

pos=find(L==L_best(NC));

R_best(NC,:)=Tabu(pos(1),:);

L_ave(NC)=mean(L);

NC=NC+1

%%第五步:更新信息素

Delta_Tau=zeros(n,n);

for i=1:m

for j=1:(n-1)

Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);

end

Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);

end

Tau=(1-Rho).*Tau+Delta_Tau;

%%第六步:禁忌表清零

Tabu=zeros(m,n); %也可以放在循环的开始

end

%%第七步:输出结果

Pos=find(L_best==min(L_best));

Shortest_Route=R_best(Pos(1),:)

Shortest_Length=L_best(Pos(1))

subplot(1,2,1)

DrawRoute(C,Shortest_Route)

subplot(1,2,2)

plot(L_best)

hold on

plot(L_ave)

function DrawRoute(C,R)

%%===================================================== ====================

%% DrawRoute.m

%% 画路线图的子函数

%%-------------------------------------------------------------------------

%% C Coordinate 节点坐标,由一个N×2的矩阵存储

%% R Route 路线

%%===================================================== ====================

相关文档
最新文档