一 MATLAB智能算法实现

智能算法实现 (一)
写在前面:突然想做点儿什么,为自己本科四年的学习生涯画上一个句点 。用一款自己喜欢的软件实现一些老师们在上课时总提到的智能算法应该是一件极有意义的事吧!
我的目的:没什么目的,万一将来用得上呢?!
我的希望:
1、有C语言基础和基本矩阵计算实践的童鞋们可以无障碍阅读代码;
【一MATLAB智能算法实现】2、写这些东西的人不是大神,所以不希望大神前来吐槽 。仅供包括我在内的菜鸟们交流讨论;
3、再次强调,大神们总是忘了自己矬的时候是什么样,所以希望诸位大触看看即可,笑笑也罢 。
蚁群算法
所有的群智能算法的核心思想都在于:“个体的行为确定了群体的行动模式,个体又接收着来自群体的信息并依据此调整自己的行为” 。那么归于蚁群,这一算法的特征有三:
其一,蚂蚁个体在其行动路径上总是均匀地播撒信息素;
其二,信息素的浓度随着时间的变化而变化,同时信息素是蚂蚁个体间极为重要的协调单元;
其三,蚂蚁个体总沿着信息素浓度高的方向前进,但又有一些随机扰动使得其偏离原有的路线 。

一  MATLAB智能算法实现

文章插图
如上图所示,在a时刻,蚂蚁并不知道那条路距离食物更近,于是从巢穴出发的蚂蚁沿着食物发出的“香味”找到上下两条道路 。如果我们假定:
1)每只蚂蚁一次出行(往返)所能释放的信息素总量是相同的;
2)蚂蚁们保持相等的时间间隔交替选择出行路线,即t时刻出动的蚂蚁选择上面的道路,t+1时刻出动的就选择下面的道路,t+2时刻又回到上面的道路 。
基于以上两条假定,我们可以得出:上面的路径由于距离较短,所以单位长度上的信息素量(浓度)要高于下方路径 。所以一段时间过后信息素的浓度差异已经足以引起大多数蚂蚁的关注,上方道路上的蚂蚁开始逐渐变多(b时刻) 。
我们可以想到,b状态最终将发展成为c状态,信息素随时间变化浓度降低,有鲜有蚂蚁行至于此,所以下方道路的信息素逐渐消散 。同时需要关注的是,有些特立独行的蚂蚁并不以信息素浓度最为自己选择路线的唯一标准,它们会开辟一些新的道路,同时引起一些同伴的关注 。这种随机性也为系统的自由化提供了理论基础,这些“创新”的探索如果的确距离更短,那么这一路径将在信息素的调解下演化成为新的主流,反正则会得到纠正 。
以下是解放军工程信息大学的一位老师编写的程序,它利用蚁群算法,实现了“担货郎”问题的求解(遍历所有的销售点,同时使得总的行进路程最短) 。以下是源代码和本人对程序的解释:
function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length] = ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)%% 主要符号说明%% C:n个城市的坐标,n*2的矩阵%% NC_max:最大迭代次数%% m:蚂蚁个数%% Alpha:表征信息素重要程度的参数%% Beta:表征启发因子重要程度的参数%% Rho:信息素蒸发系数%% Q:信息素增加强度系数%% R_best:各代最佳路线%% L_best:各代最佳路线长度%% Step1:变量初始化n = size(C,1);% D为一个无向加权图,表中的每一行记录了某一个城市到另外n-1个城市的距离D = zeros(n,n);for i = 1:1:nfor j = 1:1:nif i ~= jD(i,j) = ((C(i,1) - C(j,1))^2 + (C(i,2) - C(j,2))^2)^0.5;else% eps是MATLAB所能识别的最小正浮点数,即认为“0+eps/2 = 0”D(i,j) = eps;endendend% Eta表示了距离倒数,作为路径选择重要的启发因子,蚂蚁去信息素多且离当前位置距离较近的城市Eta = 1./D;% Tau表示城市间(n*n矩阵)的信息素含量,一开始是均匀的为一个“全一”矩阵Tau = ones(n,n);% 每一只蚂蚁都要根据信息素和自己判断,独立求解“担货郎”问题,Tabu记录着m只蚂蚁在n个城市间行进的轨迹 。第m行n列表示:第m只蚂蚁去的第n个城市为Tabu(m,n)Tabu = zeros(m,n);% NC是迭代次数NC = 1;% 每一次迭代结束后的最段路径R_best = zeros(NC_max,n);% 每一次迭代后的最短路径长度L_best = inf.*ones(NC_max,1);% 每一次迭代后m只蚂蚁所得路径的平均值L_ave = zeros(NC,1);while NC