资源简介
matlab蚁群算法解决背包问题,c代码步骤编写,目标函数为价值比
代码片段和文件信息
%蚁群算法求解背包问题(相当于50只蚂蚁每只背了一个背包)
clear all;%清除所有变量
close all;%清图
clc;%清屏
m=50;%蚂蚁个数
Alpha=1;%信息素重要程度参数
Beta=5;%启发式因子重要程度参数
Rho=0.1;%信息素蒸发系数
G=200;%最大迭代次数
Q=1;%信息素增加强度系数(蚂蚁循环一周或一个过程在经过的路径上所释放的信息量总量)
c=[98 92 95 70 72 70 83 80 65 25 50 55 40 48 50 32 22 60 30 32 40 38 35 32 25 28 30 22 50 30 45 30 60 50 20 65 20 25 30 10 56 50 30 20 15 10 8 5 3 1 ];%初始化物品质量
value=[300 318 298 192 180 180 265 242 160 138 155 130 125 122 120 118 115 110 105 101 100 100 98 96 95 90 88 82 80 77 75 73 72 70 69 66 65 63 60 58 20 25 15 10 20 10 7 5 2 2];%初始化物品价值
m1=1000;%总重量约束值
C=[value;c]‘;%50x2
%第一步:变量初始化
n=size(C1);%物品数量50
Eta=C(:1)./C(:2);%Eta为启发因子,价值密度50x1
Tau=ones(n1);%Tau为信息素矩阵初始时刻各物品上的信息量相等即为const50x1
Tabu=zeros(mn);%存储蚂蚁遍历过的物品50x50
flag=zeros(mn);%标识表存储装载的物品50x50
count=zeros(m1);%蚂蚁装载的物品个数50x1
NC=1;%迭代计数器
R_best=zeros(Gn);%各代最佳装载方案200x50
L_best=inf.*ones(G1);%各代最大价值200x1
Wsum=zeros(m1);%存储已装载的重量50x1
while NC<=G
%第二步:将m只蚂蚁放到n个物品上
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randposrandperm(n)];
end
Tabu(:1)=(Randpos(11:m))‘;%第一列为50蚂蚁初始物品
count=count+1;%背包物品数+1
flag(:1)=Tabu(:1);
Wsum=Wsum+C(flag(:1)2);%每个背包所装物品总重量
%第三步:m只蚂蚁按概率函数选择下一个物品,完成各自的周游
for j=2:n%剩余物品
for i=1:m%蚂蚁
visited=Tabu(i1:(j-1));%已访问的物品
J=zeros(1(n-j+1));%待访问的物品
P=J;%待访问物体的选择概率分布
Jc=1;
for k=1:n
if length(find(visited==k))==0%查找没访问过的物品
J(Jc)=k;
Jc=Jc+1;
end
end
%计算待选物品的概率分布
for k=1:length(J)
P(k)=(Tau(J(k))^Alpha)*(Eta(J(k))^Beta);
end
P=P/(sum(P));
%按概率原则选取下一个物体
Pcum=cumsum(P);%相当于轮盘赌
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(ij)=to_visit;%将下一个物品放入禁忌表
%判断此物体能否放入包中
Wsum(i)=Wsum(i)+C(to_visit2);
if Wsum(i)<=m1
count(i)=count(i)+1;
flag(icount(i))=Tabu(ij);
else
Wsum(i)=Wsum(i)-C(to_visit2);
end
end
end
%第四步:记录本次迭代最佳方案
L=zeros(m1);
for i=1:m%计算50只蚂蚁中每只蚂蚁所背物品最大价值
R=flag(i:);
for j=1:count(i)
L(i)=L(i)+C(R(j)1);
end
end
L_best(NC)=max(L);%找出50只蚂蚁所背物品最大价值
maxValue=max(L);
pos=find(L==L_best(NC));%找出50只蚂蚁所背物品最大价值方案
R_best(NC:)=flag(pos(1):);
NC=NC+1;
%第五步:更新信息素
Delta_Tau=zeros(n1);%初始时刻信息素增量为0
for i=1:m
for j=1:count(i)
Delta_Tau(flag(ij))=Delta_Tau(flag(ij))+C(flag(ij)1)*Q/L(i);
end
end
Tau=(1-Rho).*Tau+Delta_Tau;
%第六步:禁忌表清零
Tabu=zeros(mn);
flag=zeros(mn);
count=zeros(m1);
Wsum=zeros(m1);
end
%第七步:输出结果
Pos=find(L_best==max(L_best));
Shortest_Route=R_best(Pos(1):);
Best_Rout
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3676 2017-06-26 17:09 ac.m
- 上一篇:matlab遗传算法解决背包问题
- 下一篇:禁忌搜索解决背包问题matlab
评论
共有 条评论