蚁群算法附带数据结果

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

[代码说明]

蚁群算法解决VRP问题

[算法说明]

首先实现一个ant蚂蚁类,用此蚂蚁类实现搜索。

算法按照tsp问题去解决,但是在最后计算路径的时候有区别。

比如有10个城市,城市1是配送站,蚂蚁搜索的得到的路径是1,3,5,9,4,10,2,6,8,7。

计算路径的时候把城市依次放入派送线路中,

每放入一个城市前,检查该城市放入后是否会超过车辆最大载重

如果没有超过就放入

如果超过,就重新开始一条派送路线

……

直到最后一个城市放完

就会得到多条派送路线

这样处理比较简单可以把vrp问题转为tsp问题求解

但是实际效果还需要验证。

[作者]

Wugsh@2011.12.16

wuguangsheng@

guangsheng.wu@

%}

%清除所有变量和类的定义

clear;

clear classes;

%蚁群算法参数(全局变量)

global ALPHA; %启发因子

global BETA; %期望因子

global ANT_COUNT; %蚂蚁数量

global CITY_COUNT; %城市数量

global RHO; %信息素残留系数!!!

global IT_COUNT; %迭代次数

global DAry; %两两城市间距离

global TAry; %两两城市间信息素

global CITYW Ary; %城市货物需求量

global VW; %车辆最大载重

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

%设置参数变量值

ALPHA=1.0;

BETA=2.0;

RHO=0.95;

IT_COUNT=200;

VW=100;

%=================================================================== %读取数据并根据读取的数据设置其他参数

load data.txt; %从文本文件加载数据

city_xy_ary=data(:,2:3); %得到城市的坐标数据

CITYW Ary=data(:,4); %得到每个城市的货物需求量

CITY_COUNT=length(CITYW Ary); %得到城市数量(包括配送站在内)

ANT_COUNT=round(CITY_COUNT*2/3)+1; %根据城市数量设置蚂蚁数量,一般设置为城市数量的2/3

%MMAS信息素参数

%计算最大信息素和最小信息素之间的比值

PBest=0.05; %蚂蚁一次搜索找到最优解的概率

temp=PBest^(1/CITY_COUNT);

TRate=(1-temp)/((CITY_COUNT/2-1)*temp); %最大信息素和最小信息素之间的比值

%信息素的最大最小值开始的时候设置成多大无所谓

%第一次搜索完成会生成一个最优解,然后用这个解会重新产生最大最小值

Tmax=1; %信息素最大值

Tmin=Tmax*TRate; %信息素最小值

% 计算两两城市间距离

DAry=zeros(CITY_COUNT);

for i=1:CITY_COUNT

for j=1:CITY_COUNT

DAry(i,j)=sqrt((city_xy_ary(i,1)-city_xy_ary(j,1))^2+(city_xy_ary(i,2)-city_xy_ary(j,2))^2);

end

end

% 初始化城市间信息素

TAry=zeros(CITY_COUNT);

TAry=TAry+Tmax;

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

%初始化随机种子

rand('state', sum(100*clock));

%另一种方法

%rand('twister',sum(100*clock))

%定义蚂蚁

mayi=ant();

Best_Path_Length=10e9; %最佳路径长度,先设置成一个很大的值

tm1=datenum(clock); %记录算法开始执行时的时间

FoundBetter=0; %一次搜索是否有更优解产生

%开始搜索

for i=1:IT_COUNT

fprintf('开始第%d次搜索, 剩余%d次',i,IT_COUNT-i);

FoundBetter=0; %搜索前先置为没有更优解产生

for j=1:ANT_COUNT

%蚂蚁搜索一次

mayi=Search(mayi);

%得到蚂蚁搜索路径长度

Length_Ary(j)=get(mayi,'path_length');

%得到蚂蚁搜索的路径

Path_Ary{j}=get(mayi,'path');

%保存最优解

if (Length_Ary(j) < Best_Path_Length);

Best_Path_Length=Length_Ary(j);

Best_Path=Path_Ary{j};

相关文档
最新文档