⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quickant.m

📁 用蚁群算法解决0-1背包问题,matlab实现,自己亲自写的,没问题
💻 M
字号:
clear;
tic                                               %开始记时
Fid=fopen('b.txt','r');                           %注意三个数据文件的扩展名是.txt
v=fscanf(Fid,'%f',1);
fclose(Fid);
Fid=fopen('p.txt','r');
p=fscanf(Fid,'%f',[1,50]);
fclose(Fid);
Fid=fopen('w.txt','r');
w=fscanf(Fid,'%f',[1,50]);
fclose(Fid);                                      %以上是载入数据
n=50;                                             %物品数量
rfa=1.0;
beta=1.0;
ro=0.7;                                           %信息素衰减因子                                        
Q=1;
NCMax=40;                                         %最多迭代次数
t=ones(n,1);
bestjp=zeros(1,NCMax);                            %每次迭代产生的最优值
bestp=0;                                          %全局最优值
bestJ=[];                                         %全局最优解
m=n;                                              %生成n只蚂蚁
for NC=1:NCMax                                    % 开始迭代
   solutions=zeros(m,n);                          %存放m只蚂蚁的路径
        q=[];                                     %物品被选择的概率
        d=0;
        for j=1:n
            d=d+t(j)^rfa*(p(j)/w(j))^beta;        %计算概率的分母
        end
        for j=1:n
            q(j)=t(j)^rfa*(p(j)/w(j))^beta/d;
        end
    for k=1:m                                     % m只蚂蚁开始行动
        temp=q; 
        h=floor(rand*49)+1;                       %随机选取第一个物品
        solutions(k,h)=1;                         %将其填加到蚂蚁k的路径中
        vk=w(h);                                  %修改当前容量
        u=1-temp(h);
        temp(h)=0;
       while(u>1e-8)                              %开始轮盘赌
            j=roulette_wheel(u,temp);             %原轮盘赌算法中有一个参数,而我却设了两个,想一想为什么,这是对原算法最大错误的一个修改
            u=u-temp(j);
            temp(j)=0;
            if(vk+w(j)<=v)                        %如果满足约束,则将物品j放入背包
               solutions(k,j)=1;                  %将其填加到蚂蚁k的路径中
                vk=vk+w(j);                       %修改当前容量
            end
        end
    end
    [bestjp(NC),J]=max(solutions*p');            %本次迭代产生的最优值
    disp(['第',num2str(NC),'次迭代最优解为:',num2str(bestjp(NC)),'当前载重',num2str(solutions(J,:)*w')]);
    if(bestp<bestjp(NC))
        bestp=bestjp(NC);
        bestJ=solutions(J,:);
    end
    t=ro*t;
    t=t+(bestJ.*p*Q/bestjp(NC))';                %更新物品上的信息素
end
t_time=toc;                                      % 停止记时
plot(1:NCMax,bestjp);                            %开始绘图
axis([1,n,min(bestjp)-100,bestp+100]);
xlabel('迭代次数');
ylabel('最优解');
text(15,13500,'最优解随迭代次数变化曲线');
title(['本次迭代最优值:',num2str(bestp),',耗时:',num2str(t_time),'秒']);
disp(['本次迭代最优解为:',num2str(bestp),'当前载重',num2str(bestJ*w'),',耗时:',num2str(t_time),'秒']);
bestJ

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -