蚁群算法笔记

  • 起源于解决TSP问题。蚁群算法在解决规格较小的TSP问题上效果显著。

实质:(正反馈机制)通过“信息素”的多少来选择路径,算法的迭代过程就是“信息素”的积累过程。(最优路径上蚂蚁数量的增加→信息素强度增加→蚂蚁选择概率增大→最优路径上蚂蚁数量更大增加)

​ “信息素”的积累有三种方法(即蚂蚁系统包括三部分):蚁周算法,蚁密算法,蚁量算法。

缺点:收敛速度过慢(在大规模TSP问题中尤为突出)。

解决方法:

自适应蚁群算法:对蚁群算法的状态转移概率、信息素挥发因子、信息量等因素采用自适应调节策略为一种基本改进思路的蚁群算法。

自适应蚁群算法中两个最经典的方法:蚁群系统(AntColony System, ACS)和最大-最小蚁群系统(MAX-MINAnt System, MMAS)。

  • 蚁周算法

    信息量的增加与本次搜索的整体线路有关,属于全局信息更新(所有蚂蚁都走完一次后才会更新

    若蚂蚁经过(i,j)则:
    τ i j ( t + n ) = 1 ρ τ i j ( t ) + Δ τ i j \tau_{ij}(t+n) = (1-\rho)\cdot\tau_{ij}(t)+\Delta\tau_{ij}

    • τ(ij)为城市i,j的信息素浓度
  • ρ是0-1之间的常数,(1-ρ)表示挥发因子

    • derta t(ij)表示在一次旅行后所有经过(i,j)的蚂蚁留下的信息素总量。

    Δ τ i j = k = 1 m Δ τ i j k \Delta\tau_{ij}=\sum_{k=1}^m\Delta\tau_{ij}^k

    • Δ τ i j k \Delta\tau_{ij}^k 表示第k只蚂蚁在本次迭代中在路径(i,j)上留下的信息素量。

    Δ τ i j k = Q / L k \Delta\tau_{ij}^k=Q/L_k

    • Q为常数,Lk表示蚂蚁k已经走过的路径总长度

    在信息素的作用下,蚂蚁对每条路径的选择概率

    否则第k只蚂蚁在(i,j)留下的信息素为0

    img

    • η i j = 1 / d i j \eta_{ij} = 1/d_{ij} 是一个启发式因子

    η i j = 1 / d i j \eta_{ij} = 1/d_{ij}

    ​ d(i,j)为城市(i,j)之间的距离

    • alpha,信息素重要程度因子;beta启发函数重要程度因子
    • img

实现

  1. 变量初始化

  2. 计算城市间距离

  3. 迭代寻找最佳路径

    • 随机产生个蚂蚁起点
    • 遍历城市
    • 记录迭代最佳城市
    • 更新信息表

说明:

  1. 城市距离矩阵不能为零,后边需要取倒数(初始化时可直接eps

  2. 蚂蚁选择下一城市采用轮盘赌法,可以增大拓展其他路径选择的几率

    使用轮盘赌法,使用cumsum的原因是,刚开始信息素未积累时,选择路径随机,在信息素积累到一定程度,所选择的下一个城市大概率是信息素最大的城市

  3. 初始时信息素浓度都为1,故哪条路径都相同

  4. 禁忌表的作用是,推出未访问过的城市在选择城市中用到。迭代过程中的最优路线记录在禁忌表中

  5. 所有蚂蚁都前进一个城市后禁忌表更新

matlab

clear
%	city	城市
%	alpha	信息素重要程度因子	【1,4】
%	beta	启发式重要程度因子	【3,5】
%	rho		信息素挥发系数
%	eta		启发式因子
%	NC		最大迭代次数
%	m		蚂蚁个数
%	n		城市个数
%	Q		信息素增强系数
%	L		蚂蚁已走路径长度
%	d		两城市间的距离
%	tau		信息素矩阵
%	tabu	禁忌表
                                    
                                    
% 城市坐标
city = [1304 2312 ;   3639 1315;    4177 2244;    3712 1399;    3488 1535;    3326 1556;    3238 1229;    4196 1044;    4312 790;    4386 570;    3007 1970;    2562 1756;    2788 1491;    2381 1676;    1332 695;    3715 1678;    3918 2179;    4061 2370;    3780 2212;    3676 2578;    4029 2838;    4263 2931;    3429 1980;    3507 2376;    3394 2643;    3439 3201;    2935 3240;    3140 3550;    2545 2357;    2778 2826;    2370 2975];

n = size(city,1);
d = zeros(n,n);
%初始化城市距离矩阵
for i = 1:n
	for j = 1:n
		if i == j
			d(i,j) = eps;
		else
			d(i,j) = sqrt(sum((city(i,:) - city(j,:)).^2));
		end
	end
end

%初始化参数
m = 50;
alpha = 1;
beta = 5;
eta = 1./d;
Q = 100;
rho = 0.25;
tau = ones(n,n);
tabu = zeros(m,n);
NC = 100;
iter = 1;%当前迭代次数
r_best =  zeros(NC,n);	%各代最佳路径
L_brst = inf.*ones(NC,1); %每一代最佳路径长度 初始无穷大

%迭代寻找最佳路径
while iter <= NC
	%蚂蚁所在城市初始化
	start = zeros(m,1);
	for i = 1:m
		start(i) = randperm(n,1);
	end
	tabu(:,1) = start;
	for i = 2:n
		for j = 1:m
			visited = tabu(j,1:(i-1));%信息素
			%city_vist = 1:N;
			%unvisited = ~ismember(city_vist,visited);  %这两句有点妙,作用和下边循环一样
			unvisited = zeros(1,(n+1-i));%初始化待访问城市
			P = unvisited; 
			pos = 1;
			for k = 1:n
				if isempty(find(visited == k)) %待访问城市
					unvisited(pos) = k;
					pos = pos +1;
				end
			end
			%根据信息素计算待选择城市的概率  公式三
			for k = 1:length(unvisited)
				P(k) = ((tau(visited(end),unvisited(k))^alpha) * (eta(visited(end),unvisited(k))^beta));
			end
			P = P/sum(P);
			%根据概率选择下一个要访问的城市(轮盘赌法
			pc = cumsum(P);
			slc_index = find(pc >= rand); %下一城市索引
			slc = unvisited(slc_index(1));
			tabu(j,i) = slc;
		end
    end
	%当前最优路线记录在禁忌表中
	if iter >= 2
    	tabu(1,:) = r_best(iter-1,:);
    end
	%记录m只蚂蚁迭代的最佳路线长度
	L = zeros(1,m);
	for i = 1:m
		R = tabu(i,:);
		L(i) = d(R(n),R(1));%加上最后回到初始城市的距离
		for j = 1:(n-1)
			L(i) = L(i) + d(R(j),R(j+1));
		end
	end
	%记录每一代中最短距离
	L_best(iter) = min(L);
	%记录每一代最优路径
	pos = find(L == L_best(iter));
	r_best(iter,:) = tabu(pos(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
    end
    %更新路径上的信息素含量	公式一
    tau = (1 - rho).*tau + Delta_tau;
    
    %禁忌表清零
    tabu = zeros(m,n);
    
    %每次迭代过程城市连接图
    for i = 1:(n-1)
    	% 1 各次迭代最优路线的横坐标	2 各次迭代路线的纵坐标
    	plot([city(r_best(iter,i),1),city(r_best(iter,i+1),1)],[city(r_best(iter,i),2),city(r_best(iter,i+1),2)],'bo-');
    	hold on;
    end
    plot([city(r_best(iter,n),1),city(r_best(iter,1),1)],[city(r_best(iter,n),2),city(r_best(iter,1),2)],'ro-');
    title(['最短路径:',num2str(L_best(iter))]);
    hold off;
    time = 0.05;
    pause(time);
    iter = iter+1;
end

figure(2);
plot(L_best);
title('路径长度变化曲线');
xlabel('迭代次数');
ylabel('路径长度数值');



应用:二次分配问题

二次分配问题

将n台设备分配到n个地点。

参考

https://blog.csdn.net/zj1131190425/article/details/89517223

1;
end

figure(2);
plot(L_best);
title(‘路径长度变化曲线’);
xlabel(‘迭代次数’);
ylabel(‘路径长度数值’);




应用:二次分配问题



###### 二次分配问题

将n台设备分配到n个地点。





参考

https://blog.csdn.net/zj1131190425/article/details/89517223



发布了6 篇原创文章 · 获赞 1 · 访问量 359

猜你喜欢

转载自blog.csdn.net/qq_43461153/article/details/102104176