用遗传算法解决0-1背包问题

用遗传算法解决0-1背包问题

声明:

1.本文源代码来自书目《智能优化算法及其MATLAB实例(第3版)》,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了解算法及MATLAB编程基本原理。 2.文中代码每一行后都有相应注释,因此本文是一篇适合所有代码水平的学习者阅读的文章。如果觉得有帮助,麻烦点个赞哦!

例2.4 0-1背包问题。有N件物品和一个容量为V的背包。第i件物品的体积是c(i),价值是w(i)。求解将哪些物品放入背包可使物品总体积不超过背包容量,且价值总和最大。假设物品数量为10,背包容量为300.每件物品体积为[95,75,23,73,50,22,6,57,89,98],价值为[89,59,19,43,100,72,44,16,7,64].

所用的遗传算法是最为基本的标准遗传算法,详细代码和注释如下:

%%%%%%%%遗传算法解决0-1背包问题%%%%%%%%%%%%
%初始化参数
clear all;%清除所有变量
close all;%清图
clc;%清屏
NP=50;%种群规模
L=10;%物品件数
Pc=0.8;%交叉率
Pm=0.05;%变异率
G=100;%最大遗传代数
V=300;%背包体积容量
C=[95,75,23,73,50,22,6,57,89,98];%物品体积
W=[89,59,19,43,100,72,44,16,7,64];%物品价值
afa=2;%惩罚函数系数
f=randi([0,1],NP,L);%随机生成初始种群
%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%
for k=1:G
    %%%%%%%%%%适应度计算%%%%%%%%%%%%%
    for i=1:NP
        Fit(i)=func4(f(i,:),C,W,V,afa);
    end
    maxFit=max(Fit);%最大值
    minFit=min(Fit);%最小值
    rr=find(Fit==maxFit);%最优个体索引值
    fBest=f(rr(1,1),:);%最优选择物品方案
    Fit=(Fit-minFit)/(maxFit-minFit);%归一化适应度值
    %%%%%%%%基于轮盘赌的复制操作%%%%%%%
    sum_Fit=sum(Fit);%适应度之和
    fitvalue=Fit./sum_Fit;%各个体适应度占比
    fitvalue=cumsum(fitvalue);%累计适应度占比
    ms=sort(rand(NP,1));%随机生成升序排列的NP个概率
    fiti=1;
    newi=1;
    while newi <= NP %这种复制方式确实可能造成生成的种群个体有部分是从原来重复选取的情况
        if(ms(newi)) <fitvalue(fiti)%若累积适应度占比大于随机概率,则被选择
            nf(newi,:)=f(fiti,:);
            newi=newi+1;
        else
            fiti=fiti+1;
        end
    end
  %%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%
    for i = 1:2:NP
        p = rand;
        if p < Pc%随机概率p与交叉概率相比较,满足条件则该个体与相邻个体发生交叉
            q = randi([0,1],1,L);%q数组是10决定了L个位点分别是否发生交叉
            for j = 1:L
                if q(j)==1
                    temp = nf(i + 1,j);
                    nf(i + 1,j) = nf(i,j);
                    nf(i,j) = temp;
                end
            end
        end
    end
    %%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%
    for m = 1:NP
        for n = 1:L
            r = rand(1,1);
            if r < Pm
                nf(m,n) = ~nf(m,n);%取反完成变异
            end
        end
    end
    f = nf;
    f(1,:) = fBest;                     %保留最优个体在新种群中
    trace(k) = maxFit;                  %历代最优适应度
end
fprintf('最终最优解下选择物品编号如下显示\n')
disp(fBest)
fBest;                                  %最优个体
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
string = {'适应度进化曲线';['最优价值总和=',num2str(sum(fBest.*W))]};
title(string)
%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%
function result=func4(f,C,W,V,afa)%使用了总价值这一目标函数作为适应度函数
fit=sum(f.*W);%价值总和
TotalSize=sum(f.*C);%所用体积总和
if TotalSize<=V
    fit=fit;
else
fit=fit-afa*(TotalSize-V);%若体积超过了容量,则引入惩罚系数来减小相应方案的适应度,减小其被选中的可能性
end
result=fit;
end
  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值