遗传算法的背包问题c语言

合集下载

数学建模遗传算法例题

数学建模遗传算法例题

数学建模遗传算法例题数学建模中,遗传算法是一种基于进化思想的优化算法,可以应用于复杂的优化问题中。

本文将介绍一些遗传算法的例题,帮助读者更好地理解遗传算法的应用。

例题一:背包问题有一个体积为V的背包和n个物品,第i个物品的体积为vi,价值为wi。

求这个背包最多能装多少价值的物品。

遗传算法的解决步骤:1. 初始化种群:随机生成一定数量的个体作为初始种群。

2. 适应度函数:将每个个体代入适应度函数,计算其适应度值。

3. 选择:根据每个个体的适应度值,选择一定数量的个体进入下一代。

4. 交叉:对被选中的个体进行交叉操作,生成新的个体。

5. 变异:对新的个体进行变异操作,引入新的基因。

6. 重复以上步骤,直到符合终止条件。

在背包问题中,适应度函数可以定义为:背包中物品的总价值。

交叉操作可以选择单点交叉或多点交叉,变异操作可以选择随机变异或非随机变异。

例题二:旅行商问题有n个城市,旅行商需要依次经过这些城市,每个城市之间的距离已知。

求旅行商经过所有城市的最短路径。

遗传算法的解决步骤:1. 初始化种群:随机生成一定数量的个体作为初始种群,每个个体代表一种旅行路线。

2. 适应度函数:将每个个体代入适应度函数,计算其适应度值。

3. 选择:根据每个个体的适应度值,选择一定数量的个体进入下一代。

4. 交叉:对被选中的个体进行交叉操作,生成新的个体。

5. 变异:对新的个体进行变异操作,引入新的基因。

6. 重复以上步骤,直到符合终止条件。

在旅行商问题中,适应度函数可以定义为:旅行商经过所有城市的总距离。

交叉操作可以选择顺序交叉或部分映射交叉,变异操作可以选择交换或反转基因序列。

总结:遗传算法是一种强大的优化算法,可以应用于多种复杂的优化问题中。

在数学建模中,遗传算法的应用也越来越广泛。

本文介绍了背包问题和旅行商问题的遗传算法解决步骤,希望对读者有所帮助。

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

遗传算法求解背包问题

遗传算法求解背包问题

遗传算法求解背包问题程序实现一、背包问题描述背包问题是著名的NP 完备类困难问题,对这个问题的求解前人已经研究出了不少的经典的方法,对该问题确实能得到很好的结果。

近年来蓬勃发展起来的遗传算法已被广泛地应用于优化领域,其全局最优性、可并行性、高效性在函数优化中得到了广泛地应用遗传算法克服了传统优化方法的缺点,借助了大自然的演化过程,是多线索而非单线索的全局优化方法,采用的是种群和随机搜索机制. 本程序将遗传算法应用于背包问题。

二、实验程序1、编程语言:C++2、开发环境:Microsoft Visual Studio 20053、程序整体流程:步1初始化过程1. 1确定种群规模scale、杂交概率pc、变异概率pm、染色体长度chN及最大进化代数maxgen。

1. 2取x1′(0) = u (0 ,1) , x2′(0) = u (0 ,1) , …, xchN′(0) = u (0 ,1) ,其中函数u (0 ,1) 表示随机地产生数0 或1 ,则x (0) = ( x1 (0) , x2 (0) ,⋯, xN (0) ) .若不满足约束条件,则拒绝接受. 由(1. 2) 重新产生一个新的染色体; 如果产生的染色体可行,则接受它作为种群的一名成员,经过有限次抽样后, 得到scale个可行的染色体xj (0) , j =1 ,2 , ⋯, M ,设xj (0) 的染色体编码为vj (0) ,并记为v (0) = ( v1 (0) , ⋯, vchN (0) ) .1. 3计算各个染色体的适值1. 4 置k = 0步2选择操作2. 1采用转轮法选择下一代。

.步3杂交变异操作3. 1 事先定义杂交操作的概率pc ,为确定杂交操作的父代,从j = 1 到M 重复以下过程:从[0 ,1 ] 中产生随机数r ,若r < pc ,则选择cj′( k)作为一个父代.3. 2 产生两个[1 , N ] 上的随机整数i 、j ,变异的结果为染色体vj′( k)的第i 位基因的值变为其第j 位基因的值,同样将染色体的vj′( k)第j 位基因的值变为其第i 位基因的值.3. 3 检验该染色体的可行性,若可行则作为变异的结果;如不可行,重复3. 2 直至该染色体可行.3. 4 事先定义变异概率pm ,对经过杂交操作的中间个体进行变异操作: ,如果r < pm ,则选择vi″( k) 作为变异的父代.3. 5 产生一个[1 , N ] 上的随机整数i ,及随机地产生数0 或1 , 记为b , 变异的结果为染色体vi″( k) 的第i 位基因的值变为b.3. 6 检验该染色体的可行性,若可行则作为变异的结果:如不可行,重复3. 5 直至该染色体可行.3. 7 计算新个体的适应值,并把它们同时放回,和步2 选择操作中剩余的个体一起构成新一代种群v ( k + 1) = { v1 ( k + 1) , v2 ( k + 1) , ⋯, vM ( k + 1) } .步4 终止检验如果达到最大进化代数maxgen 则终止演化,否则置k : = k + 1 ,转步2.4、程序流程图程序流程图5、程序代码1)主程序代码:KnapsacksProblem.cpp文件#include "GAonKP.h"#include <iostream>using namespace std;void main(){FILE* fp;CGAonKP gakp;int scale; //种群规模double MaxWeight; //背包允许最大财宝质量double pc; //杂交概率double pm; //变异概率int maxgen; //最大进化代数char filename[256];cout<<"遗传算法解决背包问题程序使用说明:"<<endl;cout<<"1、该背包问题采用遗传算法"<<endl;cout<<"2、-1编码的方法,其中代表选中所对应的物品,代表不选中该物品"<<endl;cout<<"3、背包允许最带重量,种群规模(解空间大小),";cout<<"杂交概率,变异概率,最大进化代数需自己给";cout<<"定,程序会提示输入"<<endl;cout<<"4、程序提供一个输入示例"<<endl;cout<<"5、输入文件可加单行或多行注释"<<endl;cout<<"例如:#添加单行注释内容#"<<endl;cout<<"例如:#添加多行注释内容"<<endl;cout<<" 添加多行注释内容#"<<endl;cout<<"6、输入文件头位置需指定物品个数为int型数据。

遗传算法求解背包问题

遗传算法求解背包问题

遗传算法的过程:初始化:将计划装入背包的每个物品看成一个二进制串的一位,为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];}杂交:将两次选择得到的父代染色体进行杂交得到一条新的染色体,作为较新种群(并非新的种群)的一条染色体,杂交直到较新种群的染色体数等于原种群的染色体数。

01背包问题c语言代码回溯法

01背包问题c语言代码回溯法

以下是使用C语言实现01背包问题的回溯法代码:```c#include <stdio.h>#include <stdlib.h>// 初始化背包struct knapsack {int maxWeight; // 背包最大承重int *items; // 物品数组int n; // 物品数量};// 定义物品重量、价值和数量int weights[] = {2, 2, 6, 5, 4};int values[] = {6, 3, 5, 4, 6};int quantities[] = {3, 2, 2, 1, 1};// 初始化背包最大承重和当前承重int maxWeight = 10;int currentWeight = 0;// 初始化最大价值为0int maxValue = 0;// 遍历物品数组void traverseItems(struct knapsack *knapsack, int index) { // 对于每个物品,遍历其数量for (int i = 0; i < knapsack->quantities[index]; i++) {// 如果当前物品可以放入背包装且当前承重不超过背包最大承重,计算放入该物品后的总价值,并更新最大价值if (currentWeight + weights[index] <= knapsack->maxWeight) {int currentValue = values[index] * knapsack->quantities[index];if (currentValue > maxValue) {maxValue = currentValue;}}// 回溯,将当前物品从背包装中移除,递归地尝试下一个物品knapsack->quantities[index]--;if (index < knapsack->n - 1) {traverseItems(knapsack, index + 1);}knapsack->quantities[index]++; // 恢复物品数量,以便下次遍历尝试放入其他物品}}// 主函数int main() {// 初始化背包装和物品数组struct knapsack knapsack = {maxWeight, weights, 5};knapsack.items = (int *)malloc(sizeof(int) * knapsack.n);for (int i = 0; i < knapsack.n; i++) {knapsack.items[i] = values[i] * quantities[i]; // 根据价值和数量计算物品价值,并存储在物品数组中}knapsack.n = quantities[4]; // 由于最后一个物品的数量为1,因此只需遍历前n-1个物品即可得到所有可能的结果// 使用回溯法求解01背包问题,返回最大价值traverseItems(&knapsack, 0);printf("The maximum value is %d.\n", maxValue);free(knapsack.items); // 释放内存空间return 0;}```希望以上信息能帮助到你。

遗传算法的C语言实现(二)-----以求解TSP问题为例

遗传算法的C语言实现(二)-----以求解TSP问题为例

遗传算法的C语⾔实现(⼆)-----以求解TSP问题为例上⼀次我们使⽤遗传算法求解了⼀个较为复杂的多元⾮线性函数的极值问题,也基本了解了遗传算法的实现基本步骤。

这⼀次,我再以经典的TSP问题为例,更加深⼊地说明遗传算法中选择、交叉、变异等核⼼步骤的实现。

⽽且这⼀次解决的是离散型问题,上⼀次解决的是连续型问题,刚好形成对照。

⾸先介绍⼀下TSP问题。

TSP(traveling salesman problem,旅⾏商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增⼤按指数⽅式增长,到⽬前为⽌还没有找到⼀个多项式时间的有效算法。

TSP问题可以描述为:已知n个城市之间的相互距离,某⼀旅⾏商从某⼀个城市出发,访问每个城市⼀次且仅⼀次,最后回到出发的城市,如何安排才能使其所⾛的路线最短。

换⾔之,就是寻找⼀条遍历n个城市的路径,或者说搜索⾃然⼦集X={1,2,...,n}(X的元素表⽰对n个城市的编号)的⼀个排列P(X)={V1,V2,....,Vn},使得Td=∑d(V i,V i+1)+d(V n,V1)取最⼩值,其中,d(V i,V i+1)表⽰城市V i到V i+1的距离。

TSP问题不仅仅是旅⾏商问题,其他许多NP完全问题也可以归结为TSP问题,如邮路问题,装配线上的螺母问题和产品的⽣产安排问题等等,也使得TSP问题的求解具有更加⼴泛的实际意义。

再来说针对TSP问题使⽤遗传算法的步骤。

(1)编码问题:由于这是⼀个离散型的问题,我们采⽤整数编码的⽅式,⽤1~n来表⽰n个城市,1~n的任意⼀个排列就构成了问题的⼀个解。

可以知道,对于n个城市的TSP问题,⼀共有n!种不同的路线。

(2)种群初始化:对于N个个体的种群,随机给出N个问题的解(相当于是染⾊体)作为初始种群。

这⾥具体采⽤的⽅法是:1,2,...,n作为第⼀个个体,然后2,3,..n分别与1交换位置得到n-1个解,从2开始,3,4,...,n分别与2交换位置得到n-2个解,依次类推。

c语言算法--贪婪算法---01背包问题

c语言算法--贪婪算法---01背包问题

c语言算法--贪婪算法---0/1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。

从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。

对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高,即n ?i=1pi xi 取得最大值。

约束条件为n ?i =1wi xi≤c 和xi?[ 0 , 1 ] ( 1≤i≤n)。

在这个表达式中,需求出xt 的值。

xi = 1表示物品i 装入背包中,xi =0 表示物品i 不装入背包。

0 / 1背包问题是一个一般化的货箱装载问题,即每个货箱所获得的价值不同。

货箱装载问题转化为背包问题的形式为:船作为背包,货箱作为可装入背包的物品。

例1-8 在杂货店比赛中你获得了第一名,奖品是一车免费杂货。

店中有n 种不同的货物。

规则规定从每种货物中最多只能拿一件,车子的容量为c,物品i 需占用wi 的空间,价值为pi 。

你的目标是使车中装载的物品价值最大。

当然,所装货物不能超过车的容量,且同一种物品不得拿走多件。

这个问题可仿照0 / 1背包问题进行建模,其中车对应于背包,货物对应于物品。

0 / 1背包问题有好几种贪婪策略,每个贪婪策略都采用多步过程来完成背包的装入。

在每一步过程中利用贪婪准则选择一个物品装入背包。

一种贪婪准则为:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。

这种策略不能保证得到最优解。

例如,考虑n=2, w=[100,10,10], p =[20,15,15], c = 1 0 5。

当利用价值贪婪准则时,获得的解为x= [ 1 , 0 , 0 ],这种方案的总价值为2 0。

而最优解为[ 0 , 1 , 1 ],其总价值为3 0。

另一种方案是重量贪婪准则是:从剩下的物品中选择可装入背包的重量最小的物品。

ACM背包问题

ACM背包问题
第4 章
背包问题
如果给你一个背包,要你从许多东西里选择一些装进来,只要这个包装得下,你就可 以将包里的东西全部拿走了,那么你会如何选择物品呢?这里你需要考虑的是背包的体积 和承重限制,当然最重要的是你拿走的东西的总价值最大。这样的问题就是背包问题,许 多问题都可以转化为背包问题来考虑。背包问题是一个在运筹学领域里常见的典型 NP-C 难题,对该问题的求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。
while (goods[0].flag<goods[i].flag) {
goods[i+1]=goods[i]; i--; } goods[i+1]=goods[0]; } ///////////////////////////////////////////
·78·
第 4 章 背包问题
cout<<"最优解为:"<<endl; for(i=1;i<=n;i++) {
4.3.1 〖案例 2〗0/1 背包
需对容量为 c 的背包进行装载。从 n 个物品中选取装入背包的物品,每件物品 i 的重 量为 wi,价值为 pi。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最 佳装载是指所装入的物品价值最高。限制:每个物品不能被分割,要不被装载,要不不被 装载。
第一行物品个数,接下来分别为物品价值,再接下来分别为物品的价值。再接下来分 别为物品的重量,最后为背包的容量。
数据结构与算法: 不需要特殊的数据结构 算法采用贪婪法 首先输入物品信息和背包容量,然后每次选比重最大的装载。
struct goodinfo
{ float p; float w; float X; int flag;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.3取 ,其中 表示0-1整数的均匀分布函数,即随机地生成数0或1,生成的 串即可看为一个染色体个体。
若不满足模型(*)的约束条件,则拒绝接受,由1.2重新生成一个新的染色体个体chrom;如果产生的染色体可行,则接受它作为种群的一名成员,经过有限次的1.2抽样后,得到popsize个可行的染色体chrom,形成新的种群。
6.3 种群的代数gen=genm+1,若gen〉Maxgen,则结束种群的演化,否则转到步骤2。
六、遗传算法求解的实现
1、遗传算法的主要参数
#define popsize 80 //种群的规模
#define pc 0.7 //杂交概率
#define pm 0.1 //变异概率
#define lchrom 50 //染色体长度
返回值:无;
流程图:见图ቤተ መጻሕፍቲ ባይዱ。
图4、函数statistics的流程图
图5、函数report的流程图
(5)、void initpop( )
功能:生成初始种群;
参数:无;
返回值:无;
流程图:见图6。
图6、函数initpop流程图
(6)、int execise(double probability)
功能:概率选择试验,以概率probability做随机试验,判断是否进行交叉或变异操作;
#define maxgen 5000 //最大进化代数
double alpha;//计算适应度时使用的 惩罚函数系数
2、数据结构
(1)背包信息:
//背包问题中物体重量、收益、背包容量
int weight[lchrom],profit[lchrom],contain;
(2)种群个体结构体
struct population
使用递归回溯法解决背包问题的优点在于它算法思想简单,而且它能完全遍历搜索空间,肯定能找到问题的最优解;但是由于此问题解的总组合数有 个,因此,随着物件数n的增大,其解的空间将以 级增长,当n大到一定程度上,用此算法解决背包问题将是不现实的。
使用贪心方法求解时计算的复杂度降低了很多,但是往往难以得到最优解,有时所得解与最优解相差甚远。因此,我们可以探索使用遗传算法解决物件数较大的背包问题。
遗传算法是将问题的每一个可能性解看作是群体中的一个个体(染色体),并将每一个染色体编码成串的形式,再根据预定的目标函数对每个个体进行评价,给出一个适应值。算法将根据适应度值进行它的寻优过程,遗传算法的寻优过程是通过选择、杂交和变异三个遗传算子来具体实现的。它的搜索能力由选择算子和杂交算子决定,变异算子则保证了算法能够搜索到问题空间的尽可能多的点,从而使其具有搜索全局最优的能力。遗传算法的高效性和强壮性可由Holland提出的模式定理( Schema Therem)和隐式并行性得以解释。在遗传算法中,定义长度较短、低阶且适应值超过平均适应值的模式在群体中数目的期望值按指数递增,这个结论称为遗传算法的基本定理。遗传算法是通过定义长度短、确定位数少、适应度值高的模式的反复抽样、组合来寻找最佳点,称这些使遗传算法有效工作的模式为积木块,是遗传算法构造答案的基本材料。但归根到底,要使遗传算法有效工作必须按照遗传算法的模式定理(或积木块假设)根据具体问题设计合理的编码方案。
在运行遗传算法程序时,需要对一些参数作事先选择,它们包括种群的大小、染色体长、交叉率、变异率、最大进化代数等,这些参数对GA的性能都有很重要的影响。在试验中参数一般选取如下:种群大小N= 20~100 ,交叉概率 = 0.4 ~0.9 ,变异概率 = 0.001~0.1 ,最大进化代数maxgen = 100~500。
目标函数:
(*)
式中 为0-1决策变量, 时表示将物品 装入背包中, 时则表示不将其装入背包中。
三、求解背包问题的一般方法
解决背包问题一般是采取动态规划、递归回溯法和贪心方法。动态规划可以把困难得多阶段决策变换为一系列相互联系比较容易的单阶段问题。对于背包问题可以对子过程用枚举法求解,而且约束条件越多,决策的搜索范围越小,求解也越容易。它的主要缺点是用数值方法求解时会随着状态变量的个数呈指数级的增长,往往对于求解背包问题的实际问题是不现实的。
(4)适应度信息
//种群的总适应度、最小、最大适应度
doublesumfitness,minfitness,maxfitness;
//一个种群中最大和最小适应度的个体编号
int minpop,maxpop;
3、主要函数说明
(1)、intread_infor()
功能:从文件knapsack.txt中读出背包信息(物体重量、收益、背包容量);
二、问题描述
背包问题(Knapsack Problem)的一般提法是:已知n个物品的重量(weight)及其价值(或收益profit)分别为 和 ,背包的容量(contain)假设设为 ,如何选择哪些物品装入背包可以使得在背包的容量约束限制之内所装物品的价值最大?
该问题的模型可以表示为下述0/1整数规划模型:
遗传算法是具有“生成+检测”的迭代过程的搜索算法。它的基本处理流程如图1所示。
图1、遗传算法的基本流程
遗传算法的基本流程描述如下:
(1)编码:将解空间的解数据进行二进制编码,表达为遗传空间的基因型串(即染色体)结构数据,如将数据9编码为“1001”;
(2)初始化种群:定义整数pop_size作为染色体的个数,并且随机产生pop_size个染色体作为初始种群;
(3)评估种群中个体适应度:评价函数对种群中的每个染色体(chromosome)求得其个体适应度 ;
(4)选择:选择把当前群体中适应度较高的个体按某种规则或者模型遗传到下一代种群中,这里所用的规则是:染色体在种群中被选择的可能性与其个体的适应度的大小成正比;
(5)交叉:定义参数 作为交叉操作的概率,由(4)选择得到的两个个体以概率 交换各自的部分染色体,得到新的两个个体;
遗传算法已经成为组合优化问题的近似最优解的一把钥匙。它是一种模拟生物进化过程的计算模型,作为一种新的全局优化搜索算法,它以其简单、鲁棒性强、适应并行处理以及应用范围广等特点,奠定了作为21世纪关键智能计算的地位。
背包问题是一个典型的组合优化问题,在计算理论中属于NP-完全问题,其计算复杂度为 ,传统上采用动态规划来求解。设w[i]是经营活动 i 所需要的资源消耗,M是所能提供的资源总量,p[i]是人们经营活动i得到的利润或收益,则背包问题就是在资源有限的条件下,追求总的最大收益的资源有效分配问题。
四、遗传算法简介
遗传算法( Genetic Algorithms,GA)是在1975年首次由美国密西根大学的D。J。Holland教授和他的同事们借鉴生物界达尔文的自然选择法则和孟德尔的遗传进化机制基础之上提出的。经过近30年的研究、应用,遗传算法已被广泛地应用于函数优化、机器人系统、神经网络学习过程、模式识别、图象处理、工业优化控制等领域。
流程图:见图3。
图3、函数cal_fit的流程图
(3)、void statistics(struct population *pop)
功能:群体适应度的最大最小值以及其他信息;
参数:struct population *pop是种群指针,根据指针所指向的种群信息统计群体适应度的信息;
返回值:无;
流程图:见图4。
1.4 置种群的代数gen=0;
步骤2、计算种群中个体适应度以及统计种群适应度情况
2.1 按照下列公式计算种群中个体适应度:

公式(2)的下半部分即为适应度的惩罚函数,其中参数 。
2.2 按公式(3)计算种群的总体适应度,
并且按照排序的方法统计出种群中的最大、最小适应度的染色体个体,分别标记为maxpop、minpop;
(6)变异:定义参数 作为变异操作的概率,由(5)得到每个个体中的每个基因值都以概率 进行变异;
(7)演化:经过选择、交叉和变异操作,得到一个新的种群,对上述步骤经过给定的循环次数(maxgen)的种群演化,遗传算法终止。
五、背包问题的遗传算法求解描述
基于背包问题的模型(*),我们设计了针对于背包问题的染色体编码方法:将待求解的各量 表示成长为 的二进制字符串 ,j=1,2, …,n。 表示物体j不放入背包内, …000111代表一个解,它表示将第1、2、3、6、7…n-2,n-1,n号物体放入背包中,其它的物体则不放入。
参数:无;
返回值:返回读取文件信息是否正确;
流程图:见图2。
图2、read_infor( )流程图
(2)double cal_fit(unsigned int *chr)
功能:种群中个体适应度计算;
参数:unsigned int *chr是染色体个体的指针,根据指针所指向的染色体计算个体的适应度;
返回值:染色体个体适应度的大小;
while sum<wheel-pos && i<=popsize
{ i=i+1;
sum=sum+fitness[i]; //fitness为第i个个体的适应度
}
return i-1; //选择了个体i-1
}
3.3 重复两次操作3.1、3.2,生成两个个体作为交叉操作的父代;
步骤四、交叉操作
4.1 根据事先定义好的交叉概率 ,为了确定是否进行交叉操作,则生成[0,1]的随机数pp,若 ,则进行4.2交叉操作,否则将两个父代保留为下一代的两个个体;
根据遗传算法的基本流程,我们确定了求解背包问题的遗传算法:
步骤1、初始化过程
1.1确定种群规模popsize、杂交概率 、变异概率 、染色体长度lchrom及最大进化代数maxgen;
1.2读入背包问题的相关信息,如每个物体的重量weight[j]、每个物体的收益profit[j]和背包的容量contain,其中 ;
相关文档
最新文档