(背包问题):背包只能容得下一定重量b的物品,物品有m种,每种物品有自己的重量w(i)和价值v(i),从这些物品中选择装入背包,是背包不超过重量b,但价值又要最大。
上面为单目标的0/1规划问题,也就是说只考虑物体的重量不考虑物体的体积,形状等问题,一般而言,利用动态规划可以很好地解决背包问题,但是如果物体过多,使用动态规划将浪费很大的资源.
遗传算法作经典的人工智能算法,可以很好的解决当物体较多的0/1规划问题。
(遗传算法概述):
遗传算法使用的就是生物学中适者生存的法则。但是和生物中一些专业人术语有些区别:
种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群。
个体:组成种群的单个生物。
基因 ( Gene ) :一个遗传因子。
染色体 ( Chromosome ) :包含一组的基因。
生存竞争,适者生存:对环境适应度高的、牛B的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少。
遗传与变异:新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。
具体流程如下:
(注:图片来之百度)
(具体背包问题概述):
32件物体,属性重量,体积,价值(普通的0/1规划只考虑重量或者体积)。背包最大体积:75,最大重量:80,把物体装入背包,保证价值的最大化。
//主函数入口
#include"gene.h"
#include <string.h>
#include <iostream>
using namespace std;
int main(int argc, char*argv[])
{
Gene *gene = new Gene; //实例化类,返回指针
int gen = 0;
int oldMaxPop, k;
double oldMax;
srand((unsigned)time(NULL));
gene->initPop();
memcpy(&gene->newPop, &gene->oldPop, POP_SIZE * sizeof(struct Gene::population));
gene->statistics(gene->newPop); //计算种群的最大适应度和最小适应度以及适应度的下表号。
gene->report(gene->newPop, gen);
while (gen < CENERAION_NUM)
{
gen += 1;
if (gen % 100 == 0) {
srand((unsigned)time(NULL));
}
oldMax = gene->maxFitness; //oldmax为种群中最大适应度
oldMaxPop = gene->maxPop; //oldMaxPop指种群中最大适应度的个体
gene->generation();
gene->statistics(gene->newPop);
if (gene->maxFitness < oldMax) {
for (k = 0; k < CHROM_SIZE; k++) {
gene->newPop[gene->minPop].chrom[k] = gene->oldPop[oldMaxPop].chrom[k];
}
gene->newPop[gene->minPop].fitness = gene->oldPop[oldMaxPop].fitness;
gene->newPop[gene->minPop].weight = gene->oldPop[oldMaxPop].weight;
gene->newPop[gene->minPop].volume = gene->oldPop[oldMaxPop].volume;
gene->newPop[gene->minPop].parent1 = gene->oldPop[oldMaxPop].parent1;
gene->newPop[gene->minPop].parent2 = gene->oldPop[oldMaxPop].parent2;
gene->newPop[gene->minPop].cross = gene->oldPop[oldMaxPop].cross;
gene->statistics(gene->newPop);
}
else if(gene->maxFitness > oldMax){
gene->report(gene->newPop, gen);
}
memcpy(&gene->oldPop, &gene->newPop, POP_SIZE * sizeof(struct Gene::population));
}
delete[] gene; //销毁对象占用空间
system("pause");
return 0;
}
/********
头文件的定义
********/
#pragma once
#ifndef GENE_H
#define GENE_H
#include <stdio.h>
#include <math.h>
#include <s