资源简介
matlab遗传算法解决背包问题,价值比为目标函数,matlab软件编程实现,没有采用工具包,按照C格式编写
代码片段和文件信息
%贪婪算法、遗传算法解决背包问题
%初始化参数
clear all;%清除所有变量
close all;%清图
clc;%清屏
N=50;%种群数量
L=50;%二进制位串长度
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];%初始化物品价值
g=value./c;%价值密度(价值/重量)贪婪算法
m1=1000;%总重量约束值
v=randi([01]NL);%随机生成50组初始解50x50
v=greedy(vcgm1);%贪婪算法修复解
G=500;%最大遗传代数
pc=0.5;%交叉率
pm=0.01;%变异率
nf=zeros(NL);
%遗传算法循环
for gen=1:G
fit =v*value‘;%当前解计算的总价值50x1
%选择个体
maxfit=max(fit);%最大适应度值
minfit=min(fit);%最小适应度值
rr=find(fit==maxfit);%返回最大适应度值下标
fBest=v(rr(11):);%历代最优个体最优染色体编码
fitt=(fit-minfit)/(maxfit-minfit);%归一化适应度值
%基于轮盘赌的复制操作
sum_fit=sum(fitt);%种群中所有个体的适应度和
fitvalue=fitt./sum_fit;%个体被选中的概率
fitvalue=cumsum(fitvalue);%数组(50x1矩阵)第1列第n行元素是前n行元素的累加和
ms=sort(rand(N1));%生成服从均匀分布的随机数50x1的矩阵,并对其升序排列
fiti=1;
newi=1;
while newi<=N&&fiti<=N
if (ms(newi)) nf(newi:)=v(fiti:);
newi=newi+1;
else
fiti=fiti+1;
end
end
%基于概率的交叉操作
for i=1:2:N%50组数据两两交叉
p=rand;%产生一个均匀分布的随机数r
if ppc所产生的两个子代仅是亲代的各自副本
q=randi([01]1L);%随机生成1x50
for j=1:L
if q(j)==1
temp=nf(i+1j);
nf(i+1j)=nf(ij);
nf(ij)=temp;
end
end
end
end
%基于概率的变异操作
i=1;
while i<=round(N*pm)%个体变异数
h=randi(N);%随机选取一个需要变异的染色体(1~50随机选择)
for j=1:round(L*pm)%基因变异数
g=randi(L);%随机选取需要变异的基因数(1~50随机选择)
nf(hg)=~nf(hg);
end
i=i+1;
end
nf=greedy(nfcgm1);
nfit=nf*value‘;%新解计算的总价值50x1
newv=[v;nf];%子代和父代合并100x50
newfit=[fit;nfit];%子代和父代的适度值合并(100x1)
[nnewfitIndex]=sort(newfit‘descend‘);%适度值按降序排列
sortf=newv(Index:);%按适度值排列个体
nsortf=nnewfit(1:N);%取前N个适应度值
nf=sortf(1:N:);%取前N个个体
v=nf;
trace(gen)=nsortf(11);%历代最优适应度
end
Bestf=sortf(1:);%最优个体
trace(end);%最优值
figure
plot(trace)
xlabel(‘迭代次数‘)
ylabel(‘目标函数值‘)
title(‘适应度进化曲线‘)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 550 2017-06-14 15:41 greedy.m
文件 2866 2017-06-14 16:34 genetic.m
评论
共有 条评论