天天看点

matlab 遗传优化算法_【优化求解】遗传算法解决背包问题

问题描述

背包问题

为了简单起见,我此处只介绍01背包问题。当然其实01背包问题用动态规划很容易就能实现。但遗传算法的意义却绝不是动态规划可以代替的。动态规划只能解决一些一定有明确解的问题,但事实上现在主流问题很少是有明确解的,大多数都是优化问题,也就是只能寻找局部最优解,并认为局部最优解已经足够好了。

clearclcpopsize=100; %种群大小n=7;CW=120; %背包大小 可容纳的总重量w=[40 40 30 5 15 35 30]; %各个物品的重量,7个个体v=[30 60 25 8 10 40 60]; %各个物品的价值,7个个体t=200;%迭代次数pc=0.9; %交叉率pm=0.05; %变异率pop=initpop(popsize,n); %产生初始种群for i=1:popsize[objvalue]=calobjvalue(pop,n,popsize,v,w,CW); %计算目标函数[fitvalue]=calfitvalue(objvalue); %计算群体中每个个体的适应度[newpop]=selection(pop,fitvalue); %进行选择计算[newpop1]=crossover(newpop,pc); %进行交叉计算[newpop2]=mutation(newpop1,pm); %进行变异计算[newobjvalue]=newcalobjvalue(newpop2,n,popsize,v,w,CW); %计算最新代目标函数值,经过选择交叉变异后的下一代[newfitvalue]=newcalfitvalue(newobjvalue); %计算最新代的个体适应度[bestweight,bestvalue,point]=best(newpop2,newfitvalue,w); %计算最优个体重量,价值,和位置 y(i)=max(bestvalue);%记录最大价值g(i)=max(bestweight);%记录最大重量n(i)=i;%记录位置pop=newpop2;%迭代重复endi=1:100;plot(y(i),'-b*')xlabel('迭代次数')ylabel('最大价值');title('最优点变化趋势');legend('最优点');grid on[z index]=max(y);po=n(index)%最优代数位置W=g(index)%最优重量chose=(point./w==1)     %选择的物品V=z%最优价值
           
function [bestweight,bestvalue,point]=best(newpop2,newfitvalue,w)%寻找最优个体,包括其重量和价值。[px,py]=size(newpop2);bestvalue=newfitvalue(1);for i=2:pxif newfitvalue(i)>bestvaluebestvalue=newfitvalue(i);endend[z index]=max(newfitvalue);%计算最优价值,和最优重量。bestweight=0;point=[];for i=index;for j=1:pybestweight=w(j)*newpop2(i,j)+bestweight;endpoint=[point;newpop2(index,:).*w];end
           
function [fitvalue]=calfitvalue(objvalue)% 计算个体的适应值%遗传算法子程序%Name:calfitvalue.mfitvalue=objvalue;
           
function [newpop1]=crossover(newpop,pc)%交叉%遗传算法子程序%Name: crossover.m[px,py]=size(newpop);newpop1=zeros(px,py);for i=1:2:px-1ps=rand;if pscpoint=round(rand*py);newpop1(i,:)=[newpop(i,1:cpoint),newpop(i+1,cpoint+1:py)];newpop1(i+1,:)=[newpop(i+1,1:cpoint),newpop(i,cpoint+1:py)];elsenewpop1(i,:)=newpop(i,:);newpop1(i+1,:)=newpop(i+1,:);endend
           
function pop=initpop(popsize,n)%生成初始种群%遗传算法子程序%Name: initpop.mpop=round(rand(popsize,n));
           
function [newfitvalue]=newcalfitvalue(newobjvalue)% 计算新一代的个体的适应值%遗传算法子程序%Name:newcalfitvalue.mnewfitvalue=newobjvalue;% function [newobjvalue]=newcalobjvalue(newpop2,n,popsize,v,w,CW)% %计算新一代的目标函数值% [px,py]=size(newpop2);% for i=1:px% sum(i)=0;% sum1(i)=0;% for j=1:py% sum(i)=sum(i)+v(j)*newpop2(i,j);% sum1(i)=sum1(i)+w(j)*newpop2(i,j);% end% if sum1(i)>CW% sum(i)=0;% else% sum(i)=sum(i);% end% newobjvalue(i)=sum(i);% end
           
function [newobjvalue]=newcalobjvalue(newpop2,n,popsize,v,w,CW)%计算新一代的目标函数值[px,py]=size(newpop2);for i=1:pxsum(i)=0;sum1(i)=0;for j=1:pysum(i)=sum(i)+v(j)*newpop2(i,j);sum1(i)=sum1(i)+w(j)*newpop2(i,j);endif sum1(i)>CWsum(i)=0;elsesum(i)=sum(i);endnewobjvalue(i)=sum(i);end
           
function [newpop]=selection(pop,fitvalue)%选择操作 ,轮盘赌的选择方法totalfit=sum(fitvalue);%求适应度值之和pfitvalue=fitvalue/totalfit;%单个个体被选择的概率mfitvalue=cumsum(pfitvalue); %如 fitvalue=[1 2 3 4],则 cumsum(fitvalue)=[1 3 6 10][px,py]=size(pop);ms=sort(rand(px,1)); %从小到大排列fitin=1;newin=1;newpop=zeros(size(pop));while newin<=pxif mfitvalue(fitin)>ms(newin)newpop(newin,:)=pop(fitin,:);newin=newin+1;elsefitin=fitin+1;endend
           

往期回顾>>>>>>

【模式识别】Matlab指纹识别【优化求解】A*算法解决三维路径规划问题  matlab自动识别银行卡号【优化求解】模拟退火遗传实现带时间窗的车辆路径规划问题【数学建模】Matlab实现SEIR模型【优化求解】基于NSGA-2的求解多目标柔性车间调度算法【优化求解】蚁群算法求最优值 分享朋友圈获赞10即可获取该源码

matlab 遗传优化算法_【优化求解】遗传算法解决背包问题

继续阅读