用遗传算法解决0-1背包问题

合集下载

遗传算法在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背包问题传统的解决方法有动态规划法、分支界限法、回溯法等等。

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

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

遗传算法求解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表示物品不被选中。

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

基于遗传算法的0/1背包问题的改进算法

基于遗传算法的0/1背包问题的改进算法

限是 。 问题 是 如何寻 找物 品的最 优子 集从 而在满 足背包 承重 约束 上线 的条件 下最 大化 总费用 , 即在
∑ f W的 条件下, 求m a x ( ∑c 角 , ) , 其中m 表示背包中 装人的物品的个数。 其中费用、 重量和承重是正
整数。
0 / 1背包 问题 : 在背 包 问题 的基 础 上 , 每个 物 品不 能被 分 割 , 一个 物 品 只有被 装 载 和不 被 装 载两 种
验 中获得 了对 于 问题 的更优 近似 解 。
关键 词 : 遗传 算 法 ; 0 / I背 包 问题 ; 十进 制 实数
中图分 类号 : T P 3 0 1 . 6 文 献标识 码 : A
作 为 强有力 且应 用广泛 的 随机搜索 和优 化方 法 , 遗 传 算法 可 能是 当今 影 响最 广 泛 的进 化 计算 方 法
之一 … 。在 过去 的几年 中 , 研 究人 员将更 多 的注 意力 放 在 工 业工 程 领 域 的优 化 问题 上 , 因 而得 到 了深
入 的研究 。理论 方 面的研 究 大 多 是 围绕 该 问 题 简单 的结 构 , 这 种 特 点 既 可 以深入 探 索 许 多组 合 特
性, 又可 以通过 解决一 系列 背包 子 问题 来最 终求解 更 为复杂 的优化 问题 。从 实践 的角度来 看 , 这些 问题
状态 , 不存 在部 分装 载的情 况 , 即上述 背包 问题 中的 置 只 能取 0或 者 1 。 其数 学模 型实 际上是 一个 0—1
规划 问题 。
背包 问题是 一个 N P难 的问题 。 相对 于传统 的算 法 ( 如 动态 规划 算 法 、 回溯算 法 等 ) , 使 用 遗传 算 法 求解 背包 问题 能最快 找 出较优 的解 。 然 而在 一般情 况下 , 使 用 基本 遗传 算 法解 决 背包 问题 时 , 得 到 问题

基于遗传算法求解0—1背包问题的算法探讨

基于遗传算法求解0—1背包问题的算法探讨

Vo . 7 No. 11 4
0c . 00 t2 8
20 0 8年 1 O月
基 于遗 传 算 法 求解 0—1背包 问题 的算 法探 讨
刘 锐 张金 波 刘 蕊 洁 李积 宪
( 兰州交通 大学 数 理与软 件工程 学 院 , 甘肃 兰州 7 0 7 ) 300
摘 要 0—1背包 问题 是 一 类 典 型 的 组 合 优 化 问 题 , 且 是 N 并 P完 全 问 题 , 有重 要 的研 究 意 义 . 绍 了贪 婪 算 法 和 基 本 具 介
LuR i Z agJ b LuR ie L J i i u hn n o i uj i i a i i x n ( c ol f ahma c , h s s n otaeE g er g L nh uJ oogU iesy S ho o te t s P yi dS f r n i e n , a zo i t nvr t, M i ca w n i a n i
On t e A g rtm fS l i g t e 0 —1 Kn p a k P o lm s d Olt e Ge ei g r h h l o i h o o vn h — a s c r b e Ba e i h n tc A o i m l t
i p o e e ei lo i m a r vd e tra p o i t o u in . m r v d g n t a g rt c h c n p o i e b t p rx ma e s l t s e o
Ke wo d g nei l o t m ;g e d l o t m ;0—1 k a s c r b e y r s: e tc ag r h i r e y ag r h i n p a k p o l m

遗传算法求解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
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现遗传算法的0-1背包问题 求解及其改进
姓名: 学号: 班级: 提交日期:2012年6月27日
实现遗传算法的0-1背包问题求解
摘要:研究了遗传算法解决0-1背包问题中的几个问题:
对于过程中不满足重量限制条件的个体的处理,通过代换 上代最优解保持种群的进化性 2) 对于交换率和变异率的理解和处理方法,采用逐个体和逐位 判断的处理方法 3) 对于早熟性问题,引入相似度衡量值并通过重新生成个体替 换最差个体方式保持种群多样性。 4) 一种最优解只向更好进化方法的尝试。 通过实际计算比较表明,本文改进遗传算法在背包问题求解中具有 很好的收敛性、稳定性和计算效率。通过实例计算,表明本文改进 遗传算法优于简单遗传算法和普通改进的遗传算法。 关键词:遗传算法;背包问题 ;优化 1)
1: 打开数据文件 2: 设置程序运行主界面 3: 调用初始化种群模块 3- 1: 按照一定的种群规模和染色体长度以基因为单位用随 机产生的0- 1对个体赋值 3- 2: 调用计算适应度函数 4: 以最大进化代数为循环终止条件开始进行循环 4- 1: 调用产生新一代个体的函数 4- 1- 1: 调用选择函数 4- 1- 2: 调用交叉函数 4- 1- 3: 调用变异函数 4- 1- 4: 调用计算适应度函数 5: 调用计算新一代种群统计数据函数 6: 调用输出新一代统计数据函数 7: 返回到第四步, 直至循环结束 二、 基本遗传算法解决0- 1背包问题存在的不足: 1.对于过程中不满足重量限制条件的个体的处理 在用基本遗传算法解决0- 1背包问题的时候,在初始化或者 交叉变异后可能会产生不满足重量约束条件的伪解,而对于这 些伪解,基本遗传算法没有给出一个很好的处理方法,而只是 又随机生成了一个满足约束条件的解作为新的个体从而替换掉 原来的个体。根据遗传算法的根本思想“优胜劣汰,适者生 存”的原则,可以将不满足条件的个体用已有的最优个体来进 行替换,这样,既使得种群中所有的个体均满足重量的约束条 件,又保留了较优解,符合遗传算法的思想。 具体做法为: 在程序中加入一个变量保存每代的最优解,当前代在进行 选择、复制、交叉、变异后如果有不满足约束条件的个体,则 在种群更新时采用这个最优值作为替代。 具体做法为:在每代遗传后通过函数 FindBestandWorstIndividual()找到当前最优值并保存
2. 对于算法早熟性的分析及解决方法 遗传算法中种群中的个体由初始化时的具有多样性,可能 会由于在进化过程中一些超常个体限制其它个体的进化——这 个个体的适应度大大优于种群内的其它值,由于适者生存原则 这个个体被不断复制从而充满了整个种群,使得种群的多样应 大大降低,进化停滞,从而出现算法收敛于局部最优解的现 象,称为早熟现象。 早熟现象的可能解法: 1) 通过提高变异率来增加种群的多样性,以期更优解的出 现,这也是最简单基本遗传算法中不添加相关操作的情 况下唯一的一种方法,然而这种方法有明显的弊端:在 提高变异率获得多样性种群的同时,个体变异的机会增 加,使得较优解发生变异,从而遗传算法丧失了其优于 其它算法的优越性,所以这种方法不是很好地解决方 法。 2) 引入多样性衡量和处理 基本思路:在出现进化停滞现象时要引入新的个体来增强种 群的多样性。 做法:1,判断是否达到早熟现象 对于种群中S个个体,判断等位基因的相等程度,即 引入一个参数值same,如果same达到一定的 理论值大 小就可以认为达到了早熟现象。 2,早熟现象的处理,即引入新的个体。 处理过程中应该不违反适者生存的原则,所以应该保 留较好的个体,所以首先选中适应度最小的 个体执行 删除操作,然后随机生成一个新的符合重量限制且打破早熟 现象的新个体。 具体实现见函数:void checkalike(void)

需要进行0-1互换变异2-3如果q 说明 不需要变
分析这两种处理方法可知:方法一没有很好地体现随机机会均 等的思想,因为在步骤1中确定的需要操作的数目n后,总体上 是保证了交叉或者变异的数目,但不是对于每一个个体而言 的,因而会出现有的个体被选择交叉或者变异多次而有的没有 机会交叉或者变异的情况,而如果采用方法二,就体现了机会 的均等性,即要求对每一个单元操作目标进行概率的验证,以 确定是否变异或者交叉。在程序中具体的实现方法体现在交叉 和变异函数中:
//相似度校验 for( i=0;i<S;i++) for(j=0;j<N;j++) bool temp=X[i].chromsome[j]; for(int k=1;k<S;k++) if(temp!=X[k].chromsome[j]) break; if(j==N)same++; if(same>N*0.5)//大于50%作为判定为早熟
);
Step 4 判断:若终止条件满足,则取S中适应度最大的染色体 作为所求结果,算法结束。 Step 5 选择-复制:按选择概率P(xi)所决定的选中机会,每次从 S中随机选定1个染色体并将其复制,共做N次,然后将复制所 得的N个染色体组成群体S1; Step 6 交叉:按交叉率Pc所决定的参加交叉的染色体数c,从S1 中随机确定c个染色体,配对进行交叉操作,并用产生的新染 色体代替原染色体,得群体S2; Step 7 变异:按变异率Pm所决定的变异次数m,从S2中随机确 定m个染色体,分别进行变异操作,并用产生的新染色体代替
1. 基本实现原理: 一、问题描述 0-1背包问题属于组合优化问题的一个例子,求解0-1背包问 题的过程可以被视作在很多可行解当中求解一个最优解。01背 包问题的一般描述如下: 给定n个物品和一个背包,物品i的重量为Wi,其价值为Vi,背 包的容量为C。选择合适的物品装入背包,使得背包中装入的 物品的总价值最大。注意的一点是,背包内的物品的重量之和 不能大于背包的容量C。在选择装入背包的物品时,对每种物 品i只有两种选择:装入背包或者不装入背包,即只能将物品i 装入背包一次。称此类问题为0/1背包问题。 其数学模型为:
原染色体,得群体S3; Step 8 更新:将群体S3作为新一代种群,即用S3代替S,t=t+1, 转步3; 遗传算法是一种仿生算法, 即模拟生命演化的算法,它从一 个代表问题初始解的初始种群出发, 不断重复执行选择, 杂交和 变异的过程, 使种群进化越来越接近某一目标既最优解,如果 视种群为超空间的一组点, 选择、杂交和变异的过程即是在超 空间中进行点集之间的某种变换, 通过信息交换使种群不断变 化, 遗传算法通过模拟达尔文“优胜劣汰, 适者生存”的原理激 励好的结构, 同时寻找更好的结构, 作为一种随机的优化与搜索 方法, 遗传算法有着其鲜明的特点。 —遗传算法一般是直接在解空间搜索, 而不像图搜索那样 一般是在问题空间搜索, 最后才找到解(如果搜索成功的话)。 —遗传算法的搜索随机地始于搜索空间的一个点集, 而不 像图搜索那样固定地始于搜索空间的初始节点或终止节点, 所 以遗传算法是一种随机搜索算法。 —遗传算法总是在寻找优解(最优解或次优解), 而不像图搜 索那样并非总是要求优解, 而一般是设法尽快找到解(当然包括 优解), 所以遗传算法又是一种优化搜索算法。 —遗传算法的搜索过程是从空间的一个点集(种群)到另一 个点集(种群)的搜索,而不像图搜索那样一般是从空间的一个点 到另一个点地搜索。 因而它实际是一种并行搜索, 适合大规模 并行计算, 而且这种种群到种群的搜索有能力跳出局部最优 解。 —遗传算法的适应性强, 除需知适应度函数外, 几乎不需要 其他的先验知识。 —遗传算法长于全局搜索, 它不受搜索空间的限制性假设 的约束,不要求连续性, 能以很大的概率从离散的、多极值的、 含有噪声的高维问题中找到全局最优解。 3.程序步骤: 一、 使用基本遗传算法解决0- 1背包问题:
其二,采用对每个操作单元分别进行特定概率下处理的方法, 步骤如下:
对于交叉操作: 1,在种群中进行S次循环,其中S代表种群中个体的数量 2,对于每一个个体X[i](X为种群数组)做如下操作 2-1生成随机数p [0,1],判断p与 的大小关系 2-2如果p 说明X[i]需要交换 2-2-1 随机在种群中找到异于X[i]的另一个体进行交换 2-3如果p 说明X[i]不需要交换 对于变异操作: 1,在种群中进行S次循环,其中S代表种群中个体的数量 2,对每一个个体X[i]做N次循环,其中N为染色体位数 2-1对染色体的每一位 3-1生成随机数q [0,1],判断q与 的大小关系 3-2如果q 说明
0-1背包问题传统的解决方法有动态规划法、分支界限法、回 溯法等等。传统的方法不能有效地解决0-1背包问题。遗传算 法(Genetic Algorithms)则是一种适合于在大量的可行解中搜 索最优(或次优)解的有效算法。 二、遗传算法特点介绍: 遗传算法(Genetic Algorithm, GA)是1962年Holland教授首次提 出了GA算法的思想是近年来随着信息数据量激增,发展起来 的一种崭新的全局优化算法,它借用了生物遗传学的观点,通 过自然选择、遗传、变异等作用机制,实现各个个体的适应性 的提高。 基本遗传算法求解步骤: Step 1 参数设置:在论域空间U上定义一个适应度函数f(x),给 定种群规模N,交叉率Pc和变异率Pm,代数T; Step 2 初始种群:随机产生U中的N个染色体s1, s2, …, sN,组成 初始种群S={s1, s2, …, sN},置代数计数器t=1; Step 3 计算适应度:S中每个染色体的适应度f(
对于交叉操作: 1,根据交叉率确定应该交叉的个体数目n 2,在种群中进行n次循环 2-1随机选中种群中的一个个体a 2-2随机选中种群中异于a的一个个体b 2-3随机确定交叉位数 2-4进行交叉 对于变异操作: 1,根据变异率确定应该变异的染色体数目n 2,在种群中进行n次循环 2-1随机选中种群中的一个个体的染色体a 2-2随机选中染色体a的某位基因 2-3对 进行0-1互换变异
void CrossoverOperator(void)//交叉操作 for(i=0; i<S; i++) do{p=rand()%S;//两个[0,S]的随机数 q=rand()%S; }while(p==q); int w=1+rand()%N;//[1,N]交换的位数 double p=(rand()%1001)/1000.0; if(p<=Pc) for(j=0;j<w;j++)交换w位数据 void MutationOperator(void)//变异操作 for (i=0; i<S; i++) for (j=0; j<N; j++) q=(rand()%1001)/1000.0;//产生q [0,1] if (q<Pm) //对每一位都要考虑 if(X[i].chromsome[j]==1)X[i].chromsome[j]=0; else X[i].chromsome[j]=1;
相关文档
最新文档