1、问题介绍
2、遗传算法与程序
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]。
2、遗传算法与程序
遗传算法参数
(1)、初始化种群数目为NP=50, 染色体基因维数为L=10(对应于物品数), 最大进化代数为G=100。
(2)、产生二进制初始种群,其中1表示选择该物品,0表示不选择该物品。取适应度值为选择物品的价值总和,计算个体适应度值,当物品体积总和大于背包容量时,对适应度值进行惩罚计算。
(3)、对适应度进行归一化,采用基于轮盘赌的选择操作、基于概率的交叉和变异操作,产生新的种群,并把历代的最优个体保留在新种群中,进行下一步遗传操作。
(4)、判断是否满足终止条件(即迭代次数):若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
该问题的优化结果为[1010111001],1表示选择相应物品,0表示不选择相应物品,价值总和为388。
具体MATLAB实现程序与介绍如下
// 遗传算法程序
%初始化参数
clear all; %清变量
close all; %清图
clc; %清屏
NP = 50; %种群规模
L = 10; %物品件数(因为有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); %随机获得初始种群 矩阵50*10
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%