匿名用户

1级

2013-07-13 回答

1、程序开发环境

开发环境:Visual C++6.0 (把Fortran程序改为VC)

操作系统:Windows 2003 Professional

2、程序性能对比

运行时间与加速比(如表1所示)

进程数p(个) 1 2 4

运行时间t(秒) 129s 78s 38s

加速比s  1.65 3.38

表1、运行时间与加速比

3、程序运行结果:

实例数据:

假设物体的重量Weight、物体的收益Profit和背包的容量Contain 分别为:

Weight={ 80,82,85,70,72,    70,66,50,55,25 ,

50,55,40,48,50,     32,22,60,30,32 ,

40,38,35,32,25,     28,30,22,50,30 ,

45,30,60,50,20 ,    65,20,25,30,10 ,

20,25,15,10,10 ,    10,4, 4, 2, 1   }

Profit={  220,208,198,192,180,    180,165,162,160,158,

155,130,125,122,120 ,   118,115,110,105,101,

100,100,98, 96, 95,     90, 88, 82, 80, 77 ,

75, 73, 72, 70, 69,     66, 65, 63, 60, 58,

56, 50, 30, 20, 15,      10, 8,  5,  3,  1}

Contain=1000,

如何选择哪些物品装入该背包可使得在背包的容量约束限制之内所装物品的总价值最大?

传统的算法(动态规划、递归回溯法和贪心算法所得结果:

总价值为3077 , 总重量为999。

2001年张铃,张钹教授在计算机学报上发表的《佳点集遗传算法》所得结果

总价值为3103, 总重量为1000。

我们算法所得结果:                   总价值为3103, 总重量为1000。

我们所求得最优解的个体分配情况为:

11010   10111   10110   11011   01111   11101   00001   01001   10000

01000

算法 最大迭代次数 总价值为 总重量为

传统的算法 400 3077 999

佳点集算法 70 3103 1000

遗传算法    75 3103 1000

// knapsack.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include

#include

#include

#include

#include

#include

// 重要常量参数

#define popsize 200   //种群的规模

#define pc 0.618        //杂交概率

#define pm 0.03        //变异概率

#define lchrom 50      //染色体长度

#define maxgen 1000     //最大进化代数

struct population

{

unsigned int chrom[lchrom];   //染色体

double weight;                //背包重量

double fitness;               //适应度

unsigned int parent1,parent2,cross;  //双亲、交叉点

};

//新生代种群、父代种群

struct population oldpop[popsize],newpop[popsize];

//背包问题中物体重量、收益、背包容量

int weight[lchrom],profit[lchrom],contain;

//种群的总适应度、最小、最大、平均适应度

double sumfitness,minfitness,maxfitness,avgfitness;

//计算适应度时使用的 惩罚函数系数

double alpha;

//一个种群中最大和最小适应度的个体

int    minpop,maxpop;

/* 读入背包信息,并且计算惩罚函数系数 */

void read_infor()

{

FILE *fp;

int j;

//获取背包问题信息文件

if ((fp=fopen("knapsack.txt","r"))==NULL)

{

//读取文件失败

AfxMessageBox("The file is not found",MB_OK,NULL);

return;

}

//读入物体收益信息

for (j=0;j

{

fscanf(fp,"%d",&profit[j]);

}

//读入物体重量信息

for (j=0;j

{

fscanf(fp,"%d",&weight[j]);

}

//读入背包容量

fscanf(fp,"%d",&contain);

fclose(fp);

}

//根据计算的个体重量,判断此个体是否该留在群体中

double cal_weight(unsigned int *chr)

{

int j;

double pop_weight;//背包重量

pop_weight=0;

for (j=0;j

{

pop_weight=pop_weight+(*chr)*weight[j];

chr++;

}

return pop_weight;

}

/* 种群中个体适应度计算*/

double cal_fit(unsigned int *chr)

{

int j;

double pop_profit;//适应度

pop_profit=0;

//  pop_weight=0;

for (j=0;j

{

pop_profit=pop_profit+(*chr)*profit[j];

// pop_weight=pop_weight+(*chr)*weight[j];

chr++;

}

return pop_profit;

}

/* 群体适应度的最大最小值以及其他信息 */

void statistics(struct population *pop)

{

int i;

double tmp_fit;

sumfitness=pop[0].fitness;

minfitness=pop[0].fitness;

minpop=0;

maxfitness=pop[0].fitness;

maxpop=0;

for (i=1;i

{

//计算种群的总适应度

sumfitness=sumfitness+pop[i].fitness;

tmp_fit=pop[i].fitness;

//选择种群中最大适应度的个体

if ((tmp_fit>maxfitness)&&((int)(tmp_fit*10)%10==0))

{

maxfitness=pop[i].fitness;

maxpop=i;

}

//选择种群中最小适应度的个体

if (tmp_fit

{

minfitness=pop[i].fitness;

minpop=i;

}

//计算平均适应度

avgfitness=sumfitness/(float)popsize;

}

//  printf("\nthe max pop = %d;",maxpop);

//  printf("\nthe min pop = %d;",minpop);

//   printf("\nthe sumfitness = %f\n",sumfitness);

}

//报告种群信息

void report(struct population *pop,int gen)

{

int j;

int pop_weight=0;

printf("the generation is %d.\n",gen); //输出种群的代数

//输出种群中最大适应度个体的染色体信息

printf("The population's chrom is:  \n");

for (j=0;j

{

if (j%5==0)

{  printf(" ");}

printf("%1d",pop[maxpop].chrom[j]);

}

//输出群体中最大适应度

printf("\nThe population's max fitness is %d.",(int)pop[maxpop].fitness);

printf("\nThe knapsack weight is %d.\n\n",(int)pop[maxpop].weight);

}

/* 生成初始种群 */

void initpop()

{

int i,j,ispop;

double tmpWeight;

//变量用于判断是否为满足条件的个体

ispop=false;

//生成popsize个种群个体

for(i=0;i

{

while (!ispop)

{

for(j=0;j

{

oldpop[i].chrom[j]=rand()%2;   //随机生成个体的染色体

oldpop[i].parent1=0;  //双亲

oldpop[i].parent2=0;

oldpop[i].cross=0;    //交叉点

}

//选择重量小于背包容量的个体,即满足条件

tmpWeight=cal_weight(oldpop[i].chrom);

if (tmpWeight<=contain)

{

oldpop[i].fitness=cal_fit(oldpop[i].chrom);

oldpop[i].weight=tmpWeight;

oldpop[i].parent1=0;

oldpop[i].parent2=0;

oldpop[i].cross=0;

ispop=true;

}

}

//此个体可以加入到种群中

ispop=false;

}

}

/*  遗传操作   */

//概率选择试验

int execise(double probability)

{

double pp;

//如果生成随机数大于相应的概率则返回真,否则试验不成功

pp=(double)(rand()%20001/20000.0);

if (pp<=probability) return 1;

return 0;

}

// 选择进行交叉操作的个体

int selection(int pop)

{

double wheel_pos,rand_Number,partsum;

int parent;

//赌轮法选择

rand_Number=(rand()%2001)/2000.0;

wheel_pos=rand_Number*sumfitness;  //赌轮大小

partsum=0;

parent=0;

do{

partsum=partsum+oldpop[parent].fitness;

parent=parent+1;

} while (partsum

return parent-1;

}

/*  交叉操作  */

int crossover(unsigned int *parent1,unsigned int *parent2,int i)

{

int j,cross_pos;

if (execise(pc))

{

//生成交叉位置0,1,...(lchrom-2)

cross_pos=rand()%(lchrom-1);

}

else cross_pos=lchrom-1;

for (j=0;j<=cross_pos;j++)

{   //保留复制;

//包括在概率选择不成功时,父体完全保留

newpop[i].chrom[j]=parent1[j];

}

for(j=cross_pos+1;j<=(lchrom-1);j++)

{

//从交叉点开始交叉

newpop[i].chrom[j]=parent2[j];

}

//记录交叉位置

newpop[i].cross=cross_pos;

return 1;

}

/*  变异操作 */

int mutation(unsigned int alleles)

{

if (execise(pm))

{

if (alleles)

alleles=0;

else alleles=1;

}

//返回变异值,或者返回原值

return alleles;

}

/* 群体更新 */

void generation()

{

unsigned int i,j,mate1,mate2;

double tmpWeight;

int ispop;//记录是否是符合条件的个体

i=0;

while (i

{

ispop=false;

while (!ispop)

{

//选择

mate1=selection(i);

mate2=selection(i+1);

//交叉

crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,i);

//变异

for (j=0;j

{

newpop[i].chrom[j]=mutation(newpop[i].chrom[j]);

}

//选择重量小于背包容量的个体,即满足条件

tmpWeight=cal_weight(newpop[i].chrom);

if (tmpWeight<=contain)

{

newpop[i].fitness=cal_fit(newpop[i].chrom);

newpop[i].weight=tmpWeight;

newpop[i].parent1=mate1;

newpop[i].parent2=mate2;

ispop=true;

}

}

//此个体可以加入到种群中

i=i+1;

}

}

void main(int argc, char* argv[])

{

int gen,oldmaxpop,k;

double oldmax;

read_infor();//读入背包信息

gen=0;

srand( (unsigned)time( NULL ) );//置随机种子

initpop();

memcpy(&newpop,&oldpop,popsize*sizeof(struct population));

statistics(newpop);//统计新生种群的信息

report(newpop,gen);

while(gen

{

gen=gen+1;

if (gen%100==0)

{

srand( (unsigned)time( NULL ) );//置随机种子

}

oldmax=maxfitness;

oldmaxpop=maxpop;

generation();

statistics(newpop); //统计新生代种群信息

//如果新生代种群中个体的最大适应度小于老一代种群

//个体的最大适应度,则保存老一代种群个体的最大适应度

//否则报告新生代的最大适应度

if (maxfitness

{

for(k=0;k

newpop[minpop].chrom[k]=oldpop[oldmaxpop].chrom[k];

newpop[minpop].fitness=oldpop[oldmaxpop].fitness;

newpop[minpop].parent1=oldpop[oldmaxpop].parent1;

newpop[minpop].parent2=oldpop[oldmaxpop].parent2;

newpop[minpop].cross=oldpop[oldmaxpop].cross;

statistics(newpop);

}

else if (maxfitness>oldmax)

{

report(newpop,gen);

}

//保存新生代种群的信息到老一代种群信息空间

memcpy(&oldpop,&newpop,popsize*sizeof(struct population));

}

printf("It is over.");

getch();

}

追问:

这个没有贪心算法的,能不能求一个两个相结合的啊???

追答:

背包还能用贪心解吗?

除了这个我只知道搜索和动态规划

c语言贪婪遗传算法算法背包问题,求高手帮我用C语言写一个运用贪心和遗传算法求解背包问题的程序。。。。谢谢!!!!!!十分紧急!!!...相关推荐

  1. c语言求英文字母编号,菜鸟求助,写一个随机输出26个英文字母的程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include // 用srand.rand函数了 #include // 用time函数了 #define LEN 32 // 产生 ...

  2. c语言输出26个英文字母的能量值,菜鸟求助,写一个随机输出26个英文字母的程序...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include // 用srand.rand函数了 #include // 用time函数了 #define LEN 32 // 产生 ...

  3. mysql中如何求字段的个数字_求高手帮小弟解决一下!关于mysql字段中数字提取求和的问题?...

    例如表1中的No字段是字符串类型,no字段中包含数字及符号,如20+1.5,8+5+4等 那么有办帮法提取出20,1.5,8,5,4这些数字来进行求和等于38.5吗?语句怎么样写? 解决方案 30 提 ...

  4. c语言成绩等级switch语句,请高手 帮忙做一道c语言题 编程,把百分制成绩转换成5级记分制,要求用switch语句。 90分以上(包括90):...

    请高手 帮忙做一道c语言题 编程,把百分制成绩转换成5级记分制,要求用switch语句. 90分以上(包括90): 关注:243  答案:6  mip版 解决时间 2021-02-04 20:52 提 ...

  5. c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...

    想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...

  6. 【C语言-数据结构与算法】-哈夫曼压缩解压缩-终局-如何做一个自己独有的压缩软件

    哈夫曼压缩&解压缩 Ⅰ 前言 Ⅱ 需求分析&主函数带参的应用 A. 需求分析 B. 压缩部分 B. 解压缩部分 Ⅲ 哈夫曼压缩 A. 代码分析 B. 从文件中读取内容生成频度表 C. ...

  7. c语言表达式的算法,表达式求值--数据结构C语言算法实现

    这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...

  8. 蚁群算法求函数最值c语言,蚁群算法代码(求函数最值)

    蚁群算法简单应用 function [F]=F(x1,x2) %目标函数 F=-(x1.^2+2*x2.^2-0.3*cos(3*pi*x1)-0.4*cos(4*pi*x2)+0.7); End f ...

  9. 最长路径算法 c语言_「算法」求二叉树的最长同值路径

    给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: 输出: 2 示例 2: ...

最新文章

  1. 车牌识别算法_PC端车牌识别SDK融入好算法
  2. Sound Forge Pro 3使用教程
  3. mysql8.0导出带数据的库表_MySQL8.0数据库导出与备份
  4. ICLR 2017 | GAN Missing Modes 和 GAN
  5. vue clone html,Vue.js之slot深度复制详解
  6. Mysql 导入导出数据结构及数据
  7. 数据分析不能挣钱、不能给公司创造利润,那要你有什么用?
  8. Linux下安装redis5.0.7
  9. linux amd显卡调风扇转速,显卡风扇转速设置教程方法
  10. 【STMT】等价类划分法
  11. 【VirtualBox虚拟机总是提示“0x00000000指令引用的0x00000000内存,该内存不能为written“错误的解决方法】
  12. 7-6 福到了 (15分)
  13. 慕容垂:百万战骨风云里——激荡的鲜卑史略之一(转载)
  14. vb.net 简单登录界面(三层架构思想)
  15. 基于C++的带权无向图的实现 (三)- Prim最小生成树算法
  16. SpringBoot @Around环绕通知错误
  17. 计算机测试word总是零分,word excel做好后评分为什么是0分
  18. ps批量磨皮滤镜插件ArcSoft Portrait3+ 中文版瘦脸自动识别人脸win/mac支持2018
  19. MS17-010永恒之蓝-漏洞利用+修复方法
  20. 网络框架Volley

热门文章

  1. 关于Decision in process状态时间变化的解释
  2. latex中设置标题左对齐
  3. python剑指offer数组中出现次数超过一半的数字
  4. Linux —— 常见指令及其英文全称
  5. 小程序之支付(前端)
  6. vuejs+webpack环境搭建
  7. 如何从 Windows 虚拟机分离数据磁盘
  8. 赢在AI,人工智能技术体验
  9. 蚂蚁金服 SOFAArk 0.6.0 新特性介绍 | 模块化开发容器...
  10. redux-actions入门