- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0-1背包问题设计说明书
摘 要
0-1背包问题在实际中有广泛的应用,本课程设计采用遗传算法中Prim算法解决0-1背包问题,遗传算法主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法不是对所有问题都能得到整体最优解,但对范围相当广的许多问题它能产生整体最优解。通过分析用遗传算法解决0-1背包问题能得到问题的最优解。
根据算法的设计结果,采用C语言实现算法,通过测试分析,程序运行结果正确,运行效率较高。
关键词:0-1背包问题,遗传算法,Prim算法
目 录
1 问题描述 1
2 问题分析 2
3 建立数学模型 3
4 算法设计 4
5 算法实现 5
6 测试分析 6
结 论 7
参考文献 8
1 问题描述2 问题分析#includeiostream
#includeiomanip
#includecstdlib
#includecmath
#includectime
using namespace std;
//定义问题的最大规模
#define max 100
//为题规模,即共有多少个包
int packageNum;
//每个包的重量
int packageWeight[max];
//每个包的价值
int packageValue[max];
//约束,背包的最大容量
int limitWeight;
//群体的规模
int colonySize;
/*colonyState[i][k] 表示一个染色体*/
/*colonyState[1...conlonySize][0|1] 表示一个群体*/
int colonyState[max][2][max];
/* currAge 表示当前代的编号*/
/* (currAge+1)%2 表示下一代的编号*/
int currAge = 0;
/* 个体评价*/
typedef struct tagIndivdualMsg
{ int index;
int value;
}IndivdualMsg;
IndivdualMsg indivdualMsg[max];
/*函数声明*/
void printColonyState(int nextAge);
/*初始化群体,初始种群产生,并计算每个适应度值和其对应的约束条件值(即为在染色体中选取的物品的重量)
,比较初始种群中各个个体的适应度。选择最大者所对应的个体作为第一代最优个体,并记录该个体以及它的适应度和约束条件值。*/
void colonyInit()
{ int i, j;
int w;
for(i=0; icolonySize; i++)
{ //保证找到一个符合约束的染色体
w = limitWeight +1;
while(w limitWeight)
{ w = 0;
for(j=0; jpackageNumw=limitWeight; j++)
{
colonyState[i][currAge][j] = rand()%2;
w += packageWeight[j] * colonyState[i][currAge][j];}
}
}
}
/*对个体进行评价*/
int cmp(const void *a, const void *b)
{
IndivdualMsg *x = (IndivdualMsg *)a;
IndivdualMsg *y = (IndivdualMsg *)b;
return y-value - x-value;
}
void indivdualEstimate()
{ int i, j;
for(i=0; icolonySize; i++)
{
indivdualMsg[i].index = i;
indivdualMsg[i].value = 0;
for(j=0; jpackageNum; j++)
indivdualMsg[i].value += packageValue[j]*colonyState[i][currAge][j];}
qsort(indivdualMsg, colonySize, sizeof(IndivdualMsg), cmp);
}
/*终止循环的条件,给定一个最大进化步数*/
bool stopFlag()
{ //进行n代进行后停止
static int n = 50;
if(n-- = 0)
return false;
else
return true;
}
/*赌轮选择*/
int g
文档评论(0)