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

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

遗传算法求解背包问题

遗传算法求解背包问题

遗传算法的过程:初始化:将计划装入背包的每个物品看成一个二进制串的一位,为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背包问题

S o l u t i o n t o 0 - I Kna p s a c k Pr o bl e m Ba s e d o n t he Gr e e dy - g e ne t i c Al g o r i t h m
Y A 0 We n j u a n ,WU F e i ,X I A Q i a n ,S HA O B i a o ,Z H A N G L o n g z h o n g ,L I U J i a n
( 兰 州 交 通 大 学 交 通 运 输 学 院 ,甘 肃 兰州 7 3 0 0 7 0 )


在 解决 0—1背 包问题 中,将贪心算法和 遗传算 法相 结合 ,提 出 了贪心遗 传算 法。通过 算法构 造 出更优
的新 算子 ,与 原有 算子相 比 ,既加 快 了算法的收敛速度 ,又克服 了传统方法容 易陷入局 部最优 的特点 ,提 高 了搜 索效
a l s o a v o i d s t h e l o c a l o p t i mu m t r a p o f t h e t r a d i t i o n l a me t h o d, t h u s i mp r o v i n g s e a r c h e ic f i e n c y . Th e c o mp u t e r s i mu l a -
实际 工作 中 , 越 来越 多 的领域运 用 到 了背 包 问题 。
m a x f ( x 2 , …)=∑P
目标 函数
求解 背包 问题 的方 法 可分 为 启 发 式算 法 , 如 贪 心 算法 、 模 拟退 火算 法 、 蚁群算 法 ; 最优 化算 法 , 如 动态 规 划算 法 、 回溯法 、 分支 定界 法等 J 。这 些算 法均 能找 到 相应 的最优 解 , 但 也 均有各 自的局 限性及 缺 陷 。 本文 介 绍 了贪 心 算法 和遗 传算 法 求 解 0—1背 包 问题 , 并在其基础上提出基 于贪心算法的遗传算法来 解决 背包 问题 。 最后 , 运用 计算 机 仿 真 技 术来 验 证 混 合 遗 传 算 法 的设计 。这 样 , 即克 服 了传 统算 法 的缺 陷 , 又 加快 了算

解决0-1背包问题的遗传分布估计算法

解决0-1背包问题的遗传分布估计算法

解决0-1背包问题的遗传分布估计算法余娟;贺昱曜【期刊名称】《计算机工程与应用》【年(卷),期】2014(000)009【摘要】0-1背包问题是典型的NP难问题,针对0-1背包问题提出分布估计算法(EDA)与遗传算法(GA)相结合的算法(E-GA)。

该算法在每一次迭代中由二者共同产生种群,并行搜索,两种方法产生的个体数目动态变化,将EDA的全局搜索与GA的局部搜索能力、EDA的快速收敛性与GA的种群多样性结合,实现优势互补。

通过三个背包问题算例进行算法验证,与以往文献相比,结果显示该算法所获最优值优于文献最优值,运行时间短且收敛速度快。

%0-1 knapsack problem is a classic NP-hard problem. For the 0-1 knapsack problem, a combined parallel search algorithm(E-GA)is proposed. The population is generated by Genetic Algorithm(GA)and Estimation of Distribution Algorithm(EDA)together. The population proportion caused by two algorithms is changed dynamically, which combines the global statical information and location information and overcomes the shortcoming of GA and EDA. The algorithm is applied to three widely used knapsack samples, and the results show that proposed E-GA algorithm has better search ability and convergence speed than the other algorithms.【总页数】6页(P12-16,31)【作者】余娟;贺昱曜【作者单位】西北工业大学航海学院,西安 710072;西北工业大学航海学院,西安 710072【正文语种】中文【中图分类】TP18【相关文献】1.用基本遗传算法解决0-1背包问题 [J], 闫丽2.一种结合贪婪因子求解0-1背包问题的分布估计算法 [J], 谭阳;周虹3.基于佳点集遗传算法的0-1背包问题解决方法 [J], 徐宗杨;唐耀庚;王晓霞4.求解折扣{0-1}背包问题的新遗传算法 [J], 吴聪聪; 贺毅朝; 赵建立5.求解0-1背包问题的混合贪婪遗传算法 [J], 陈桢;钟一文;林娟因版权原因,仅展示原文概要,查看原文内容请购买。

遗传算法的0-1背包问题(c语言)

遗传算法的0-1背包问题(c语言)

基于遗传算法的0-1背包问题的求解摘要:一、前言组合优化问题的求解方法研究已经成为了当前众多科学关注的焦点,这不仅在于其内在的复杂性有着重要的理论价值,同时也在于它们能在现实生活中广泛的应用。

比如资源分配、投资决策、装载设计、公交车调度等一系列的问题都可以归结到组合优化问题中来。

但是,往往由于问题的计算量远远超出了计算机在有效时间内的计算能力,使问题的求解变为异常的困难。

尤其对于NP 完全问题,如何求解其最优解或是近似最优解便成为科学的焦点之一。

遗传算法已经成为组合优化问题的近似最优解的一把钥匙。

它是一种模拟生物进化过程的计算模型,作为一种新的全局优化搜索算法,它以其简单、鲁棒性强、适应并行处理以及应用范围广等特点,奠定了作为21世纪关键智能计算的地位。

背包问题是一个典型的组合优化问题,在计算理论中属于NP-完全问题, 其计算复杂度为)2(O n ,传统上采用动态规划来求解。

设w[i]是经营活动 i 所需要的资源消耗,M 是所能提供的资源总量,p[i]是人们经营活动i 得到的利润或收益,则背包问题就是在资源有限的条件下, 追求总的最大收益的资源有效分配问题。

二、问题描述背包问题( Knapsack Problem)的一般提法是:已知n 个物品的重量(weight )及其价值(或收益profit )分别为0>i w 和0>i p ,背包的容量(contain )假设设为0>i c ,如何选择哪些物品装入背包可以使得在背包的容量约束限制之内所装物品的价值最大?该问题的模型可以表示为下述0/1整数规划模型:目标函数:∑==ni i i n x c x x x f 121),,(max Λ⎪⎩⎪⎨⎧=∈≤∑=),2,1(}1,0{t .s 1n i x p x w i n i i i i Λ (*)式中i x 为0-1决策变量,1=i x 时表示将物品i 装入背包中,0=i x 时则表示不将其装入背包中。

0-1背包问题

0-1背包问题

遗传算法在0-1背包问题中的应用0/1背包问题有很多种背包问题,在此类问题中,给出一套实体及它们的价值和尺寸,意图是选择一个或多个互不相干的子集使每个子集的尺寸不超过给定边界,而被选择值的总和最大。

这类问题中的许多都是NP 难解的问题,而且这类问题的许多实例都只能用启发算法来解。

用于实算的问题都是0/1背包问题。

任务是,对一个给定权值(weight )集合W[i],利益(profits )集合P[i]及容量C (capacity ),求一个二进制向量x={x[1],…,x[n]},使C i W i x ni ≤∑=1][*][且最大化 ∑==ni i P i x x P 1][*][)(下面给出一个具体的例子: n=20,C=878,W={92,4,43,83,84,68,92,82,6,44,32,18,56,83,25,96,70,48,14,58}, P ={44,46,90,72,91,40,75,35,8,54,78,40,77,15,61,17,75,29,75,63}。

算法描述:1、选择一个初始群体;2、对群体进行评估:计算每个染色体v i 的适应值eval(v i )、群体的总适应值∑==pop_size1i)v (i eval F 、选择概率F v eval p i i /)(=、累积概率∑==ij i i p q 1;3、从旧的群体中产生一个新的群体:对轮盘转动pop_size 次,每次按照下面的方法为新群体选择一个单个的染色体:● 产生一个在区间[0,1]里的随机浮点数r ;● 如果r<q 1,选择第一个染色体(v 1),否则选择使q i-1<r ≤q i 成立的第i个染色体v i (2≤i≤pop_size)。

显然:最好的染色体得到多个拷贝,中等染色体保持平稳,最差染色体死亡。

4、在新群体中的个体应用重组算子——杂交:遗传系统中有1个参数,杂交概率p c,此概率给出预计要进行杂交的染色体个数p c*pop_size。

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

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

一、实例一:1.问题描述假设:背包最大重量为300,物品的数量为10,物品的价值:[95 75 23 73 50 22 6 57 89 98],物品的重量:[89 59 19 43 100 72 44 16 7 64]2.Matlab代码(1)参数初始化,导入本问题的物品的价值和重量数据,并设定背包最大重量。

wei=[9575 23 73 50 22 6 57 89 98];val=[89 59 19 43 100 72 44 16 7 64];w=300; %总重量约束值(2)随机产生数量为30的种群。

生成30*10的0-1矩阵。

So =round(rand(30,10));So=hardlim(So); %So为随机产生的矩阵,值为0或1[ZQ,Y] = size(So);(3)迭代次数为50代,交叉概率为90%,变异概率为5%.ds = 50; pc = 0.9; pm = 0.05;(4)设置适应度函数,利用惩罚函数降低不合格解的适应度,惩罚因子设为1.5.pu=1.5;syd =So*val'-pu*So*val'./(So*wei').*((So*wei'-w)>0).*(So*wei'-w);figure(1);hold on;(5)用轮盘赌进行选择操作,用选择出的个体构成的种群替代旧的种群better1=1; ip = 1; updatef=-10; %betterl为当前算出的总价值,ip为代数whileip<= dsfori=1:ZQfi(i)=syd(i)-min(syd)+1;endfori=1:ZQsp(i)=fi(i)/sum(fi);endfori=2:ZQsp(i)=sp(i-1)+sp(i);endfori=1:ZQp=rand(1); sindex=1;while p >sp(sindex)sindex=sindex+1;endnewSo(i,:)=So(sindex,:);endfori=1:ZQSo(i,:)=newSo(i,:);end(6)设置的交叉概率pc为90%,产生要配对的父代的序号,经过50次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代fori=1:ZQweiindex(i)=i;endfori=1:ZQpoint=unidrnd(ZQ-i+1);temp=weiindex(i);weiindex(i)=weiindex(i+point-1);weiindex(i+point-1)=temp;endfori=1:2:ZQp=rand(1);if(p<pc)point=unidrnd(Y-1)+1;for j=point:(Y-1)ch=So(weiindex(i),j);So(weiindex(i),j)=So(weiindex(i+1),j);So(weiindex(i+1),j)=ch;endendend(7)设置变异的概率为5%,产生50*10的0-1矩阵,对1的位置进行变异M=rand(ZQ,Y)<=pm;So=So-2.*(So.*M)+M;(8)产生精英染色体,you1是适应度最大的染色体,you2为适应度最小的染色体,最优解为不超过背包容量的适应度最大的syd2数组,better3即为每代的最优值,并用粉色星号画出来。

遗传算法求解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背包问题求解方法综述

算法分析与设计大作业实验题目: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背包问题(c语言)

遗传算法的0-1背包问题(c语言)

基于遗传算法得0—1背包问题得求解摘要:一、前言组合优化问题得求解方法研究已经成为了当前众多科学关注得焦点,这不仅在于其内在得复杂性有着重要得理论价值,同时也在于它们能在现实生活中广泛得应用。

比如资源分配、投资决策、装载设计、公交车调度等一系列得问题都可以归结到组合优化问题中来、但就是,往往由于问题得计算量远远超出了计算机在有效时间内得计算能力,使问题得求解变为异常得困难。

尤其对于NP完全问题,如何求解其最优解或就是近似最优解便成为科学得焦点之一、遗传算法已经成为组合优化问题得近似最优解得一把钥匙。

它就是一种模拟生物进化过程得计算模型,作为一种新得全局优化搜索算法,它以其简单、鲁棒性强、适应并行处理以及应用范围广等特点,奠定了作为21世纪关键智能计算得地位。

背包问题就是一个典型得组合优化问题,在计算理论中属于NP-完全问题,其计算复杂度为,传统上采用动态规划来求解。

设w[i]就是经营活动i 所需要得资源消耗,M就是所能提供得资源总量,p[i]就是人们经营活动i得到得利润或收益,则背包问题就就是在资源有限得条件下,追求总得最大收益得资源有效分配问题。

二、问题描述背包问题( Knapsack Problem)得一般提法就是:已知n个物品得重量(wei ght)及其价值(或收益profit)分别为与,背包得容量(contain)假设设为,如何选择哪些物品装入背包可以使得在背包得容量约束限制之内所装物品得价值最大?该问题得模型可以表示为下述0/1整数规划模型:目标函数:(*)式中为0-1决策变量,时表示将物品装入背包中,时则表示不将其装入背包中。

三、求解背包问题得一般方法解决背包问题一般就是采取动态规划、递归回溯法与贪心方法、动态规划可以把困难得多阶段决策变换为一系列相互联系比较容易得单阶段问题、对于背包问题可以对子过程用枚举法求解,而且约束条件越多,决策得搜索范围越小,求解也越容易。

它得主要缺点就是用数值方法求解时会随着状态变量得个数呈指数级得增长,往往对于求解背包问题得实际问题就是不现实得。

遗传算法求解01背包问题

遗传算法求解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背包问题实验报告Pb03000982 王皓棉一、问题描述:背包问题是著名的NP完备类困难问题, 在网络资源分配中有着广泛的应用,已经有很多人运用了各种不同的传统优化算法来解决这一问题,这些方法在求解较大规模的背包问题时,都存在着计算量大,迭代时间长的弱点。

而将遗传算法应用到背包问题的求解,则克服了传统优化方法的缺点,遗传算法是借助了大自然的演化过程,是多线索而非单线索的全局优化方法,采用的是种群和随机搜索机制。

遗传算法(GA)是一类借鉴生物界自然选择和自然遗传机制的随机化的搜索算法,由美国J.Holland教授提出,其主要特点是群体搜索策略、群体中个体之间的信息交换和搜索不依赖于梯度信息。

因此它尤其适用于处理传统搜索方法难于解决的复杂和非线性问题,可广泛应用于组合优化,机器学习,自适应控制,规划设计和人工生命领域。

GA是一种群体型操作,该操作以群体中的所有个体为对象。

选择,交叉和变异是遗传算法的三个主要算子,他们构成了遗传算法的主要操作,使遗传算法具有了其它传统方法所没有的特性。

遗传算法中包含了如下五个基本要素:1 .参数编码,2.初始群体的设置,3.适应度函数的设计, 4.遗传操作设计,5.控制参数设定,这个五个要素构成可遗传算法的核心内容。

遗传算法的搜索能力是由选择算子和交叉算子决定,变异算子则保证了算法能够搜索到问题空间的每一个点,从而使其具有搜索全局最优的能力.而遗传算法的高效性和强壮性可由Holland提出的模式定理和隐式并行性得以解释。

二、实验目的:通过本实验,可以深入理解遗传算法,以及遗传算法对解决NP问题的作用。

三、算法设计:1、确定种群规模M、惩罚系数 、杂交概率c p、变异概率m P、染色体长度n及最大max.进化代数genx=1表2、采用二进制n维解矢量X作为解空间参数的遗传编码,串T的长度等于n,ix=0表示不装入背包。

例如X={0,1,0,1,0,0,1}表示第2,4,7示该物件装入背包,i这三个物件被选入包中。

“遗传算法”解决“背包问题”

“遗传算法”解决“背包问题”

“遗传算法”解决“背包问题”遗传算法基本思想: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() 对个体进⾏判断,若不符合要求,进⾏选择,重组,突变。

智能控制作业遗传算法求解背包问题

智能控制作业遗传算法求解背包问题

智能控制作业遗传算法求解背包问题智能控制遗传算法求解背包问题——16组遗传算法求解背包问题摘要:遗传算法是在分析遗传个体进化机制基础上提出的一种新型优化算法。

本论文根据0-1 背包问题的特点,提出用于求该问题的遗传算法及相关的解决方案,阐明算法的具体实现过程。

通过对其他文献中仿真实例的计算和结果比较,表明应用该算法求解背包问题取得了良好的效果。

该算法同样可以应用于其他组合优化题。

关键词:背包问题;遗传算法一.概述背包问题(knapsack problem) 是运筹学中一个典型的优化难题,有着广泛的实际应用背景,如管理中的资源分配、投资决策、预算控制等问题,并且经常作为其他问题的子问题被研究。

研究背包问题的求解算法在理论上和实践中都具有一定的意义。

从计算复杂性理论来看,背包问题是个NP 完全问题,该问题的求解方法主要有启发式算法,如贪心算法、遗传算法、粒子群算法。

以遗传算法为代表的生物进化算法建立在达尔文自然选择学说的基础上,是对生物进化过程的模拟,是人们对从自然演化过程中抽象出的概念、原则和机制的类比应用,被广泛用于解决复杂的计算问题。

其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。

遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。

它是现代有关智能计算中的关键技术。

本文在分析遗传算法的基础上,提出了将贪婪修复方法与遗传算法相结合,构成混和遗传算法,并应用于求解经典背包问题。

它是可以解决复杂问题的新方法。

本论文系统的介绍背包问题的遗传算法解决方案。

二.背包问题的数学模型背包问题的定义:我们有n 种物品,物品j 的重量为wj ,价格为pj 。

我们假定所有物品的重量和价格都是非负的。

背包所能承受的最大重量为W 。

遗传算法介绍及在01背包问题的应用

遗传算法介绍及在01背包问题的应用

遗传算法介绍及在01背包问题的应⽤遗传算法背景:最优化问题确定或⼏乎确定的⽅式寻找充满随机性的启发式⽅法,例如遗传算法遗传算法原理:进化论的物竞天择,适者⽣存基本概念:基因和染⾊体: 基因是不能分割的最⼩单位,染⾊体⼀组基因的组合,实例⽤基因表⽰遗传特征,简单⼀般就是以基因作为遗传特征种群和个体遗传和变异遗传不是平稳的,有⼀定概率变异,可能变好,可能变坏基因交叉,基因突变:变化太频繁⽆法收敛到近似最优解,变化频率太底也不⾏,⽆法保证种群多样性,可能收敛到局部最优解。

选择:根据个体的适应度,按照⼀定规则种群中选择优良个体遗传到下⼀代。

适应度:个体对环境的适应程度。

流程:算法设计:1. 基因的编码: 01背包问题可以采⽤ 01编码2. 适应度评估函数背包问题可以根据基因101001,计算出对应的价值,价值越⼤越好3. 遗传算⼦设计a) 选择算⼦ i. ⽐例选择:⼜称轮盘赌选择,按种群⽐例来确定 ii. 随机竞争选择每次随机选择两个或多个,取适应度⾼的。

iii. 最佳保留选择选择最好的替换最差的,⽽且不参与交叉和变异 iv. 排序选择 v. 确定式采样选择 b) 交叉算⼦ i. 单点交叉随机选择1个点,随机概率交换这个点的⽚段 ii. 两点交叉与多点交叉随机选择两个点或多个点,随机概率交换每个点的⽚段 iii. 均匀交叉⼀致交叉,基因上每个点都按照相同概率互换基因⽚段 iv. 算术交叉⽤于浮点数编码表⽰的基因,线性组合产⽣ c) 变异算⼦ i. 单点变异随机选择⼀个点,随机概率变异 ii. 固定位置变异⼀个或⼏个固定位置,随机变异 iii. 均匀变异每个⽚段,使⽤均匀分布的随机数,以⼩的随机概率进⾏变异 iv. 边界变异如果基因编码规则有边界值(最⼤最⼩),根据规则选⼀个替换成边界值 v. ⾼斯变异4. 运算参数种群⼤⼩M,交叉概率Pc,变异概率Pm,进化迭代次数T01背包问题遗传算法的应⽤:Weight = { 35, 30, 60, 50, 40, 10, 25 }; Value = { 10, 40, 30, 50, 35, 40, 30 };TEST_ROUND = 500; 测试次数OBJ_COUNT = 7;CAPACITY = 150;背包重量POPULATION_SIZE = 32; 种群个数MAX_GENERATIONS = 100;//500; 种群迭代次数P_XOVER = 0.8; 交叉编译概率P_MUTATION = 0.15; 变异概率选择算⼦采⽤轮盘赌策略交叉算⼦:两点交叉,随机个数的基因位进⾏交换(1~7的随机数),交换的位置也是随机等概率选择变异算⼦:对随机个数的基因位进⾏变异每个位置被交换的概率是相等的结果统计正确的次数:success 495github。

探究0-1背包问题的贪婪遗传算法概要

探究0-1背包问题的贪婪遗传算法概要

探究 0-1背包问题的贪婪遗传算法1. 引言最近的研究表明,背包问题(Knapsack Problems,简称 KP 仍然难于解决。

虽然,背包问题普通人理解起来也毫不费力,而且过去几十年,有关 KP 的完全算法(Exactalgorithms 、近似算法(Approximate algorithms与启发式方法(Heuristics 都发表了大量研究成果。

但是,由于以前的计算测试限于少数有高度结构的实例(highly structuredinstances,不能显示 KP 的全部特征。

D. Pisinger 从两方面着手构造 0-1 背包问题 (0-1 orBinary Knapsack Problem, 简称 0-1KP 的新实例。

其中之一,是用更大的系数测试原先的标准实例,并利用基于分支限界(branch and bound 与动态规划(dynamic programming的完全算法进行许多计算实验。

这些算法经过几十年的改进,达到最新技术水平,几乎可以解决文献上所有传统的标准实例。

但对于精心构造的新实例,执行情况很差。

或许 KP 是“ 比较容易” 的 NP-难(NP-hard 问题之一,应用遗传算法(Genetic Algorithm,简称 GA 解决 KP 远远少于用 GA 解决旅行商问题 (Traveling Salesman Problem,简称 TSP ,虽然它们都是典型的组合问题,而且在理论和实际上都有很重要的价值。

就参考文献来说,用 GA 解决 KP 主要讨论了约束条件下的编码方法,有二进制编码法、顺序表达法、变长表达法和二重结构编码法等,以及相应的遗传算子的设计;对于迭代过程产生的不可行解,通常采用惩罚法或者解码法来解决;后者利用贪婪法则在解码的过程中把不可行解转化为可行解,从而进一步构成某种混合遗传算法(Hybrid Genetic Algorithm, 简称 HGA 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现遗传算法的0-1背包问题求解及其改进姓名:学号:班级:提交日期:2012年6月27日实现遗传算法的0-1背包问题求解摘要:研究了遗传算法解决0-1背包问题中的几个问题:1)对于过程中不满足重量限制条件的个体的处理,通过代换上代最优解保持种群的进化性2)对于交换率和变异率的理解和处理方法,采用逐个体和逐位判断的处理方法3)对于早熟性问题,引入相似度衡量值并通过重新生成个体替换最差个体方式保持种群多样性。

4)一种最优解只向更好进化方法的尝试。

通过实际计算比较表明,本文改进遗传算法在背包问题求解中具有很好的收敛性、稳定性和计算效率。

通过实例计算,表明本文改进遗传算法优于简单遗传算法和普通改进的遗传算法。

关键词:遗传算法;背包问题;优化1.基本实现原理:一、问题描述0-1背包问题属于组合优化问题的一个例子,求解0-1背包问题的过程可以被视作在很多可行解当中求解一个最优解。

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

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

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

在选择装入背包的物品时,对每种物品i只有两种选择:装入背包或者不装入背包,即只能将物品i装入背包一次。

称此类问题为0/1背包问题。

其数学模型为:0-1背包问题传统的解决方法有动态规划法、分支界限法、回溯法等等。

传统的方法不能有效地解决0-1背包问题。

遗传算法(Genetic Algorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。

二、遗传算法特点介绍:遗传算法(Genetic Algorithm, GA)是1962年Holland教授首次提出了GA算法的思想是近年来随着信息数据量激增,发展起来的一种崭新的全局优化算法,它借用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。

基本遗传算法求解步骤:Step 1 参数设置:在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率P c 和变异率P m,代数T;Step 2 初始种群:随机产生U中的N个染色体s1, s2, …, s N,组成初始种群S={s1, s2, …, s N},置代数计数器t=1;Step 3计算适应度:S中每个染色体的适应度f() ;Step 4 判断:若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束。

Step 5 选择-复制:按选择概率P(x i)所决定的选中机会,每次从S中随机选定1个染色体并将其复制,共做N次,然后将复制所得的N个染色体组成群体S1;Step 6 交叉:按交叉率P c所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;Step 7 变异:按变异率P m所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;Step 8 更新:将群体S3作为新一代种群,即用S3代替S,t=t+1,转步3;遗传算法是一种仿生算法, 即模拟生命演化的算法,它从一个代表问题初始解的初始种群出发, 不断重复执行选择, 杂交和变异的过程, 使种群进化越来越接近某一目标既最优解,如果视种群为超空间的一组点, 选择、杂交和变异的过程即是在超空间中进行点集之间的某种变换, 通过信息交换使种群不断变化,遗传算法通过模拟达尔文“优胜劣汰, 适者生存”的原理激励好的结构, 同时寻找更好的结构, 作为一种随机的优化与搜索方法, 遗传算法有着其鲜明的特点。

—遗传算法一般是直接在解空间搜索, 而不像图搜索那样一般是在问题空间搜索, 最后才找到解(如果搜索成功的话)。

—遗传算法的搜索随机地始于搜索空间的一个点集, 而不像图搜索那样固定地始于搜索空间的初始节点或终止节点, 所以遗传算法是一种随机搜索算法。

—遗传算法总是在寻找优解(最优解或次优解), 而不像图搜索那样并非总是要求优解,而一般是设法尽快找到解(当然包括优解), 所以遗传算法又是一种优化搜索算法。

—遗传算法的搜索过程是从空间的一个点集(种群)到另一个点集(种群)的搜索,而不像图搜索那样一般是从空间的一个点到另一个点地搜索。

因而它实际是一种并行搜索, 适合大规模并行计算, 而且这种种群到种群的搜索有能力跳出局部最优解。

—遗传算法的适应性强, 除需知适应度函数外, 几乎不需要其他的先验知识。

—遗传算法长于全局搜索, 它不受搜索空间的限制性假设的约束,不要求连续性, 能以很大的概率从离散的、多极值的、含有噪声的高维问题中找到全局最优解。

3.程序步骤:一、使用基本遗传算法解决0- 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()找到当前最优值并保存bestindividual中,在计算适应度函数CalculateFitnessValue()中加入:if(w>KW) X[i]=bestindividual; //如果不是解,找最好的一个解代之其中w为当前个体的总重量,KW为背包最大承重量,X[i]表示种群中第i个个体,bestindividual 为保存的个体最优解。

2.对于交换率和变异率的理解和处理方法根据遗传算法的基本步骤的交叉和变异操作Step 6 交叉:按交叉率P c所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;Step 7 变异:按变异率P m所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;可以有两种处理方法:其一,采用先确定数目在随机选取的方法,步骤如下:对于交叉操作:1,根据交叉率确定应该交叉的个体数目n2,在种群中进行n次循环2-1随机选中种群中的一个个体a2-2随机选中种群中异于a的一个个体b2-3随机确定交叉位数2-4进行交叉对于变异操作:1,根据变异率确定应该变异的染色体数目n2,在种群中进行n次循环2-1随机选中种群中的一个个体的染色体a2-2随机选中染色体a 的某位基因2-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互换变异2-3如果q 说明不需要变分析这两种处理方法可知:方法一没有很好地体现随机机会均等的思想,因为在步骤1中确定的需要操作的数目n后,总体上是保证了交叉或者变异的数目,但不是对于每一个个体而言的,因而会出现有的个体被选择交叉或者变异多次而有的没有机会交叉或者变异的情况,而如果采用方法二,就体现了机会的均等性,即要求对每一个单元操作目标进行概率的验证,以确定是否变异或者交叉。

在程序中具体的实现方法体现在交叉和变异函数中: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;2.对于算法早熟性的分析及解决方法遗传算法中种群中的个体由初始化时的具有多样性,可能会由于在进化过程中一些超常个体限制其它个体的进化——这个个体的适应度大大优于种群内的其它值,由于适者生存原则这个个体被不断复制从而充满了整个种群,使得种群的多样应大大降低,进化停滞,从而出现算法收敛于局部最优解的现象,称为早熟现象。

早熟现象的可能解法:1)通过提高变异率来增加种群的多样性,以期更优解的出现,这也是最简单基本遗传算法中不添加相关操作的情况下唯一的一种方法,然而这种方法有明显的弊端:在提高变异率获得多样性种群的同时,个体变异的机会增加,使得较优解发生变异,从而遗传算法丧失了其优于其它算法的优越性,所以这种方法不是很好地解决方法。

2)引入多样性衡量和处理基本思路:在出现进化停滞现象时要引入新的个体来增强种群的多样性。

相关文档
最新文档