搜档网
当前位置:搜档网 › 遗传算法的C++代码实现教程

遗传算法的C++代码实现教程

遗传算法的C++代码实现教程
遗传算法的C++代码实现教程

此例程总共包含3个文件:main.c(主函数);GA.c(包含3个所用函数);GA.h(头文件),3个文件截图如下:

用visual c++或者visual stutio创建工程,然后将上述3个文件包含进工程,编译运行即可。亲测可行!!!

3个文件代码分别如下:

1、main.c:

#include

#include"GA.h"

using namespace std;

/*******************************************************************

GA demo

求函数y=x*sin(10*pai*x)+2.0的最大值

编码:浮点数,1位

初始群体数:50

变异概率:0.8

进化代数:100

取值范围:[0,4]

变异步长:0.004

注:因为是单数浮点数编码,所以未使用基因重组函数

**********************************************************************/

int main()

{

GenEngine genEngine(50,0.8,0.8,1,100,0,4);

genEngine.OnStartGenAlg();

getchar();

}

2、GA.c:

#include

#include

#include

#include

#include

#include"GA.h"

using namespace std;

//srand((unsigned) time(NULL));

double random()

{

double randNum;

randNum=rand()*1.0/RAND_MAX;

return randNum;

}

GenAlg::GenAlg()

{

}

void GenAlg::init(int popsize, double MutRate, double CrossRate, int GenLenght,double LeftPoint,double RightPoint)

{

popSize = popsize;

mutationRate = MutRate;

crossoverRate = CrossRate;

chromoLength = GenLenght;

totalFitness = 0;

generation = 0;

//fittestGenome = 0;

bestFitness = 0.0;

worstFitness = 99999999;

averageFitness = 0;

maxPerturbation=0.004;

leftPoint=LeftPoint;

rightPoint=RightPoint;

//清空种群容器,以初始化

vecPop.clear();

for (int i=0; i

{

//类的构造函数已经把适应性评分初始化为0

vecPop.push_back(Genome());

//把所有的基因编码初始化为函数区间内的随机数。

for (int j=0; j

{

vecPop[i].vecGenome.push_back(random() *

(rightPoint - leftPoint) + leftPoint);

}

}

}

void GenAlg::Reset()

{

totalFitness=0;

//bestFitness=0;

//worstFitness=9999;

averageFitness=0;

}

void GenAlg::CalculateBestWorstAvTot()

{

for (int i=0; i

{

//累计适应性分数.

totalFitness+= vecPop[i].fitness;

if(vecPop[i].fitness>=bestFitness)

{

bestFitness=vecPop[i].fitness;

fittestGenome=vecPop[i];

}

if(vecPop[i].fitness<=worstFitness)

worstFitness=vecPop[i].fitness;

}

averageFitness=totalFitness/popSize;

}

Genome GenAlg:: GetChromoRoulette()

{

//产生一个0到人口总适应性评分总和之间的随机数.

//中m_dTotalFitness记录了整个种群的适应性分数总和) double Slice = (random()) * totalFitness;

//这个基因将承载转盘所选出来的那个个体.

Genome TheChosenOne;

//累计适应性分数的和.

double FitnessSoFar = 0;

//遍历总人口里面的每一条染色体。

for (int i=0; i

{

//累计适应性分数.

FitnessSoFar += vecPop[i].fitness;

//如果累计分数大于随机数,就选择此时的基因.

if (FitnessSoFar >= Slice)

{

TheChosenOne = vecPop[i];

break;

}

}

//返回转盘选出来的个体基因

return TheChosenOne;

}

void GenAlg::Mutate(vector &chromo)

{

//遵循预定的突变概率,对基因进行突变

for (int i=0; i

{

//如果发生突变的话

if (random() < mutationRate)

{

//使该权值增加或者减少一个很小的随机数值

chromo[i] += ((random()-0.5) * maxPerturbation);

//限定范围

if(chromo[i] < leftPoint)

{

chromo[i] = rightPoint;

}

else if(chromo[i] > rightPoint)

{

chromo[i] = leftPoint;

}

//以上代码非基因变异的一般性代码只是用来保证基因编码的可行性。

}

}

}

//此函数产生新的一代,见证着整个进化的全过程.

//以父代种群的基因组容器作为参数传进去,该函数将往该容器里放入新一代的基因组(当然是经过了优胜劣汰的)

void GenAlg::Epoch(vector &vecNewPop)

{

//用类的成员变量来储存父代的基因组(在此之前m_vecPop储存的是不带估值的所有基因组)

vecPop = vecNewPop;

//初始化相关变量

Reset();

//为相关变量赋值

CalculateBestWorstAvTot();

//清空装载新种群的容器

vecNewPop.clear();

//产生新一代的所有基因组

while (vecNewPop.size() < popSize)

{

//转盘随机抽出两个基因

Genome mum = GetChromoRoulette();

Genome dad = GetChromoRoulette();

//创建两个子代基因组

vector baby1, baby2;

//先把他们分别设置成父方和母方的基因

baby1 = mum.vecGenome;

baby2 = dad.vecGenome;

//使子代基因发生基因突变

Mutate(baby1);

Mutate(baby2);

//把两个子代基因组放到新的基因组容器里面

vecNewPop.push_back( Genome(baby1, 0) );

vecNewPop.push_back( Genome(baby2, 0) );

}//子代产生完毕

//如果你设置的人口总数非单数的话,就会出现报错

if(vecNewPop.size() != popSize)

{

//MessageBox("你的人口数目不是单数!!!");

cout<<"error"<

return;

}

}

Genome GenAlg::GetBestFitness()

{

return fittestGenome;

}

double GenAlg::GetAverageFitness()

{

return averageFitness;

}

void GenEngine::report(const int&genNum)

{

cout<<"第"<

cout<<"最佳适应度:"<

cout<<"最佳适应度基因取值:"<

cout<<"平均适应度:"<

void GenEngine:: OnStartGenAlg()

{

//产生随机数

srand( (unsigned)time( NULL ) );

//初始化遗传算法引擎

genAlg.init(g_popsize, g_dMutationRate, g_dCrossoverRate, g_numGen,g_LeftPoint,g_RightPoint);

//清空种群容器

m_population.clear();

//种群容器装进经过随机初始化的种群

m_population = genAlg.vecPop;

vector input;

double output;

input.push_back(0);

for(int Generation = 0;Generation <= g_Generation;Generation++)

{

//里面是对每一条染色体进行操作

for(int i=0;i

{

input = m_population[i].vecGenome;

//为每一个个体做适应性评价,如之前说的,评价分数就是函数值。其

//Function函数的作用是输入自变量返回函数值,读者可以参考其代码。

output = (double)curve.function(input);

m_population[i].fitness = output;

}

//由父代种群进化出子代种群

genAlg.Epoch(m_population);

//if(genAlg.GetBestFitness().fitness>=bestFitness)

bestSearch=genAlg.GetBestFitness().vecGenome[0];

bestFitness=genAlg.GetBestFitness().fitness;

averageFitness=genAlg.GetAverageFitness();

//cout<

report(Generation+1);

}

//return bestSearch;

}

3、GA.h:

#include

using namespace std;

const double pai=3.1415926;

class Genome

{

public:

friend class GenAlg;

friend class GenEngine;

Genome():fitness(0){}

Genome(vector vec, double f): vecGenome(vec), fitness(f){} //类的带参数初始化参数。

private:

vector vecGenome; // dFitness用于存储对该基因的适应性评估。

double fitness; //类的无参数初始化参数。

};

//遗传算法

class GenAlg

{

public:

//这个容器将储存每一个个体的染色体

vector vecPop;

//人口(种群)数量

int popSize;

//每一条染色体的基因的总数目

int chromoLength;

//所有个体对应的适应性评分的总和

double totalFitness;

//在所有个体当中最适应的个体的适应性评分double bestFitness;

//所有个体的适应性评分的平均值

double averageFitness;

//在所有个体当中最不适应的个体的适应性评分double worstFitness;

//最适应的个体在m_vecPop容器里面的索引号Genome fittestGenome;

//基因突变的概率,一般介于0.05和0.3之间double mutationRate;

//基因交叉的概率一般设为0.7

double crossoverRate;

//代数的记数器

int generation;

//最大变异步长

double maxPerturbation;

double leftPoint;

double rightPoint;

//构造函数

GenAlg();

//初始化变量

void Reset();

//初始化函数

void init(int popsize, double MutRate, double CrossRate, int GenLenght,double LeftPoint,double RightPoint);

//计算TotalFitness, BestFitness, WorstFitness, AverageFitness等变量

void CalculateBestWorstAvTot();

//轮盘赌选择函数

Genome GetChromoRoulette();

//基因变异函数

void Mutate(vector &chromo);

//这函数产生新一代基因

void Epoch(vector &vecNewPop);

Genome GetBestFitness();

double GetAverageFitness();

};

class Curve

{

public:

double function(const vector& input)

{

double x=input[0];

double output;

output=x*sin(10*pai*x)+2.0;

return output;

}

private:

};

//遗传运算引擎

class GenEngine

{

public:

GenEngine(const int& popsize,const double& mutationRate,const double& crossoverRate,const int&numGen,const int&generation

,const double& leftPoint, const double& rightPoint):genAlg(),curve(),m_population() {

g_popsize=popsize;

g_dMutationRate=mutationRate;

g_dCrossoverRate=crossoverRate;

g_numGen=numGen;

g_Generation=generation;

g_LeftPoint=leftPoint;

g_RightPoint=rightPoint;

bestFitness=0;

bestSearch=0;

}

void OnStartGenAlg();

//报告每一代的运行情况

void report(const int&genNum);

private:

GenAlg genAlg;

Curve curve;

vector m_population;

int g_popsize;

double g_dMutationRate;

double g_dCrossoverRate;

int g_numGen;

int g_Generation;

double g_LeftPoint;

double g_RightPoint;

double bestFitness;

double bestSearch;

double averageFitness;

};

遗传算法的c语言程序

一需求分析 1.本程序演示的是用简单遗传算法随机一个种群,然后根据所给的交叉率,变异率,世代数计算最大适应度所在的代数 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的命令;相应的输入数据和运算结果显示在其后。3.测试数据 输入初始变量后用y=100*(x1*x1-x2)*(x1*x2-x2)+(1-x1)*(1-x1)其中-2.048<=x1,x2<=2.048作适应度函数求最大适应度即为函数的最大值 二概要设计 1.程序流程图 2.类型定义 int popsize; //种群大小 int maxgeneration; //最大世代数 double pc; //交叉率 double pm; //变异率 struct individual

{ char chrom[chromlength+1]; double value; double fitness; //适应度 }; int generation; //世代数 int best_index; int worst_index; struct individual bestindividual; //最佳个体 struct individual worstindividual; //最差个体 struct individual currentbest; struct individual population[POPSIZE]; 3.函数声明 void generateinitialpopulation(); void generatenextpopulation(); void evaluatepopulation(); long decodechromosome(char *,int,int); void calculateobjectvalue(); void calculatefitnessvalue(); void findbestandworstindividual(); void performevolution(); void selectoperator(); void crossoveroperator(); void mutationoperator(); void input(); void outputtextreport(); 4.程序的各函数的简单算法说明如下: (1).void generateinitialpopulation ()和void input ()初始化种群和遗传算法参数。 input() 函数输入种群大小,染色体长度,最大世代数,交叉率,变异率等参数。 (2)void calculateobjectvalue();计算适应度函数值。 根据给定的变量用适应度函数计算然后返回适度值。 (3)选择函数selectoperator() 在函数selectoperator()中首先用rand ()函数产生0~1间的选择算子,当适度累计值不为零时,比较各个体所占总的适应度百分比的累计和与选择算子,直到达到选择算子的值那个个体就被选出,即适应度为fi的个体以fi/∑fk的概率继续存在; 显然,个体适应度愈高,被选中的概率愈大。但是,适应度小的个体也有可能被选中,以便增加下一代群体的多样性。 (4)染色体交叉函数crossoveroperator() 这是遗传算法中的最重要的函数之一,它是对个体两个变量所合成的染色体进行交叉,而不是变量染色体的交叉,这要搞清楚。首先用rand ()函数产生随机概率,若小于交叉概率,则进行染色体交叉,同时交叉次数加1。这时又要用rand()函数随机产生一位交叉位,把染色

遗传算法经典MATLAB代码

遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。 对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法% % 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]% % 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈。% % 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其 中 b 是[0,1023] 中的一个二值数。% % % %--------------------------------------------------------------------------------------------------------------% %--------------------------------------------------------------------------------------------------------------% % 编程

%----------------------------------------------- % 初始化(编码) % 函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength 表示染色体的长度(二值数的长度), % 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元 为{0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 % 计算目标函数值 % 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: %产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制

遗传算法MATLAB完整代码(不用工具箱)

遗传算法解决简单问题 %主程序:用遗传算法求解y=200*exp(-0.05*x).*sin(x)在区间[-2,2]上的最大值clc; clear all; close all; global BitLength global boundsbegin global boundsend bounds=[-2,2]; precision=0.0001; boundsbegin=bounds(:,1); boundsend=bounds(:,2); %计算如果满足求解精度至少需要多长的染色体 BitLength=ceil(log2((boundsend-boundsbegin)'./precision)); popsize=50; %初始种群大小 Generationmax=12; %最大代数 pcrossover=0.90; %交配概率 pmutation=0.09; %变异概率 %产生初始种群 population=round(rand(popsize,BitLength)); %计算适应度,返回适应度Fitvalue和累计概率cumsump [Fitvalue,cumsump]=fitnessfun(population); Generation=1; while Generation

MATLAB课程遗传算法实验报告及源代码

硕士生考查课程考试试卷 考试科目: 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师(签名) 考试日期:年月日午时至时

《MATLAB 教程》试题: A 、利用MATLA B 设计遗传算法程序,寻找下图11个端点最短路径,其中没有连接端点表示没有路径。要求设计遗传算法对该问题求解。 a e h k B 、设计遗传算法求解f (x)极小值,具体表达式如下: 321231(,,)5.12 5.12,1,2,3i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: B 、设计遗传算法求解f (x)极小值,具体表达式如下: 321231(,,)5.12 5.12,1,2,3i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 一、问题分析(10分) 这是一个简单的三元函数求最小值的函数优化问题,可以利用遗传算法来指导性搜索最小值。实验要求必须以matlab 为工具,利用遗传算法对问题进行求解。 在本实验中,要求我们用M 函数自行设计遗传算法,通过遗传算法基本原理,选择、交叉、变异等操作进行指导性邻域搜索,得到最优解。 二、实验原理与数学模型(20分) (1)试验原理: 用遗传算法求解函数优化问题,遗传算法是模拟生物在自然环境下的遗传和进化过程而形成的一种自适应全局优化概率搜索方法。其采纳了自然进化模型,从代表问题可能潜在解集的一个种群开始,种群由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体;初始种群产生后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的解:在每一代,概据问题域中个体的适应度大小挑选个体;并借助遗传算子进行组合交叉和主客观变异,产生出代表新的解集的种群。这一过程循环执行,直到满足优化准则为止。最后,末代个体经解码,生成近似最优解。基于种群进化机制的遗传算法如同自然界进化一样,后生代种群比前生代更加适应于环境,通过逐代进化,逼近最优解。 遗传算法是一种现代智能算法,实际上它的功能十分强大,能够用于求解一些难以用常规数学手段进行求解的问题,尤其适用于求解多目标、多约束,且目标函数形式非常复杂的优化问题。但是遗传算法也有一些缺点,最为关键的一点,即没有任何理论能够证明遗传算法一定能够找到最优解,算法主要是根据概率论的思想来寻找最优解。因此,遗传算法所得到的解只是一个近似解,而不一定是最优解。 (2)数学模型 对于求解该问题遗传算法的构造过程: (1)确定决策变量和约束条件;

基于遗传算法的matlab源代码

function youhuafun D=code; N=50;%Tunable maxgen=50;%Tunable crossrate=0.5;%Tunable muterate=0.08;%Tunable generation=1; num=length(D); fatherrand=randint(num,N,3); score=zeros(maxgen,N); while generation<=maxgen ind=randperm(N-2)+2;%随机配对交叉 A=fatherrand(:,ind(1:(N-2)/2)); B=fatherrand(:,ind((N-2)/2+1:end)); %多点交叉 rnd=rand(num,(N-2)/2); ind=rnd tmp=A(ind); A(ind)=B(ind); B(ind)=tmp; %%两点交叉 %for kk=1:(N-2)/2 %rndtmp=randint(1,1,num)+1; %tmp=A(1:rndtmp,kk); %A(1:rndtmp,kk)=B(1:rndtmp,kk); %B(1:rndtmp,kk)=tmp; %end fatherrand=[fatherrand(:,1:2),A,B]; %变异 rnd=rand(num,N); ind=rnd[m,n]=size(ind); tmp=randint(m,n,2)+1; tmp(:,1:2)=0; fatherrand=tmp+fatherrand; fatherrand=mod(fatherrand,3); %fatherrand(ind)=tmp; %评价、选择 scoreN=scorefun(fatherrand,D);%求得N个个体的评价函数 score(generation,:)=scoreN; [scoreSort,scoreind]=sort(scoreN); sumscore=cumsum(scoreSort); sumscore=sumscore./sumscore(end); childind(1:2)=scoreind(end-1:end); for k=3:N tmprnd=rand; tmpind=tmprnd difind=[0,diff(t mpind)]; if~any(difind) difind(1)=1; end childind(k)=scoreind(logical(difind)); end fatherrand=fatherrand(:,childind); generation=generation+1; end %score maxV=max(score,[],2); minV=11*300-maxV; plot(minV,'*');title('各代的目标函数值'); F4=D(:,4); FF4=F4-fatherrand(:,1); FF4=max(FF4,1); D(:,5)=FF4; save DData D function D=code load youhua.mat %properties F2and F3 F1=A(:,1); F2=A(:,2); F3=A(:,3); if(max(F2)>1450)||(min(F2)<=900) error('DATA property F2exceed it''s range (900,1450]') end %get group property F1of data,according to F2value F4=zeros(size(F1)); for ite=11:-1:1 index=find(F2<=900+ite*50); F4(index)=ite; end D=[F1,F2,F3,F4]; function ScoreN=scorefun(fatherrand,D) F3=D(:,3); F4=D(:,4); N=size(fatherrand,2); FF4=F4*ones(1,N); FF4rnd=FF4-fatherrand; FF4rnd=max(FF4rnd,1); ScoreN=ones(1,N)*300*11; %这里有待优化

遗传算法Matlab程序

% f(x)=11*sin(6x)+7*cos(5x),0<=x<=2*pi; %%初始化参数 L=16;%编码为16位二进制数 N=32;%初始种群规模 M=48;%M个中间体,运用算子选择出M/2对母体,进行交叉;对M个中间体进行变异 T=100;%进化代数 Pc=0.8;%交叉概率 Pm=0.03;%%变异概率 %%将十进制编码成16位的二进制,再将16位的二进制转成格雷码 for i=1:1:N x1(1,i)= rand()*2*pi; x2(1,i)= uint16(x1(1,i)/(2*pi)*65535); grayCode(i,:)=num2gray(x2(1,i),L); end %% 开始遗传算子操作 for t=1:1:T y1=11*sin(6*x1)+7*cos(5*x1); for i=1:1:M/2 [a,b]=min(y1);%找到y1中的最小值a,及其对应的编号b grayCodeNew(i,:)=grayCode(b,:);%将找到的最小数放到grayCodeNew中grayCodeNew(i+M/2,:)=grayCode(b,:);%与上面相同就可以有M/2对格雷码可以作为母体y1(1,b)=inf;%用来排除已找到的最小值 end for i=1:1:M/2 p=unidrnd(L);%生成一个大于零小于L的数,用于下面进行交叉的位置if rand()

一个简单实用的遗传算法c程序完整版

一个简单实用的遗传算 法c程序 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

一个简单实用的遗传算法c程序(转载) 2009-07-28 23:09:03 阅读418 评论0 字号:大中小 这是一个非常简单的遗传算法源代码,是由Denis Cormier (North Carolina State University)开发的,Sita (University of North Carolina at Charlotte)修正。代码保证尽可能少,实际上也不必查错。对一特定的应用修正此代码,用户只需改变常数的定义并且定义“评价函数”即可。注意代码的设计是求最大值,其中的目标函数只能取正值;且函数值和个体的适应值之间没有区别。该系统使用比率选择、精华模型、单点杂交和均匀变异。如果用Gaussian变异替换均匀变异,可能得到更好的效果。代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。读者可以从,目录 coe/evol中的文件中获得。要求输入的文件应该命名为‘’;系统产生的输出文件为‘’。输入的文件由几行组成:数目对应于变量数。且每一行提供次序——对应于变量的上下界。如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等。 /**************************************************************************/ /* This is a simple genetic algorithm implementation where the */ /* evaluation function takes positive values only and the */ /* fitness of an individual is the same as the value of the */ /* objective function */ /**************************************************************************/ #include <> #include <> #include <> /* Change any of these parameters to match your needs */ #define POPSIZE 50 /* population size */

遗传算法经典MATLAB代码资料讲解

遗传算法经典学习Matlab代码 遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。 对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法% % 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]% % 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01。% % 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其 中 b 是[0,1023] 中的一个二值数。% % % %--------------------------------------------------------------------------------------------------------------% %--------------------------------------------------------------------------------------------------------------% % 编程 %----------------------------------------------- % 2.1初始化(编码) % initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),

% 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元 为{0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 % 2.2 计算目标函数值 % 2.2.1 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: decodebinary.m %产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制 function pop2=decodebinary(pop) [px,py]=size(pop); %求pop行和列数 for i=1:py pop1(:,i)=2.^(py-i).*pop(:,i); end pop2=sum(pop1,2); %求pop1的每行之和 % 2.2.2 将二进制编码转化为十进制数(2) % decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置

遗传算法C语言源代码(一元函数和二元函数)

C语言遗传算法代码 以下为遗传算法的源代码,计算一元代函数的代码和二元函数的代码以+++++++++++++++++++++++++++++++++++++为分割线分割开来,请自行选择适合的代码,使用时请略看完代码的注释,在需要更改的地方更改为自己需要的代码。 +++++++++++++++++++++++++++++++一元函数代码++++++++++++++++++++++++++++ #include #include #include #include #define POPSIZE 1000 #define maximization 1 #define minimization 2 #define cmax 100 #define cmin 0 #define length1 20 #define chromlength length1 //染色体长度 //注意,你是求最大值还是求最小值 int functionmode=minimization; //变量的上下限的修改开始 float min_x1=-2;//变量的下界 float max_x1=-1;//变量的上界 //变量的上下限的修改结束 int popsize; //种群大小 int maxgeneration; //最大世代数 double pc; //交叉率 double pm; //变异率 struct individual { char chrom[chromlength+1]; double value; double fitness; //适应度 }; int generation; //世代数 int best_index; int worst_index;

遗传算法的C语言程序案例

遗传算法的C语言程序案例 一、说明 1.本程序演示的是用简单遗传算法随机一个种群,然后根据所给的交叉率,变异率,世代数计算最大适应度所在的代数 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的命令;相应的输入数据和运算结果显示在其后。3.举个例子,输入初始变量后,用y= (x1*x1)+(x2*x2),其中-2.048<=x1,x2<=2.048作适应度函数求最大适应度即为函数的最大值 4.程序流程图

5.类型定义 int popsize; //种群大小 int maxgeneration; //最大世代数 double pc; //交叉率 double pm; //变异率 struct individual { char chrom[chromlength+1]; double value; double fitness; //适应度 }; int generation; //世代数 int best_index; int worst_index; struct individual bestindividual; //最佳个体 struct individual worstindividual; //最差个体 struct individual currentbest; struct individual population[POPSIZE]; 3.函数声明 void generateinitialpopulation(); void generatenextpopulation(); void evaluatepopulation(); long decodechromosome(char *,int,int); void calculateobjectvalue(); void calculatefitnessvalue(); void findbestandworstindividual(); void performevolution(); void selectoperator(); void crossoveroperator(); void mutationoperator(); void input(); void outputtextreport(); 6.程序的各函数的简单算法说明如下: (1).void generateinitialpopulation ()和void input ()初始化种群和遗传算法参数。 input() 函数输入种群大小,染色体长度,最大世代数,交叉率,变异率等参数。 (2)void calculateobjectvalue();计算适应度函数值。 根据给定的变量用适应度函数计算然后返回适度值。 (3)选择函数selectoperator() 在函数selectoperator()中首先用rand ()函数产生0~1间的选择算子,当适度累计值不为零时,比较各个体所占总的适应度百分比的累计和与选择算子,直到达到选择算子的值那个个

遗传算法的MATLAB程序实例

遗传算法的程序实例 如求下列函数的最大值 f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] 一、初始化(编码) initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度), 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 代码: %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为 {0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 二、计算目标函数值 1、将二进制数转化为十进制数(1) 代码: %Name: decodebinary.m %产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制 function pop2=decodebinary(pop) [px,py]=size(pop); %求pop行和例数 for i=1:py pop1(:,i)=2.^(py-1).*pop(:,i); py=py-1; end pop2=sum(pop1,2); %求pop1的每行之和 2、将二进制编码转化为十进制数(2) decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置。(对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。本例为1),参数1ength表示所截取的长度(本例为10)。 代码: %Name: decodechrom.m %将二进制编码转换成十进制 function pop2=decodechrom(pop,spoint,length) pop1=pop(:,spoint:spoint+length-1); pop2=decodebinary(pop1); 3、计算目标函数值 calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

基于遗传算法的BP神经网络MATLAB代码

用遗传算法优化BP神经网络的Matlab编程实例(转) 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。 程序一:GA训练BP权值的主函数 function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络 %-------------------------------------------------------------------------- %数据归一化预处理 nntwarn off XX=[1:19;2:20;3:21;4:22]'; YY=[1:4]; XX=premnmx(XX); YY=premnmx(YY); YY %创建网络 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'tra inlm'); %下面使用遗传算法对网络进行优化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隐含层节点数 S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 aa=ones(S,1)*[-1,1]; popu=50;%种群规模 save data2 XX YY % 是将 xx,yy 二个变数的数值存入 data2 这个MAT-file,initPpp=initializega(popu,aa,'gabpEval');%初始化种群 gen=100;%遗传代数

人工智能之遗传算法论文含源代码

30维线性方程求解 摘要:非线性方程组的求解是数值计算领域中最困难的问题,大多数的数值求解算法例如牛顿法的收敛性和性能特征在很大程度上依赖于初始点。但是对于很多高维的非线性方程组,选择好的初始点是一件非常困难的事情。本文采用了遗传算法的思想,提出了一种用于求解非线性方程组的混合遗传算法。该混合算法充分发挥了遗传算法的群体搜索和全局收敛性。选择了几个典型非线性方程组,考察它们的最适宜解。 关键词:非线性方程组;混合遗传算法;优化 1. 引言遗传算法是一种通用搜索算法,它基于自然选择机制和自然遗传规律来模拟自然界的进化过程,从而演化出解决问题的最优方法。它将适者生存、结构化但同时又是 随机的信息交换以及算法设计人的创造才能结合起来,形成一种独特的搜索算法,把一些解决方案用一定的方式来表示,放在一起成为群体。每一个方案的优劣程度即为适应性,根据自然界进化“优胜劣汰”的原则,逐步产生它们的后代,使后代具有更强的适应性,这样不断演化下去,就能得到更优解决方案。 随着现代自然科学和技术的发展,以及新学科、新领域的出现,非线性科学在工农业、经济政治、科学研究方面逐渐占有极其重要的位置。在理论研究和应用实践中,几乎绝大多数的问题都最终能化为方程或方程组,或者说,都离不开方程和方程组的求解。因此,在非线性问题中尤以非线性方程和非线性方程组的求解最为基本和重要。传统的解决方法,如简单迭代法、牛顿法、割线法、延拓法、搜索法、梯度法、共轭方向法、变尺度法,无论从算法的选择还是算法本身的构造都与所要解决的问题的特性有很大的关系。很多情况下,算法中算子的构造及其有效性成为我们解决问题的巨大障碍。而遗传算法无需过多地考虑问题的具体形式,因为它是一种灵活的自适应算法,尤其在一些非线性方程组没有精确解的时候,遗传算法显得更为有效。而且,遗传算法是一种高度并行的算法,且算法结构简单,非常便于在计算机上实现。本文所研究的正是将遗传算法应用于求解非线性方程组的问题。 2. 遗传算法解非线性方程组为了直观地观察用遗传算法求解非线性方程组的效果,我们这里用代数非线性方程组作为求解的对象问题描述:非线性方程组指的是有n 个变量(为了简化讨论,这里只讨论实变量方程组)的方程组 中含有非线性方程。其求解是指在其定义域内找出一组数能满足方程组中的每 个方程。这里,我们将方程组转化为一个函数则求解方程组就转化为求一组值使得成立。即求使函数取得最小值0 的一组数,于是方程组求解问题就转变为函数优化问题 3. 遗传算子 遗传算子设计包括交叉算子、变异算子和选择算子的设计。

三个遗传算法matlab程序实例

遗传算法程序(一): 说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择, 均匀交叉,变异操作,而且还引入了倒位操作! function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation) % Finds a maximum of a function of several variables. % fmaxga solves problems of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最优的群体即为最优的染色体群 % Trace - 最佳染色体所对应的目标函数值 % FUN - 目标函数 % LB - 自变量下限 % UB - 自变量上限 % eranum - 种群的代数,取100--1000(默认200) % popsize - 每一代种群的规模;此可取50--200(默认100) % pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8) % pmutation - 初始变异概率,一般取0.05-0.2之间较好(默认0.1) % pInversion - 倒位概率,一般取0.05-0.3之间较好(默认0.2) % options - 1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编 %码,option(2)设定求解精度(默认1e-4) % % ------------------------------------------------------------------------ T1=clock; if nargin<3, error('FMAXGA requires at least three input arguments'); end if nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==7, pInversion=0.15;options=[0 1e-4];end if find((LB-UB)>0) error('数据输入错误,请重新输入(LB

遗传算法求函数极大值(matlab实现)

遗传算法求函数最大值(matlab实现) 一、题目: 寻找f(x)=x2,,当x在0~31区间的最大值。 二、源程序: %遗传算法求解函数最大值 %本程序用到了英国谢菲尔德大学(Sheffield)开发的工具箱GATBX,该工具箱比matlab自带的GATOOL使用更加灵活,但在编写程序方面稍微复杂一些 Close all; Clear all; figure(1); fplot('variable*variable',[0,31]); %画出函数曲线 %以下定义遗传算法参数 GTSM=40; %定义个体数目 ZDYCDS=20; %定义最大遗传代数 EJZWS=5; %定义变量的二进制位数 DG=0.9; %定义代沟 trace=zeros(2, ZDYCDS); %最优结果的初始值

FieldD=[5;-1;2;1;0;1;1]; %定义区域描述器的各个参数%以下为遗传算法基本操作部分,包括创建初始种群、复制、交叉和变异 Chrom=crtbp(GTSM, EJZWS); %创建初始种群,即生成给定 规模的二进制种群和结构gen=0; %定义代数计数器初始值variable=bs2rv(Chrom, FieldD); %对生成的初始种群进行十进制转换 ObjV=variable*variable; %计算目标函数值f(x)=x2 while gen

遗传算法案例分析及源代码

一.问题描述: 在某一区域内有n 个客户,拟建一个物流中心,已知客户j 地址坐标为),(i i y x 。确定物流中心的地址坐标),(y x ,使得该物流中心到几个客户之间的距离最短。 假设:简单的用两点之间的距离代替运输距离。 目标函数: 22)()(min i i y Y x X z -+-= 约束条件: } 8,7,6,5,4,3,2,1,0{}8,7,6,5,4,3,2,1,0{X ∈∈Y 假设某一区域内有 5 个客户,其位置坐标如下表所示, 客户坐标及相关需求量 客户 X (km) Y(km) 1 1 5 2 2 8 3 5 1 4 7 6 5 8 3 (1)变量: C :是一个1*6数组,每个数组里面是一个6位二进制数,它是遗传算法中的染色体。 new_c:每一轮的新变量c 。 first_c:初始群体矩阵。 sur_value :个体适应值的概率值,为0-1之间的数,所有概率值和为1。 survived :经过选择运算后产生的个体基因型组合。 intersect_c :经过交叉运算后产生的个体基因型组合。 mutation_c :经过变异运算后产生的个体基因型组合。 f :最后计算得到的最大值 (2)程序里面的方程 function out = value_function( ci ):价值函数(自适应度函数)。 function [ sur_value ] = calc_value( c ):计算群体中每一个个体的适应度的值 function survived = surviver( sur_value ):利用概率选择函数 function [ intersect_c ] = intersect( new_c ):交叉运算 function [ mutation_c ,mutation_value] = mutation( intersect_c ):变异运算 (1)遗传算法主程序 %遗传算法的主程序

相关主题