遗传算法求解0-1背包问题(JAVA)
遗传算法在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背包问题的一种改进的遗传算法
计算机科学 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背包问题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背包问题的克隆选择算法
一
一
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背包问题。
(步骤)#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背包问题
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背包问题的混沌遗传算法
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 包问 的有效性和适 用性 。 该 —背 题
0-1背包问题求解方法综述
算法分析与设计大作业实验题目:0-1背包问题求解方法综述组员:班级:指导老师:0-1背包问题求解方法综述【摘要】:0-1背包问题是一个经典的NP-hard组合优化问题,现实生活中的很多问题都可以以它为模型。
本文首先对背包问题做了阐述,然后用蛮力解法、动态规划算法、贪心算法和回溯解法对背包问题进行求解,分析了0-1背包问题的数学模型,刻划了最优解的结构特征,建立了求最优值的递归关系式。
最后对四种算法从不同角度进行了对比和总结。
【关键词】:0-1背包问题;蛮力解法;动态规划算法;贪心算法;回溯解法。
0.引言0-1背包问题是指给定n个物品,每个物品均有自己的价值vi和重量wi(i=1,2,…,n),再给定一个背包,其容量为W。
要求从n个物品中选出一部分物品装入背包,这部分物品的重量之和不超过背包的容量,且价值之和最大。
单个物品要么装入,要么不装入。
很多问题都可以抽象成该问题模型,如配载问题、物资调运[1]问题等,因此研究该问题具有较高的实际应用价值。
目前,解决0-1背包问题的方法有很多,主要有动态规划法、回溯法、分支限界法、遗传算法、粒子群算法、人工鱼群算法、蚁群算法、模拟退火算法、蜂群算法、禁忌搜索算法等。
其中动态规划、回溯法、分支限界法时间复杂性比较高,计算智能算法可能出现局部收敛,不一定能找出问题的最优解。
文中在动态规划法的基础上进行了改进,提出一种求解0-1背包问题的算法,该算法每一次执行总能得到问题的最优解,是确定性算法,算法的时间复杂性最坏可能为O(2n)。
1.0-1背包问题描述0-1背包问题(KP01)是一个著名的组合优化问题。
它应用在许多实际领域,如项目选择、资源分布、投资决策等。
背包问题得名于如何选择最合适的物品放置于给定背包中。
本文主要研究背包问题中最基础的0/1背包问题的一些解决方法。
为解决背包问题,大量学者在过去的几十年中提出了很多解决方法。
解决背包问题的算法有最优算法和启发式算法[2],最优算法包括穷举法、动态规划法、分支定界法、图论法等,启发式算法包括贪心算法、遗传算法、蚁群算法、粒子算法等一些智能算法。
求解大规模0-1背包问题的主动进化遗传算法
础 上的主动进化思想 引入到遗传 算法领域 ,使遗传算法能以
一
种 较为确定 、更为有效的方式在解 空间中进行寻优 ,从而
较好 地克服标准遗传算法 由不定变 异导致 的盲 目性 ,提高遗
p o l m n x e me t e u t h w h t r be a de p r i n s lss o t a r AEBGA a o d a ii fg o a pt z to n i h e c e c . h sg o b lt o l b l i a i n a d h g f i n y y o mi i
文 标 码- 献 识 A
中 分 号 P 1 圈 类 t 3. T 06
求解 大规模 01背 包问题 的主动进化 遗传 算法 -
史 亮,董槐林,
( 厦门大学 ¨ : , . 一 摘
成,龙
飞
’ 31 5 J 60 0
要 :针对遗传算法求解大规模 0 1 - 背包问题中存在的不足,将 定向变 异机制 引入到遗传 算法中 ,提 出了基于主动进化遗传算法的 01 —
维普资讯
第3 卷 第 l 期 3 3
正 3 3
・计Biblioteka 算机工程
20 07年 7月
J l 0 7 uy 2 0
No. 3 1
Co u e g n e i g mp t rEn i e r n
博士论文 ・
文 编 ‘ — 4 ( I l 0 l I 章 号t } 3 8o73 0 — lI 2 2l — 3 . o )
背包问题求解算法。该算法利用概率编码 方案对种予个体进行编码 ,每代 种群中的个体通过对该代种子 个体进行测度而产生 ,用于 定向变
遗传算法求解01背包问题
遗传算法求解01背包问题一、问题描述01背包问题属于组合优化问题的一个例子,求解01背包问题的过程可以被视作在很多可行解当中求解一个最优解。
01背包问题的一般描述如下:给定n个物品和一个背包,物品i的重量为W i,其价值为V i,背包的容量为C。
选择合适的物品装入背包,使得背包中装入的物品的总价值最大。
注意的一点是,背包内的物品的重量之和不能大于背包的容量C。
在选择装入背包的物品时,对每种物品i只有两种选择:装入背包或者不装入背包,即只能将物品i装入背包一次。
称此类问题为0/1背包问题。
01背包问题是NP问题,传统的解决方法有动态规划法、分支界限法、回溯法等等。
传统的方法不能有效地解决01背包问题。
遗传算法(Genetic Algorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。
二、遗传算法1、遗传算法的基本思想遗传算法的搜索从一个被称作种群的候选解集开始,新的种群由旧的种群中产生以期得到更好的种群。
从旧种群中按照解的适应度来选择解以产生新的解;适应度越大,解被选择生成后代的机率也越大。
这个从已有种群中选择双亲并产生后代的迭代过程持续到遗传算法的停止条件满足为止。
2、遗传算法的基本元素。
遗传算法由以下几个原素组成:由染色体组成的种群,根据适应度进行选择以及交叉产生后代。
三、用遗传算法求解01背包问题1、01背包问题中染色体的表示。
用向量X来表示染色体,X = {x1,x2,……,x n}。
,x i∈{0,1},x i=1表示物品i装入了背包,x i =0表示物品i未装入背包。
每个染色体对应其当前装入背包的物品的总价值和总重量。
背包中物品的中价值代表了该物品的适应度。
程序中定义了这样的一个结构来表示染色体:typedef struct{int Weight; //染色体代表的物品的总重量int Fitness; //染色体代表的物品的价值(适应度)int Gene[NUMG]; //用元素取值于定义域{0,1}的数组表示染色体。
递归法求01背包问题
递归法求01背包问题一、问题描述0/1背包问题:现有n种物品,对1<=i<=n,已知第i种物品的重量为正整数W i,价值为正整数V i,背包能承受的最大载重量为正整数W,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过W且总价值尽量大。
(注意:这里对每种物品或者全取或者一点都不取,不允许只取一部分)二、算法分析递归法:在利用递归法解决0-1背包问题时,我们可以先从第n个物品看起。
每次的递归调用都会判断两种情况:(1)背包可以放下第n个物品,则x[n]=1,并继续递归调用物品重量为W-w[n],物品数目为n-1的递归函数,并返回此递归函数值与v[n]的和作为背包问题的最优解;(2)背包放不下第n个物品,则x[n]=0,并继续递归调用背包容量为W,物品数目为n-1的递归函数,并返回此递归函数值最为背包问题的最优解。
递归调用的终结条件是背包的容量为0或物品的数量为0.此时就得到了0-1背包问题的最优解。
用递归法解0-1背包问题可以归结为下函数:⎩⎨⎧+---=][])[,1(),1(),(n v n w m n KnapSack m n KnapSack m n KnapSack nn 选择了物品没有选择物品 第一个式子表示选择物品n 后得到价值][])[,1(n v n w m n KnapSack +--比不选择物品n 情况下得到的价值),1(m n KnapSack -小,所以最终还是不选择物品n;第二个式子刚好相反,选择物品n 后的价值][])[,1(n v n w m n KnapSack +--不小于不选择物品n 情况下得到了价值),1(m n KnapSack -,所以最终选择物品n 。
在递归调用的过程中可以顺便求出所选择的物品。
下面是标记物品被选情况的数组x[n]求解的具体函数表示:⎩⎨⎧=10][n x ][])[,1(),(),1(),(n v n w m n KnapSack m n KnapSack m n KnapSack m n KnapSack +--=-= 在函数中,递归调用的主体函数为KnapSack ,m 表示背包的容量,n 表示物品的数量,x[n]表示是否选择了第n 个物品(1—选,0—不选)。
遗传蚁群算法解决背包问题
算法策略
(4)Allowed中物品j被选择的概率(步骤6(3))为:
其中,tj为物品j上的信息素浓度,初始信息浓度 tj相等,本文设 tj=1/sum(P)(P为物品的价 值集),qj为物品 j 的价值重量比。
(5)选择操作(步骤7)采用排序法,所有蚂蚁和上代中的前k个个体共同参与排 序。遗传算法和蚁群算法均采用0、1 编码和统一的信息素更新公式:
结束
Thank you !
改进型遗传蚁群混合算法求解 0/1背包问题
报告人:宋玲 地 点:计算机院软工实训室 时 间:2013年11月15日
研究背景
背包问题(Knapsack Problems)是运筹学中的一个典型的优化难
题,对背包问题的研究具有极其重要的理论和现实意义。实际生活中, 资源分配、投资决策、装载问题、网络资源分配等问题都可归纳为背包 问题。目前,已经出现许多种求解背包问题的优化算法。其中遗传算法 是一种基于自然选择和群体遗传机理的搜索算法,模拟了自然选择和自 然遗传过程中的繁殖、杂交和突变现象。它属于随机搜索算法,具有较 强的全局搜索能力,但遗传算法中的个体对于每次的选择不存在反馈信 息,因此遗传算法的收敛速度较慢,而且优化精度不高。蚁群算法在求 解 0/1背包问题时,主要通过物品上的信息素进行选择,一个物品上的 信息素越高,被选择的概率就越大。蚁群算法采用正反馈机制,能够快 速地收敛到问题的局部最优解,但存在全局搜索能力较低、搜索时间较 长等缺点。由于两种算法各有利弊,近年来,许多学者致力于两种算法 的混合研究。本文提出了一种基于两者新的混合方式的算法,来求解 0/1背包问题。
一种求解0-1背包问题的启发式遗传算法
a n d t h e c h a r a c t e i r s t i c s o f i t s o p t i ma l v a l u e .B y i n t e g r a t i n g t h e g r e e d y s t r a t e y g i n t o p o p u l a t i o n i n i t i li a s a t i o n,c r o s s o v e r o p e r a t o r a n d mu t a t i o n
o p e r a t o r o f t h e g e n e t i c a l g o i r t h m ,a n d i n t r o d u c i n g t h e d i v i d e — a n d — c o n q u e r s t r a t e g y t o s e l e c t i o n o p e r a t o r ,w e p r o p o s e a h e u i r s t i c g e n e t i c
Ke y wo r d s
Kn a p s a c k p r o b l e m Ge n e t i c a l g o i r t h m Gr e e d y s t r a t e y Di g v i d e - ・ a n d - - c o n q u e r s t r a t e g y
求解0-1背包问题的改进排挤遗传算法
求解 O1 . 背包问题的改进排挤遗传算法
刘 文涛 胡 家宝 ,
(.武汉 工 业 学院 计 算机 与信 息. 程 系,湖 北 武 汉 4 0 2 ; 1 3 2 303 2 .武汉理 工 大学 计 算机 学 院 ,湖 北 武汉 4 0 7 ) 3 0 0
并 行 性 等 特 征 , 用 遗 传 算 法 求 解 O1 包 问题 是 一 个 有 效 解 使 .背 决 途 径 。遗 传 算 法 基 于 生 物 进 化 中 的 适 者 生 存 、 胜 劣 汰 、 优 物 种 进 化 的 自然 选 择 机 制 ,其 广 泛 应 用 于 函数 优 化 、模 式 识 别 、 像 处 理 、 化 控 制 、 经 网 络 、 器 学 习 、 据 挖 掘 等 领 图 优 神 机 数
32变 异 操 作 : .
2 1,V 1 2 N . 1 1 0 1 o. , o6 5 3 2
包 问题 , 解 精 度 也 很 高 。 求
mu t nN w ) t i ( wX ) t i ( e X1; a o Ne 2 ao mu t n
1 基 于 惩 罚 函数 的 排挤 遗 传 算 法 P C F GA
O 引 言
O1 包 问题 是 组 合 优 化 中 的 典 型 例 子 , 很 多 场 合 都有 .背 在
应 用 , 如 资 源 优 化 、 料 切 割 、 物 装 载 、 目分 配 、 算 计 例 材 货 项 预
分 支 界 法 、 态 规 划 等 , 当 输 入 量 非 常 大 的 时候 , 计 算 限 动 但 其 量 呈 指 数 上 升 … 由于 遗 传 算 法 具 有 鲁棒 性 强 、 。 随机 性 、 含 隐
“遗传算法”解决“背包问题”
“遗传算法”解决“背包问题”遗传算法基本思想:1) ⼀个种群有多个个体,每个个体有染⾊体和对应的基因为了繁殖进⾏:2) 选择:在残酷的世界中,适者⽣存,优胜略汰。
3) 重组:染⾊体交叉,基因重组4) 突变:染⾊体上的基因⼩概率的突变(⼀般给⼩数点后两位)背包问题:背包只能容得下⼀定重量b的物品,物品有m种,每种物品有⾃⼰的重量w(i)和价值v(i)(0<i<=m),从这些物品中选择装⼊背包,是背包不超过重量b,但价值⼜要最⼤。
运⽤动态规划,分⽀限界都可以达到效果,但不佳。
我⽤遗传算法解决:⼀般⼈有多条染⾊体,但对于背包问题,⼀个解我们将看成⼀个个体,所以,⼀个个体只有⼀个染⾊体,⼀个染⾊体对应多个基因。
如:100101010100111 表⽰装⼊背包的可能解。
(具体情况具体分析)遗传所做准备:1) ⽤0表⽰“不选择装⼊”,1表⽰“装⼊”,形成⼀条基因链;100101010100111则表⽰“15种物品”装⼊或不装⼊背包的可能解。
------- 此处⽤chrom[]存放基因,代表染⾊体2) ⼀个基因对应⼀个个体。
------- 此处⽤Population类或结构体声明其含有chrom[]等信息3) 可能的解有很多,构成⼀个种群。
------- ⽤Population类定义⼀个数组代表个体构成的种群newPop[]:存放新⽣代,oldPop[]:存放上⼀代4) 适应度:适应度和⽬标函数是正相关的,所以需要物品价值和重量。
------- fitness,weight包含在Population类中最⼤适应度:maxFitness,最⼩适应度:minFitness,总适应度:sumFitness,(帮助求突变和交叉的染⾊体)平均适应度:avgFitness遗传算法的函数:基本:1) InitPop() 初始化个体,使每个个体都有基因组2) Statistics(*pop) 计算适应度(最⼤,最⼩,总的,平均的)3) Selection(*pop) 通过选择种群中符合要求的⽗母去繁殖新代,返回这对⽗母的位置4) crossover(*parent1,*parent2,pos) 传⼊要改的个体位置,随机产⽣交叉位置,⽤优良⽗母繁殖优良后代并替代传⼊个体位置5) mutation(i) i为基因组基因的位置,逐个基因看是否要变异6) generation() 对个体进⾏判断,若不符合要求,进⾏选择,重组,突变。
基于遗传算法求解背包问题【精品毕业设计】(完整版)
毕业设计(论文)基于遗传算法求解背包问题院别专业名称班级学号学生姓名指导教师2012年6月15日基于遗传算法求解背包问题摘要背包问题(Knapsack problem)是一种组合优化的NP完全问题,本文首先介绍了基本遗传算法的基本原理、特点及其基本实现技术,接着针对背包问题,论述了遗传算法在编码表示和遗传算子(包括选择算子、交叉算子变异算子这三种算子)等方面的应用情况。
并且结合背包问题实例,给出了具体的编码方法,运行参数,群体大小,最大迭代次数,以及合适的遗传算子。
最后,简单说明了遗传算法在求解背包问题中的应用并对遗传算法解决背包问题的前景提出了展望。
关键词:背包问题,遗传算法,遗传算子Genetic Algorithm for KPAuthor:Yang DongTutor:Kong ZhiAbstractKP (Knapsack Problem) is a combinatorial optimization of NP - complete problem. The primary knowledge, characteristics and the basic techniques of GA are introduced firstly. The encoding model and genetic operators (including selection operation, crossover operation and mutation operation) solving KP are discussed secondly. Combined with examples of knapsack problem, we have given the specific encoding method, operating parameters, popsize, maxgeneration, and suitable genetic operator. At last, the application of genetic algorithm is simple presented, and the prospect for the future of genetic algorithm in solving KP has been given.Key Words: KP, genetic algorithm, genetic operators目录1绪论 (III)1.1 引言 (1)1.2 背包问题概述 (1)1.2.1 背包问题的描述 (2)1.2.2 研究背包问题的意义 (9)1.3 遗传算法 (10)1.3.1 遗传算法概述 (10)1.3.2 遗传算法的特点 (10)1.3.3 遗传算法的应用领域 (11)2遗传算法的基本原理 (13)2.1 基本流程 (14)2.2 编码 (14)2.3 适应度函数 (15)2.4 遗传算子 (15)2.4.1 选择算子 (15)2.4.2 交叉算子 (17)2.4.3 变异算子 (17)2.5 参数控制 (18)2.5.1 群体规模 (18)2.5.2 交叉概率 (18)2.5.3 变异概率 (18)2.6 算法结束条件控制 (19)3求解实现背包问题的遗传算法 (20)3.1 0_1背包问题中染色体的表示 (20)3.2 算法求解01背包问题时用到的参数 (20)3.3 选择操作 (20)3.4 交叉操作 (21)3.5 精英策略 (22)3.6 变异操作 (22)3.7 代际更新 (23)3.8 算法的终止 (23)3.9 仿真结果与测试 (24)3.9.1 不同交叉概率下所的测试结果 (25)3.9.2 极端数据对结果的影响 (27)3.9.3 仿真结果总结 (29)结论 (31)致谢 (32)参考文献 (33)附录 (34)1绪论1.1引言现代科学理论研究与实践中存在着大量与优化、自适应相关的问题,但除了一些简单的情况之外,人们对于大型复杂系统的优化和自适应问题仍然无能为力。
基于遗传算法解决01背包问题研究
) 一> : P ( i 一1 , 2 , 3 ……, ) , n 个物体的背包问题的
i— l
v e c t o r <i n t > &b a b y l , v e c t o r <i n t >  ̄b a b y 2 ){
个 体 的 同 时 比较 , 搜 索 使 用 评 价 函数 启 发 , 过 程 简单 , 使 用 概 率机 制 进 行 迭 代 , 具 有随机 性, 具 有 可 扩展 性 , 容 易 与 其 它 算 法 结合 。基 本 0 1背 包 问题 , 提 出遗 传 问 题 解 决 的 关键 技 术 , 设 计 评 价 函数 和 遗 传 算 子 , 并通过散播 变异 、 移 位 变 异、 插入 变异 改 进 0 l背 包 问题 中 的 遗 传 算 法 , 很 好 地 解 决 了遗传 问题 。
关键词 : 遗传算 法; 0 1背 包 I " - I 题; 评价函数 ; 遗传 算子
中 图分 类号 : TP 3 1 2
文献标识码 : A
文章编号 : 1 6 7 2 - 7 8 0 0 ( 2 0 1 4 ) 0 0 2 - 0 0 7 4 - 0 2
i n t S e l e c t e d Ge n o me一 0 :
—
)
i nt c p — Ra nd l nt ( 0,m i Ch r o mo Le n g t h一 1 ) ;
—
f o r( i n t i 一 0;i <c p;+ + i ) {
)
2 . 2 用 遗 传 算 子 改 变 繁 殖 过 程 中 产 生 的 子 个 体 遗 传 组 成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。