遗传算法求解0-1背包问题(JAVA)

合集下载

遗传算法在0-1一维背包问题上的应用研究

遗传算法在0-1一维背包问题上的应用研究
种群空间, 而混合遗传算法形成的种群空间强于耗 散遗传算法形成 的种群空间。所 以在效率上混合
() 2 耗散遗传算法 遗传算法可用耗散结构理论分析 : 系统初始条 件为随机选取的基 因 , 通过选 择、 交叉算子 向适应 度高的方向发展 , 变异算子提供随机扰动。因而形 成一种耗散结构。但 由于进化 的不断进行 系统 中 不同的基 因逐渐处于相 同, 使得这种耗散消逝。但 又会陷入局部最优解。交叉和变异算子对 于算法 的收敛性 起决 定作 用 , 而通 过变异 操作 可增 加种 群
的多样性 , 可跳 出上 述局 限。但 由于 一般交 叉 概率
遗传算法最好 , 耗散遗传算法次之 , 基本遗传算法 最差 。结 果如 下 面三 张表所 示 :
表 1 基本遗传算 法的运行结果
由于背包问题有约束条件 , 故在一般处理时采 用 罚 函数改造 目标 函数 得 到适 应 度 函数 。但 为方 便起见在我的程序 中将 目 函数直接表示为 : 标
f ,jj ∑ :a j ∑ :CX ,j x
【 0 ∑nli i . aX >b =
收到本文时 间:0 6年 1 2 20 2月 2 1 3
() 1 混合遗传算法 将启发式搜索算法“ 贪婪算法 ” 引入染色体解
码 过程 中 , 对于那 些 不满 足约束 的染 色体 编码 对应
的个体 , 优先装入价值密度较大且编码值为 1 的物 品, 直至背包容量 限制装不下为止, 并将未装入 的

作者简介 : 陆鹏 , , 男 硕士研究生 , 研究方 向: 数据仓库 与数 据挖 掘 , 遗传算法 。高茂庭 , , 士研 究生 , 男 博 副教授 , 研究 方 向: 数据挖 掘 , 数据库 , 管理信息系统 。李迎新 , , 男 硕士研究生 , 研究 方向 : 模糊识别 。

求解多维0-1背包问题的一种改进的遗传算法

求解多维0-1背包问题的一种改进的遗传算法
维普资讯
计算机科学 2 0 Vo. 3 o 7 0 6 1 N. 3
求解 多 维 0 1 包 问题 的一 种 改进 的遗 传 算 法 ) —背
曾 智 杨小 帆 陈 静 陈 文斌 唐 荣旺 ( 重庆 大 学计算 机 学院 重庆 4 0 4 ) 0 0 4
d a ft eg e y ag rt m n h 一d v so e r h a g rt , n i tt e mu t i n i n l - n p a k p o — e so h r e lo i d h a d t e 2 i iin s a c lo i m h a d ams a h l d me so a 1 k a s c r b i 0
lm e .
B s n t i d in c s v ro e ao ,h a e lo p e e t n i r v d g n t lo i o li h a e o hs me a r s e p r tr t ep p ras rs ns a mp o e e ei ag rt d o o c m h fr s vn t e o g
证 了其 有 效 性 。 关 键 词 多 维 O1背 包 问题 , 传 算 法 , 一 遗 中值 杂 交 算 子
An I r v d Ge e i g rt m o h u t i n i n l0 1Kn p a k Pr b e mp o e n t Al o ih f r t e M l d me s o a — a s c o lm c i
mu tdm e so a - n p a k p b e li i n i n l0 1 k a s c r lm. Fu t e mo e t e e fce c ft e p e e t d me h d i i v s i a e y c mp — o rh r r , h f iin y o h r s n e t o n e t t b o a s g d

遗传算法解决01背包问题

遗传算法解决01背包问题

遗传算法解决01背包问题2015 ~2016 学年第二学期学生姓名专业学号2016年 6 月目录一:问题描述 (3)二:遗传算法原理及特点 (3)三:背包问题的遗传算法求解 (3)1.文字描述 (3)2.遗传算法中的抽象概念在背包问题的具体化 (3)3.算法求解的基本步骤 (4)四:算法实现 (4)1.数据结构 (4)2.部分代码 (5)五:结论 (8)六:参考文献 (8)一、问题描述0-1背包问题属于组合优化问题的一个例子,求解0-1背包问题的过程可以被视作在很多可行解当中求解一个最优解。

01背包问题的一般描述如下:给定n个物品和一个背包,物品i的重量为Wi,其价值为Vi,背包的容量为C。

问应如何选择合适的物品装入背包,使得背包中装入的物品的总价值最大。

注意的一点是,背包内的物品的重量之和不能大于背包的容量C。

在选择装入背包的物品时,对每种物品i只有两种选择:即装入背包或者不装入背包,不能讲物品i装入背包多次,也不能只装入部分的物品,称此类问题为0/1背包问题。

二、遗传算法原理及特点遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。

遗传算法有着鲜明的优点:(1)遗传算法的操作对象是一组可行解,而非单个可行解;搜索轨道有多条,而非单条,因而具有良好的并行性.(2)遗传算法只需利用目标的取值信息,而无需递度等高价值信息,因而适用于任何规模,高度非线形的不连续多峰函数的优化以及无解析表达式的目标函数的优化,具有很强的通用性.(3)遗传算法择优机制是一种“软”选择,加上良好的并行性,使它具有良好的全局优化性和稳健性.(4)遗传算法操作的可行解集是经过编码化的(通常采用二进制编码),目标函数解释为编码化个体(可行解)的适应值,因而具有良好的可操作性与简单性.三、背包问题的遗传算法求解1、文字描述0-1背包问题传统的解决方法有动态规划法、分支界限法、回溯法等等。

遗传算法求解背包问题

遗传算法求解背包问题

遗传算法的过程:初始化:将计划装入背包的每个物品看成一个二进制串的一位,为1表示放入该物品,为0表示不放入该物品。

初始种群的产生:初始化前对放入背包物品数的一个预测(背包容积/物品最大体积),接下来只要在种群每条染色体中保证有(背包容积/物品最大体积)个为1的位初始化就完成了。

选择:选择进行杂交的父代染色体,被选中的父代染色体总是若干个染色体中最优(适应度最高)的,来保证向优化的方向发展。

详细的选择方法:随机产生2个数:Chrom_Cross_From, Chrom_Cross_To,当然得采用一定的手段来保证前者比后者小。

从Chrom_Cross_From到Chrom_Cross_To这Chrom_Cross_To-Chrom_Cross_From+1条染色体中选择最优(适应度最大)的染色体作为父代之一。

需要进行两次选择得到杂交的两条父代染色体。

这样做可以保证算法不会过早收敛。

函数实现:Individual Select(int ChromSize,Individual Pop[]){int Num_Selected,i,j,Chrom_Selected_From,Chrom_Selected_To,temp;Individual *Chrom_Selected;do{Chrom_Selected_From=rand()%PopSize;Chrom_Selected_To=rand()%PopSize;if(Chrom_Selected_From>Chrom_Selected_To){temp=Chrom_Selected_From;Chrom_Selected_From=Chrom_Selected_To;Chrom_Selected_To=temp;}Num_Selected=Chrom_Selected_To-Chrom_Selected_From+1;}while(Num_Selected<=0);Chrom_Selected=new Individual[Num_Selected];for(i=0;i<Num_Selected;i++)Chrom_Selected[i].chrom=new int[ChromSize];for(i=0,j=Chrom_Selected_From;i<Num_Selected,j<Chrom_Selected_To+1;i++,j++){Chrom_Selected[i]=Pop[j];}Order_Best_First(ChromSize,Num_Selected,Chrom_Selected);Chrom_Selected[0].fitness=Fitness(Chrom_Selected[0].chrom,ChromSize);return Chrom_Selected[0];}杂交:将两次选择得到的父代染色体进行杂交得到一条新的染色体,作为较新种群(并非新的种群)的一条染色体,杂交直到较新种群的染色体数等于原种群的染色体数。

求解0-1背包问题的克隆选择算法

求解0-1背包问题的克隆选择算法



86 一
科 黑江 技信息 — 龙— — —

信 息产 业 l 『 J
求解 0 1 - 背包 问题 的克隆选择算法
杨 玉
( 工学 院 计算机 工程 学院 , 苏 连云 港 2201 淮海 江 205
摘 要: 针对传统克隆选择算法中随机点变异求解 O 背包问题中存在的不足 , -1 将受体编辑功能引入克隆选择算法中, 出了基于混合克隆选择算法 提 的O 1背包问题求解算法。受体编辑机制 中基 因片断反转功能能够有效促进克隆进化。实验结果表明, - 与传统克隆选择算法相比, 该算法对 O 1 - 背包问题 有着较好的寻优能力和执行效率。 关键词: 克隆选择算法;受体编辑: - O 1背包问题
1 概述 表 1传 统和 混 合 克 隆 选择 算 法仿 真 结 果 ’ 随着人们对生物系统认识的不断深人 , 越来 物 品 数 指 标 — 两 一 越多的生物启发算法被提出并成功应用于许多工 量 法 法 ¥ 10 O 程领域的实际问题_ 而高级生物系统 中的信息处 l 】 。 最 好 平 均 理 系 统 : 经 系统 、 传 系统 、 神 遗 内分 泌 系 统 和 免疫 最 差 系统更是 吸引了来自理论研究和工程应用方面学 国 勰 拙 册 d 者的研究兴趣[] 2。特别是基于免疫系统机理而发 1 3 最 好 平 均 展的人工免疫系统 , 自动控制 、 在 模式识别 、 最优 最 差 化、 人侵检测等方面都有出色表现[ 4 1 。 d 0I - 背包 问题, 作为一种经典 N P难问题 , 既 5o 0 最 好 平 均 有理论研究意义 , 在资本预算 、 资源优化和存储分 3 o 最 差 配等方面有着实际应用价值 。 I 1 种 2 舯 203 , 绷 : 5 I -' - 0 鳓 10 1 t , 5 d 本文针对传统克 隆选择算法中随机点变异 如 旬 由 7 ∞ 5 ∞ 2 ∞ D 钾 ∞ ∞ D O ∞ 在背包问题中效率低下的缺点 ,提出了基于受体 图 1物 品 数 量 为 1 0时的 对 比结 果 0 编辑的混合算法。第 2 节介绍人工免疫系统的概 念和克隆选择算法,第 3节针对 0 1 - 背包问题进 行 仿真 验证 , 4节 给 出了本 文 的结论 。 第 2克隆选择算法 O50 00O. . .O0 0 ¨ 如前所述, 人工免疫系统是受生物免疫系统 启发解决实际问题 的智能计算方法。包括基于免 疫网络理论的人工免疫网络模型、基于免疫特异 硒 : : 档 柏 l ∞ 2 妻 。 性的否定选择算法 以及基于克隆选择学说的克隆 选择算法等I 其中克隆选择算法及其改进算法 已 3 ] 。 经在函数优化、 组合优化 、 模式识别 、 机器人控制 等 方面 得到 应用 。 克 隆选 择 本 质 上 是 一 个 亲 合 度 成 熟 ( ii a ny f t i0 3 H j ) 瓤】 疆 2 : 3 日 l 淞n ; 《 l0 喜 { 三 I } 1 2 《 2 0 b 0 I 3 ‘ : 0 4 0 { 岳} i 5 0 量) m trtn的过程 。 a ao) u i 在此过程 中亲合度较低的抗体 图 3 物 品数 量 为 5 0时 的 对 比 结果 0 图 2 物 品 数量 为 2 0时 的 对 比 结果 5 在克隆选择机制的作用下 ,经历增殖复制和变异 后, 逐步提高亲合度而“ 成熟” 。具体步骤如下所 1说明第 i , 个物品被选中放人包 中, 否则没有被 本文在传统克隆选择算法的基础上加人了受体编 示: 选 中 。有 关物 品重 量和 价值 的取 值有 如下 约定 [ 辑机制,该机制能够克服传统算法中随机点变异 6 1 : 步骤 l通过随机初始化产生包含有 M个抗 c =rn o 1 】 o a d m[ V , f 带来搜索能力低下的缺点 ,通过抗体基因片断的 3 1 体的抗体集合; =u +r () 反转提 升 克隆变 异 的有效 性 。基 于背 包 问题 的仿 4 步骤 2计算抗体集合 中抗体 的亲和度并按 C= 2 v f1 真实 验也 证明 了该 算法 的 良好性 能 。 5 照降序排列 ; 参 考文献 其 中 v 1, 5 =0r 。 = 步骤 3选取前 N个抗体,复制产生新的抗 【] P tn R C m uig w t boo ia 1 ao . o p t i i g l n h l c 3 . 2仿真结果 体集合。复制的数量与抗体的亲合度成正比; tp o s o d n a ma l,2 01 在以往求解优化问题时, 克隆选择算法抗体 me a h r .L n o :Ch p n Hal 0 . 步骤4执行变异操作。 在随机点变异的基础 初始化采取随机赋值的方法, 然而这对背包 问题 f1周 明,孙树栋 .遗传算法原理及应用【 2 M] 北 上, 加入受体编辑机制 , 提升变异效率。 这也是本 并不适合,我们假设初始状态下没有任何物品放 京 :国 防 工业 出版 社 . 9 . 1 9 9 文所提算法与传统算法的不同。 [】焦 李成,杜 海峰 ,刘芳,公 茂果.免 疫优 3 人背包 , : 即 步骤 5如果算法没有满足终止条件 , 则转到 化—— 计算 、 学习与 识 4M】 京:科 学 出版 【 北 i ,2 ) 0 , 0 =(1 , 五 …, =(, …, 0 ) 20 步骤 2否则算法结束。 , 为验证混合克隆选择算法的有效性,分别采 社 -0 6. 4 M】 3仿真实验 取 传统克 隆选择 算法 和混合 算法对 物品数 为 f】莫宏 伟 ,左 兴 权 .人 工 免 疫 系统 【 .北 京 : 31O l 包 问题 . —背 10、5 、0 0 20 50的背包 问题 进行 求 解测试 。 1 出 科 学 出版社 ,0 9 表 给 20. 01 L 背包 问题 可 以描 述 如下 : I 给定 1个 物 品 了进化 世代 数 为 50运 行 2 次 的平 均结 果 。 5 3 f] 5 史亮 , 董槐林 , 王备战 , 龙飞. 求解大规模 0 1 — 0、 0 和一个容量为 c的背包,从物品集合中挑选若干 从表 1 以看出, 可 随着物品数量的增加 , 混合 背 包 问题 的主 动遗 传 算 法 IJ 算机 工程 , J .计 0 7 7 3 -3 . 1 个物品使得如下价值函数 x ) 最大化 : 算 法表 现 出越来 越好 的性 能 。为 了更 加清 晰地 对 2 0 , : 3 比这两种算法 ,图 l23分别给出了物品数量为 [] Mih l 、、 6 t el c M. G nt A grh + D t eei lo tm c i a a ,x=∑p, () 1I x = 4 …, 1020 50情况 下最 好解 的进 化过 程 。 Sr c r s = E ouin P o rms M] e i t t e v lt rga I . d m uu o B 0 、5 、0 并同 时满 足 : ‘ ( 2 ) S rn e - ra , 1 9 . p i g r Ve l g 9 9 4 结论 其中 , x , , , 取 值 0 1 x=(, ) a , 或 ,是 P 作 者 简 介 : 玉 f9 9 1 女 , 教 , 要 研 杨 17 ~ , 助 主 克隆选择算法作为人工免疫系统中最重要的 物品 i 的价值, 是物品 i 的重量 。如果 取值为 个 分支 , 优化 问题 方面 有着 重要 的应用 前 景 。 究领 域 为 人 工 免 疫 系统 及 其 应 用 。 在

遗传算法求解0-1背包问题(步骤)(精)

遗传算法求解0-1背包问题(步骤)(精)

遗传算法求解0-1背包问题。

(步骤)#include "iostream.h"#include "iomanip.h"#include "stdlib.h"#include "math.h"#include "time.h"//定义问题的最大规模#define max 100//问题规模,即共有多少个包int packageNum;//每个包的重量int packageWeight[max];//每个包的价值int packageValue[max];//约束,背包的最大容量int limitWeight;//群体的规模int colonySize;//colonyState[i][k] 表示一个染色体//colonyState[1...colonySize][ 0|1 ] 表示一代群体int colonyState[max][2][max];// currAge 表示当前代的编号// (currAge+1)%2 表示下一代的编号int currAge = 0;//个体评价信息表typedef struct tagIndividualMsg{int index;int value;} IndividualMsg;IndividualMsg individualMsg[max];//////////////////////////////////////////////////////////// // 函数声明void printColonyState( int nextAge );//////////////////////////////////////////////////////////// //初始化群体void colonyInit(){int i , j;int w;for( i = 0 ; i < colonySize ; i++ ){//保证找到一个符合约束的染色体w = limitWeight + 1;while( w > limitWeight ){w = 0;for( j = 0 ; j < packageNum && w <= limitWeight ; j++ ){colonyState[i][currAge][j] = rand() % 2;w += packageWeight[j] * colonyState[i][currAge][j];}}}}//对个体进行评价int cmp( const void *a , const void *b ){IndividualMsg *x = (IndividualMsg *)a;IndividualMsg *y = (IndividualMsg *)b;return y->value - x->value;}void individualEstimate(){int i , j;for( i = 0 ; i < colonySize ; i++ ){individualMsg[i].index = i;individualMsg[i].value = 0;for( j = 0 ; j < packageNum ; j++ )individualMsg[i].value += packageValue[j] * colonyState[i][currAge][j]; }qsort( individualMsg , colonySize , sizeof(IndividualMsg) , cmp );}//终止循环的条件bool stopFlag(){//进行n 代进行后停止static int n = 50;if( n-- <= 0 )return true;elsereturn false;}//赌轮选择int gambleChoose(){int wheel[max] = { 0 };int i = colonySize - 1;int choose;wheel[i] = individualMsg[i].value;for( i-- ; i >= 0 ; i-- )wheel[i] = ( individualMsg[i].value + wheel[i+1] ) + colonySize * ( colonySize - i ); int seed = abs( wheel[0] - ( rand() % ( 2 * wheel[0] ) + 1 ) );choose = colonySize - 1;while( seed > wheel[choose] )choose--;// cout<<"----------------------------------------"<<endl;// cout<<"wheel :"<<endl;// for( i = 0 ; i < colonySize ; i++ )// cout<<setw(5)<<wheel[i];// cout<<endl;// cout<<"seed = "<<seed<<endl;// cout<<"choose "<<choose<<endl;return choose;}//交叉void across( int male , int female , int index ){int nextAge = (currAge+1)%2;int i , j , t;int acrossBit = rand() % (packageNum-1) + 1;for( j = 0 ; j < packageNum ; j++ ){colonyState[index][nextAge][j] =colonyState[individualMsg[male].index][currAge][j];colonyState[index+1][nextAge][j] =colonyState[individualMsg[female].index][currAge][j];}for( i = 0 ; i < acrossBit ; i++ ){t = colonyState[index][nextAge][i];colonyState[index][nextAge][i] = colonyState[index+1][nextAge][i];colonyState[index+1][nextAge][j] = t;}}//变异void aberrance( int index ){int seed , nextAge;nextAge = (currAge+1)%2;//只有1/3 的概率发生异变seed = rand() % ( packageNum * 3 );if( seed < packageNum )colonyState[index][nextAge][seed] = ( colonyState[index][nextAge][seed] + 1 ) % 2;}//处理死亡个体void dealDeath(){int i , j;int weight , w;int nextAge = (currAge+1)%2;for( i = 0 ; i < colonySize ; i++ ){weight = 0;for( j = 0 ; j < packageNum ; j++ )weight += packageWeight[j] * colonyState[i][nextAge][j];if( weight > limitWeight ){//随机生成新的个体w = limitWeight + 1;while( w > limitWeight ){w = 0;for( j = 0 ; j < packageNum && w <= limitWeight ; j++ ){colonyState[i][nextAge][j] = rand() % 2;w += packageWeight[j] * colonyState[i][nextAge][j];}}}}printColonyState( nextAge );}//最优个体保护void saveBest(){int i , j;int min , minp , value;int nextAge = ( currAge+1)%2;min = individualMsg[0].value;minp = -1;for( i = 0 ; i < colonySize ; i++ ){value = 0;for( j = 0 ; j < packageNum ; j++ )value += packageValue[j] * colonyState[i][nextAge][j]; if( value <= min ){min = value;minp = i;}}if( minp >= 0 ){for( j = 0 ; j < packageNum ; j++ ){colonyState[minp][nextAge][j] =colonyState[individualMsg[0].index][currAge][j];}}}//////////////////////////////////////////////////////////// void setProblem(){int i;packageNum = 5;int w[] = { 5 , 4 , 3 , 2 , 1 };int v[] = { 8 , 9 , 3 , 1 , 2 };for( i = 0 ; i < packageNum ; i++ ){packageWeight[i] = w[i];packageValue[i] = v[i];}limitWeight = 13;colonySize = 5;}void printProblem(){int i;cout<<"----------------------------------------"<<endl;cout<<"problem state:"<<endl;cout<<"packageNum = "<<packageNum<<endl;cout<<"limitWeight = "<<limitWeight<<endl;cout<<"Weight: ";for( i = 0 ; i < packageNum ; i++ )cout<<setw(3)<<packageWeight[i];cout<<endl;cout<<"Value: ";for( i = 0 ; i < packageNum ; i++ )cout<<setw(3)<<packageValue[i];cout<<endl;}void printColonyState( int k ){cout<<"----------------------------------------"<<endl;cout<<"colonyState-->";if( k == currAge )cout<<"currAge:"<<endl;elsecout<<"next age:"<<endl;int i , j;for( i = 0 ; i < colonySize ; i++ ){for( j = 0 ; j < packageNum ; j++ )cout<<setw(2)<<colonyState[i][k][j];cout<<endl;}}void printIndividualMsg(){int i;cout<<"----------------------------------------"<<endl;cout<<"Individual Msg:"<<endl;for( i = 0 ; i < colonySize ; i++ ){cout<<individualMsg[i].index<<"\t"<<individualMsg[i].value<<endl; }}////////////////////////////////////////////////////////////void main(){srand( (unsigned int)time(NULL) );setProblem();printProblem();//初始群体colonyInit();printColonyState( currAge );while( !stopFlag() ){//评价当前群体individualEstimate();//生成下一代for( int i = 0 ; i < colonySize ; i += 2 ){int male = gambleChoose();int female = gambleChoose();across( male , female , i );aberrance( i );aberrance( i + 1 );}//处理死亡个体dealDeath();//最优个体保护saveBest();//现在的下一代变成下一轮的当前代currAge = ( currAge + 1 ) % 2;//printColonyState( currAge );}//输出问题解individualEstimate();cout<<"近似解:"<<endl;int j , w = 0;cout<<setw(10)<<"Value:";for( j = 0 ; j < packageNum ; j++ )cout<<setw(5)<<packageValue[j];cout<<endl;cout<<setw(10)<<"Weight:";for( j = 0 ; j < packageNum ; j++ ){w += packageWeight[j] * colonyState[individualMsg[0].index][currAge][j]; cout<<setw(5)<<packageWeight[j];}cout<<endl;cout<<setw(10)<<"Choose:";for( j = 0 ; j < packageNum ; j++ )cout<<setw(5)<<colonyState[individualMsg[0].index][currAge][j];cout<<endl;cout<<"limitWeight: "<<limitWeight<<endl;cout<<"总重量: "<<w<<endl;cout<<"总价值: "<<individualMsg[0].value<<endl; }////////////////////////////////////////////////////////////。

格雷码混合遗传算法求解0-1背包问题

格雷码混合遗传算法求解0-1背包问题
王则林 ,吴 志健
4002 307 )

(. 1 南通大 学 计算机科 学与技 术学院,江 苏 南通 26 0 ;2 武汉 大学 软件工程 国家重点 实验 室, 汉 200 . 武

要 :给 出 01背 包问题 的数 学模 型 , 改传 统二 进 制编码 为格 雷码 混 合遗 传 算法 , 用 贪心 算 法来 解 决约 - 修 使
近些年 , 背包 问题 吸引了很多理论和实际工作者对此问题 进行深入 的研究 。主要是 由于在工业上很多的实际应 用 , 如资
品的重量和价值分别记为 W 、 i 1 … , ) 背包能 承受 的最 p( = , n ,
大重量是 C 当物品 i , 被选择进入 背包时 , =1否则 , :0 背 , ;
m a i ie xm z
般仅能获得 问题 的近似最优解 。近年来 , 不少学者将稳健 的
s 3 a t l ≤c uj to∑ x ] c i
中图分类 号 :T 1 P8 文献标 志码 :A 文章 编号 :10 -6 5 2 1 ) 8 2 0 - 3 0 13 9 ( 0 2 0 -9 6 0
d i1 . 9 9 ji n 10 -6 5 2 1 . 8 0 7 o :0 3 6 / .s . 0 139 . 0 2 0 .2 s
v re e rc s. en e g n e p o e s Th ume c le p rm e o e h fe t iy o h lo t m . i r a x e i ntprv s te a ci t ft e ag r h v i
K yw r s eei a o tm( A) npakpolm;G r cd ;ged grh e od :gnt l rh G ;ka sc rbe c gi a oe reya o tm;eis c ai y l i li mehns tm m

求解0-1背包问题的混沌遗传算法

求解0-1背包问题的混沌遗传算法

En a c d te eg d ct h n e r o ii h y
o h oi e r h b sn o e n t n c r e c n l g i rv d g n t lo t m r mau e p o lm y e e ig c a s fc a t s ac y u i gp w r u c i ar rt h oo y, mp o e e e i ag r h p e t r r be b mb d n h o c f o i e c i o t l o u in o ti e n o b s p i l t b an d i t a i GA,a d i rv d t e c p ct fag rtm o a o d t elc le t me a d t o v r et ma s o c n mp o e h a a i o o h t v i o a x r n o c n e g o y l i h e h lb lo t t eg o a pi l o ui n q i ky ma l t u c l .R s l ft en mei a x ei n h w t a ep o o e lo tm se e t ea d U — s 6 e ut o u r l e p r s h c me ts o t h rp s d ag r h i f ci n s h t i v e
田建立 , 晁学鹏
( 河科 技 学院 计算机 科学 系, 州 400 ) 黄 郑 50 6
摘 要 :提 出一种 改进 的混沌遗传 算法来求解 0 1背 包问题 。通过利 用幂函数 载波技 术增强混沌搜 索的遍历性 , -
把混沌搜 索得 到的最优解直接作 为新群体嵌入遗传 算法来改善遗传算 法的早 熟问题 , 从而使算 法有 能力避免 陷入 局部极值而快速 收敛于全局 最优 解。仿 真 实验结果表 明 了 算法求解 0 1 包问 的有效性和适 用性 。 该 —背 题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

遗传算法求解0-1背包问题一、问题描述给定n种物品和容量为C的背包。

物品i的重量是wi,其价值为vi。

问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?二、知识表示1、状态表示(1)个体或染色体:问题的一个解,表示为n个比特的字符串,比特值为0表示不选该物品,比特值为1表示选择该物品。

(2)基因:染色体的每一个比特。

(3)种群:解的集合。

(4)适应度:衡量个体优劣的函数值。

2、控制参数(1)种群规模:解的个数。

(2)最大遗传的代数(3)交叉率:参加交叉运算的染色体个数占全体染色体的比例,取值范围一般为0.4~0.99。

(4)变异率:发生变异的基因位数所占全体染色体的基因总位数的比例,取值范围一般为0.0001~0.1。

3、算法描述(1)在搜索空间U上定义一个适应度函数f(x),给定种群规模N,交叉率Pc和变异率Pm,代数T;(2)随机产生U中的N个个体s1, s2, …, sN,组成初始种群S={s1, s2, …, sN},置代数计数器t=1;(3)计算S中每个个体的适应度f() ;(4)若终止条件满足,则取S中适应度最大的个体作为所求结果,算法结束。

(5)按选择概率P(xi)所决定的选中机会,每次从S中随机选定1个个体并将其染色体复制,共做N次,然后将复制所得的N个染色体组成群体S1;(6)按交叉率Pc所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;(7)按变异率P m所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;(8)将群体S3作为新一代种群,即用S3代替S,t = t+1,转步3。

三、算法实现1、主要的数据结构染色体:用一维数组表示,数组中下标为i的元素表示第(i+1)个物品的选中状态,元素值为1,表示物品被选中,元素值为0表示物品不被选中。

种群:用二维数组表示,每一行表示一个染色体。

具有最大价值的染色体:由于每一个染色体经过选择、交叉、变异后都可能发生变化,所以对于产生的新的总群,需要记录每个物品的选中状态。

同时保存该状态下物品的最大价值,如果新的总群能够产生更优的值,则替换具有最大价值的染色体。

2、算法流程图四、实验结果和分析1、用户界面2、输入3、输出(1)种群的规模为4,最大遗传代数为8(连续4次运行结果)(2)种群的规模为20,最大遗传代数为8(连续4次运行结果)(3)种群的规模为4,最大遗传代数为50(连续4次运行结果)由于篇幅的关系,只给出了不同情况下的连续4次运行结果,如果运行更多次就会发现:其他控制参数不变,种群规模越大,结果越精确;其他控制参数不变,最大遗传代数越大,结果越精确。

五、程序一共有3个类:PackageByGA(主类),Max_value_single(具有最大价值的个体或染色体),Global(定义了一些全局常量)。

1、PackageByGApackage .hdy;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.InputStreamReader;import java.io.PrintWriter;import javax.swing.JFileChooser;import javax.swing.JOptionPane;//遗传算法解决0-1背包问题public class PackageByGA {private int package_capacity = 0;//背包的容量private int goods_num = 0;//物品的个数,对应遗传学中个体的基因个数private int[] goods_weight = null;//物品的价值private double[] goods_value = null;//物品的价值private int[][] popu = null;//种群public PackageByGA(){input();}//输入private void input(){JFileChooser fc = new JFileChooser();//文件选择对话框fc.setCurrentDirectory(new File("."));//从当前目录选择文件//获取输入源,输入源为选取的文件fc.addPropertyChangeListener(new PropertyChangeListener() {//注册监听器public void propertyChange(PropertyChangeEvent arg0) {//属性改变事件if (arg0.getPropertyName()== JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {//选择单个文件try {File file = (File) arg0.getNewValue();//获取属性的新值,转换为文件对象//创建输入流FileInputStream fi = new FileInputStream(file);InputStreamReader ir = new InputStreamReader(fi);BufferedReader br = new BufferedReader(ir);//获取第一行数据,背包的容量package_capacity = Integer.parseInt(br.readLine().trim());//------------------------------String str_line = null;//获取第二行数据,物品的重量str_line = br.readLine();goods_weight = strArr_to_intArr(str_line.split(" "));//获取第三行数据,物品的价值str_line = br.readLine();goods_value = strArr_to_doubleArr(str_line.split(" "));//物品的个数goods_num = goods_value.length;//关闭输入流fi.close();ir.close();br.close();} catch (Exception ep) {//如果文件的内容不是全为数字,则弹出对话框JOptionPane.showMessageDialog(null,"文件读取异常,检查文件内容是否全为数字!");}}}});fc.showOpenDialog(null);//弹出"打开文件"对话框}//字符串数组转换为整数数组private int[] strArr_to_intArr(String[] strArr){int size = strArr.length;int[] int_arr = new int[size];for(int i = 0; i < size; i ++){int_arr[i] = Integer.valueOf(strArr[i]);}return int_arr;}//字符串数组转换为浮点数数组private double[] strArr_to_doubleArr(String[] strArr){int size = strArr.length;double[] double_arr = new double[size];for(int i = 0; i < size; i ++){double_arr[i] = Double.valueOf(strArr[i]);}return double_arr;}//一维数组复制private int[] singleArrayCopy(int[] source){int size = source.length;int[] des = new int[size];for(int i = 0; i < size; i ++){des[i] = source[i];}return des;}//二维数组复制private int[][] doubleArrayCopy(int[][] source){int row_num = source.length;int col_num = source[0].length;int[][] des = new int[row_num][col_num];for(int i = 0; i < row_num; i ++){for(int j = 0; j < col_num; j ++){des[i][j] = source[i][j];}}return des;}//产生初始种群public int[][] generatePopu(){popu = new int[Global.POPU_NUM][goods_num];for(int i = 0; i < Global.POPU_NUM; i ++){for(int j = 0; j < goods_num; j ++){double d = Math.random()*10;//[0,10)之间的double型数值popu[i][j] = ((int)Math.round(d))%2;//1表示选择该物品,0表示不选择该物品}if(get_singleWeight(popu[i]) > package_capacity){//超出背包容量i --;}}return popu;}//计算个体的总重量private int get_singleWeight(int[] single){int total_weight = 0;int size = single.length;for(int i = 0; i < size; i ++){if(single[i] == 1){total_weight += goods_weight[i];}}return total_weight;}//计算个体的总价值private double get_singleValue(int[] single){int total_value = 0;int size = single.length;for(int i = 0; i < size; i ++){if(single[i] == 1){total_value += goods_value[i];}}return total_value;}//获取总价值最大的个体public void get_maxValue_single(int[][] popu){ int size = popu.length;double[] fitness = new double[size];for(int i = 0; i < size; i ++){fitness[i] = get_singleValue(popu[i]);}int id = 0;double max_value = fitness[0];for(int j = 1; j < size; j ++){if(fitness[j] > max_value){max_value = fitness[j];id = j;}}if(max_value > Max_value_single.max_value){ Max_value_single.max_value = max_value;int[] max_value_single = new int[goods_num];for(int i = 0; i < goods_num; i ++){max_value_single[i] = popu[id][i];}Max_value_single.max_value_single = max_value_single;}}//计算每个个体的适应度public double[] getFitness(int[][] popu){int size = popu.length;double[] fitness = new double[size];for(int i = 0; i < size; i ++){fitness[i] = get_singleValue(popu[i]);}return fitness;}//计算每个个体的选择概率private double[] get_selectRate(double[] fitness){double sum = 0;int size = fitness.length;double[] select_rate = new double[size];for(int i = 0; i < size; i ++){sum += fitness[i];}for(int j = 0; j < size; j ++){select_rate[j] = fitness[j]/sum;}return select_rate;}//计算每个个体的累积概率private double[] get_accuRate(double[] select_rate){int i = 0;int size = select_rate.length;double[] accu_rate = new double[size];for(i = 0; i < size; i ++){accu_rate[i] = select_rate[i];}for(i = 1; i < size; i ++){accu_rate[i] += accu_rate[i-1];}return accu_rate;}//选择public int[][] select(double[] accu_rate, int[][] popu){double random_rate;int size = accu_rate.length;int[][] select_popu = new int[Global.POPU_NUM][goods_num];select_popu = doubleArrayCopy(popu);for(int i = 0; i < size; i ++){random_rate = Math.random();for(int j = 0; j < size; j ++){if(random_rate <= accu_rate[j]){select_popu[i] = singleArrayCopy(select_popu[j]);}}}return select_popu;}//交叉public int[][] crossover(int[][] select_popu){int i = 0;int random_pos = 0, temp = 0;//交换基因的位置int cross_num = (int)(Global.CROSS_RA TE * Global.POPU_NUM);//参与交换的个体数//System.out.println(cross_num);int[][] cross_popu = new int[Global.POPU_NUM][goods_num];cross_popu = doubleArrayCopy(select_popu);for(i = 1; i < cross_num; i += 2){random_pos = (int)Math.round(Math.random())%goods_num;temp = cross_popu[i][random_pos];cross_popu[i][random_pos]= cross_popu[i-1][random_pos];cross_popu[i-1][random_pos] = temp;if(get_singleWeight(cross_popu[i]) > package_capacity || get_singleWeight(cross_popu[i-1]) > package_capacity){temp = cross_popu[i][random_pos];cross_popu[i][random_pos]= cross_popu[i-1][random_pos];cross_popu[i-1][random_pos] = temp;}}return cross_popu;}//变异public int[][] mutate(int[][] cross_popu){int i = 0;int row_id = 0;int col_id = 0;int mutate_num = (int)(Global.MUTA_RATE * Global.POPU_NUM * goods_num);//参与变异的基因个数//System.out.println(mutate_num);int[][] mutate_popu = new int[Global.POPU_NUM][goods_num];mutate_popu = doubleArrayCopy(cross_popu);for(i = 0; i < mutate_num; i ++){row_id = (int)Math.round(Math.random()*10)%Global.POPU_NUM;col_id = (int)Math.round(Math.random()*10)%goods_num;mutate_popu[row_id][col_id] = 1 - mutate_popu[row_id][col_id];if(get_singleWeight(mutate_popu[row_id]) > package_capacity){mutate_popu[row_id][col_id] = 1 - mutate_popu[row_id][col_id];}}return mutate_popu;}//遗传算法public int[][] packetByGA(){int popu_id = 1; //总群的代数double[] fitness = null;double[] select_rate = null;double[] accu_rate = null;int[][] select_popu = null;int[][] cross_popu = null;int[][] popu = generatePopu();get_maxValue_single(popu);/*System.out.println("第" + popu_id + "代种群的最大值:" + Max_value_single.max_value);*/while(popu_id < Global.MAX_GEN_NUM){//没有终止fitness = getFitness(popu);select_rate = get_selectRate(fitness);accu_rate = get_accuRate(select_rate);select_popu = select(accu_rate, popu);cross_popu = crossover(select_popu);popu = mutate(cross_popu);//下一代总群popu_id ++;get_maxValue_single(popu);/*System.out.println("第" + popu_id + "代种群的最大值:" + Max_value_single.max_value);*/}return popu;}//输出public void output(int[][] popu){//-----------------------File f = null;FileWriter fw = null;PrintWriter pw = null;//------------------------try {f = new File("./packageByGA.txt");fw = new FileWriter(f);pw = new PrintWriter(fw);//背包的容量pw.write("背包的容量:");pw.write("" + package_capacity);pw.println();pw.println();//物品的重量pw.write("物品的重量:");for(int j = 0; j < goods_num; j ++){if(Max_value_single.max_value_single[j] == 1){pw.write(goods_weight[j] + " ");}}pw.println();pw.println();//物品的价值pw.write("物品的价值:");for(int j = 0; j < goods_num; j ++){if(Max_value_single.max_value_single[j] == 1){pw.write(goods_value[j] + " ");}}pw.println();pw.println();//总价值pw.print("物品的总价值:");pw.print(Max_value_single.max_value);//-------------------------pw.close();fw.close();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args){PackageByGA ga = new PackageByGA();int[][] popu = ga.packetByGA();ga.output(popu);}}2、Max_value_singlepackage .hdy;//最大价值的个体public class Max_value_single{public static int[] max_value_single = null;public static double max_value = 0;}3、Globalpackage .hdy;public class Global {public final static int POPU_NUM = 4; //种群的规模public final static int MAX_GEN_NUM = 8; //遗传的最大代数public final static double CROSS_RATE = 1; //交叉率public final static double MUTA_RATE = 0.1; //变异率}输入:input.txt102 2 6 5 46 3 5 4 6。

相关文档
最新文档