遗传算法的应用及前景 遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,借鉴生物界适者生存、优胜劣汰遗
传机制的进化规律演化而来的随机化搜索最优解的方法。最初由美国Michigan大学J.Holland教授于1975年提出。基于染色体群的并行搜索,带有猜测性质的选择操作、交换操
作和突变操作。这种特殊的组合方式将遗传算法与其它搜索算法区别开来。 由于遗传算法的整体搜索策略和优化搜索方法在计算是不依赖于梯度信息或其它辅助知识,而只需
要影响搜索方向的目标函数和相应的适应度函数,所以遗传算法提供了一种求解复杂系统问题的通用框架,它不依赖于问题的具体领域,所以广泛应用于组合优化、机械设计、
数学问题、地质方面、信号处理、软件工程和人工生命等领域。
遗传算法的应用较为广泛,这里我举一个字符串的例子。有一个著名的无限猴子理论,如果无限猴子任意敲打打字机键,最终可能打印出莎士比亚全集,不过,即使可观
测宇宙中充满了猴子一直不停地打字,能够打出一部哈姆雷特的概率仍然少于10183,800分之一。
1.假设有2个字符串,一个假设为父系,另一个为母系
假设父系字符串为AAAA,母系字符串为BBBB,根据遗传规律,双亲各贡献50%的遗传基因,加入父系贡献前2个AA,母系贡献后2个BB,产生了后代为AABB,
2.定义基因类CDNA,模拟遗传现象
头文件
#pragma once
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
#include <time.h>
using namespace std;
class CDNA
{
public:
CDNA(void);
~CDNA(void);
public:
CDNA CrossOver(CDNA parent);//交叉生成后代
private:
char Gene[10]; //基因,字符从a-z
};
源文件
#include "DNA.h"
CDNA::CDNA(void)
{
//srand((unsigned)time(NULL));该函数不要放在这里
ZeroMemory(Gene,sizeof(Gene));
for(int i=0;i<9;i++)
{
Gene[i]=(char)(rand()%(122-97+1)+97); //注意随机数的生成,随机生成[a,b]之间的数(rand()%(b-a+1)+a), 再使用(char)强制转成字符,小写的字符ASCII从97-122
}
cout<<Gene<<endl;
}
CDNA::~CDNA(void)
{
}
CDNA CDNA::CrossOver(CDNA parent)
{
CDNA child;//这里临时构造了一个对象其实没用
for(int i=0;i<10;i++)
{
if(i<4)
child.Gene[i]=Gene[i]; //遗传父系的基因
else
child.Gene[i]=parent.Gene[i]; //遗传母系的基因
}
cout<<"\n"<<endl;
cout<<child.Gene<<endl;
return child;
}
3.主函数调用
#include "DNA.h"
int main()
{
srand((unsigned)time(NULL));//随机数发生器,可以每次产生同的字符串,注意不要放在DNA构造函数里面
CDNA p[10]; //随机生成10个对象,即10个双亲
p[7].CrossOver(p[2]);//随机挑选2,7为双亲传入,这里假设p[7]为父系,p[2]为母系,生成后代
return 0;
}
这是个很简单的模拟程序,模拟了极其简单的字符串遗传算法。