当前位置:文档之家› 遗传算法作业

遗传算法作业

遗传算法作业
遗传算法作业

题目:

利用遗传算法求shaffer ’s F6函数()()222222001.015.0sin 5.0),(y x y x y x f +?+-+-

=的

最优解()100,100<<-y x 。

要求给出源代码,求出最优解和最优值,给出进化代数、种群规模、交叉率及变异率。 1 求解思路

在程序中将种群规模、进化代数、交叉率及变异率分别取为不同数值,发现计算结果将收敛到不同的极大点。该函数的根据下,x 和y 的取值可以得到无穷多个极大点。

首先需要建立一个文件在里面写上两个变量的最大值及最小值。即:

-100 100

-100 100

在程序中取种群规模为50,进化代数为1500,交叉率为0.8,变异率为0.15,该函数的最优解为0=x ,0=y ,对应的最优值为1。实际上,对应于这个最优解,种群规模、进化代数、交叉率及变异率可以取多组不同数值。如:取种群规模为500,进化代数为1000,交叉率为0.8,变异率为0.15时仍可以得到这个最优解。

2程序的源代码

#include

#include

#include

#define POPSIZE 50 /* 种群规模*/

#define MAXGENS 2000 /* 最大进化代数*/

#define NV ARS 2 /*变量数*/

#define PXOVER 0.8 /* 交叉率*/

#define PMUTATION 0.15 /* 变异率*/

#define TRUE 1

#define FALSE 0

int generation; /* 当前代*/

int cur_best; /* 最佳个体*/

FILE *galog; /* 输出文件*/

struct genotype /* genotype (GT), a member of the population */

{

double gene[NV ARS]; /* 基因数组*/

double fitness; /* 适应度*/

double upper[NV ARS]; /* 变量取值上限*/

double lower[NV ARS]; /*变量取值上限*/

double rfitness; /* 相对适应度*/

double cfitness; /* 累积适应度*/

};

struct genotype population[POPSIZE+1]; /* population */

struct genotype newpopulation[POPSIZE+1]; /* new population;

/* replaces the */

/* old generation */

/* Declaration of procedures used by this genetic algorithm */

void initialize(void);

double randval(double, double);

void evaluate(void);

void keep_the_best(void);

void elitist(void);

void select(void);

void crossover(void);

void Xover(int,int);

void swap(double *, double *);

void mutate(void);

void report(void);

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

/* Initialization function: Initializes the values of genes */

/* within the variables bounds. It also initializes (to zero) */

/* all fitness values for each member of the population. It */

/* reads upper and lower bounds of each variable from the */

/* input file `gadata.txt'. It randomly generates values */

/* between these bounds for each gene of each genotype in the */

/* population. The format of the input file `gadata.txt' is */

/* var1_lower_bound var1_upper bound */

/* var2_lower_bound var2_upper bound ... */

/***************************************************************/ void initialize(void)

{

FILE *infile;

int i, j;

double lbound, ubound;

if ((infile = fopen("gadata.txt","r"))==NULL)

{

fprintf(galog,"\nCannot open input file!\n");

exit(1);

}

/* initialize variables within the bounds */

for (i = 0; i < NV ARS; i++)

{

fscanf(infile, "%lf",&lbound);

fscanf(infile, "%lf",&ubound);

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

{

population[j].fitness = 0;

population[j].rfitness = 0;

population[j].cfitness = 0;

population[j].lower[i] = lbound;

population[j].upper[i]= ubound;

population[j].gene[i] = randval(population[j].lower[i],

population[j].upper[i]);

}

}

fclose(infile);

}

/***********************************************************/ /* Random value generator: Generates a value within bounds */

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

double randval(double low, double high)

{

double val;

val = ((double)(rand()%1000)/1000.0)*(high - low) + low;

return(val);

}

/*************************************************************/ /* Evaluation function: This takes a user defined function. */

/* Each time this is changed, the code has to be recompiled. */

/* The current function is: ()()222222001.015

.0sin 5.0),(y x y x y x f +?+-+-= */

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

void evaluate(void)

{

int mem;

int i;

double x[NV ARS+1];

for (mem = 0; mem < POPSIZE; mem++)

{

for (i = 0; i < NV ARS; i++)

x[i+1] = population[mem].gene[i];

population[mem].fitness=-(pow(sin(sqrt(x[1]*x[1]+x[2]*x[2])),2) -0.5)/pow((1+0.001*(x[1]*x[1]+ x[2]*x[2])),2)+ 0.5;

}

}

/***************************************************************/ /* Keep_the_best function: This function keeps track of the */

/* best member of the population. Note that the last entry in */

/* the array Population holds a copy of the best individual */

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

void keep_the_best()

{

int mem;

int i;

cur_best = 0; /* stores the index of the best individual */

for (mem = 0; mem < POPSIZE; mem++)

{

if (population[mem].fitness > population[POPSIZE].fitness)

{

cur_best = mem;

population[POPSIZE].fitness = population[mem].fitness;

}

}

/* once the best member in the population is found, copy the genes */

for (i = 0; i < NV ARS; i++)

population[POPSIZE].gene[i] = population[cur_best].gene[i];

}

/****************************************************************/ /* Elitist function: The best member of the previous generation */

/* is stored as the last in the array. If the best member of */

/* the current generation is worse then the best member of the */

/* previous generation, the latter one would replace the worst */

/* member of the current population */

/****************************************************************/ void elitist()

{

int i;

double best, worst; /* best and worst fitness values */

int best_mem, worst_mem; /* indexes of the best and worst member */

best = population[0].fitness;

worst = population[0].fitness;

for (i = 0; i < POPSIZE - 1; ++i)

{

if(population[i].fitness > population[i+1].fitness)

{

if (population[i].fitness >= best)

{

best = population[i].fitness;

best_mem = i;

}

if (population[i+1].fitness <= worst)

{

worst = population[i+1].fitness;

worst_mem = i + 1;

}

}

else

{

if (population[i].fitness <= worst)

{

worst = population[i].fitness;

worst_mem = i;

}

if (population[i+1].fitness >= best)

{

best = population[i+1].fitness;

best_mem = i + 1;

}

}

}

/* if best individual from the new population is better than */

/* the best individual from the previous population, then */

/* copy the best from the new population; else replace the */

/* worst individual from the current population with the */

/* best one from the previous generation */

if (best >= population[POPSIZE].fitness)

{

for (i = 0; i < NV ARS; i++)

population[POPSIZE].gene[i] = population[best_mem].gene[i];

population[POPSIZE].fitness = population[best_mem].fitness;

}

else

{

for (i = 0; i < NV ARS; i++)

population[worst_mem].gene[i] = population[POPSIZE].gene[i];

population[worst_mem].fitness = population[POPSIZE].fitness;

}

}

/**************************************************************/ /* Selection function: Standard proportional selection for */

/* maximization problems incorporating elitist model - makes */

/* sure that the best member survives */

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

void select(void)

{

int mem, i, j, k;

double sum = 0;

double p;

/* find total fitness of the population */

for (mem = 0; mem < POPSIZE; mem++)

{

sum += population[mem].fitness;

}

/* calculate relative fitness */

for (mem = 0; mem < POPSIZE; mem++)

{

population[mem].rfitness = population[mem].fitness/sum;

}

population[0].cfitness = population[0].rfitness;

/* calculate cumulative fitness */

for (mem = 1; mem < POPSIZE; mem++)

{

population[mem].cfitness = population[mem-1].cfitness +

population[mem].rfitness;

}

/* finally select survivors using cumulative fitness. */

for (i = 0; i < POPSIZE; i++)

{

p = rand()%1000/1000.0;

if (p < population[0].cfitness)

newpopulation[i] = population[0];

else

{

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

if (p >= population[j].cfitness &&

p

newpopulation[i] = population[j+1];

}

}

/* once a new population is created, copy it back */

for (i = 0; i < POPSIZE; i++)

population[i] = newpopulation[i];

}

/***************************************************************/ /* Crossover selection: selects two parents that take part in */

/* the crossover. Implements a single point crossover */

/***************************************************************/ void crossover(void)

{

int i, mem, one;

int first = 0; /* count of the number of members chosen */

double x;

for (mem = 0; mem < POPSIZE; ++mem)

{

x = rand()%1000/1000.0;

if (x < PXOVER)

{

++first;

if (first % 2 == 0)

Xover(one, mem);

else

one = mem;

}

}

}

/**************************************************************/ /* Crossover: performs crossover of the two selected parents. */

/**************************************************************/ void Xover(int one, int two)

{

int i;

int point; /* crossover point */

/* select crossover point */

if(NV ARS > 1)

{

if(NV ARS == 2)

point = 1;

else

point = (rand() % (NV ARS - 1)) + 1;

for (i = 0; i < point; i++)

swap(&population[one].gene[i], &population[two].gene[i]);

}

}

/*************************************************************/ /* Swap: A swap procedure that helps in swapping 2 variables */

/*************************************************************/ void swap(double *x, double *y)

{

double temp;

temp = *x;

*x = *y;

*y = temp;

}

/**************************************************************/ /* Mutation: Random uniform mutation. A variable selected for */

/* mutation is replaced by a random value between lower and */

/* upper bounds of this variable */

/**************************************************************/ void mutate(void)

{

int i, j;

double lbound, hbound;

double x;

for (i = 0; i < POPSIZE; i++)

for (j = 0; j < NV ARS; j++)

{

x = rand()%1000/1000.0;

if (x < PMUTATION)

{

/* find the bounds on the variable to be mutated */

lbound = population[i].lower[j];

hbound = population[i].upper[j];

population[i].gene[j] = randval(lbound, hbound);

}

}

}

/***************************************************************/ /* Report function: Reports progress of the simulation. Data */

/* dumped into the output file are separated by commas */

/***************************************************************/ void report(void)

{

int i;

double best_val; /* best population fitness */

double avg; /* avg population fitness */

double stddev; /* std. deviation of population fitness */ double sum_square; /* sum of square for std. calc */

double square_sum; /* square of sum for std. calc */

double sum; /* total population fitness */

sum = 0.0;

sum_square = 0.0;

for (i = 0; i < POPSIZE; i++)

{

sum += population[i].fitness;

sum_square += population[i].fitness * population[i].fitness;

}

avg = sum/(double)POPSIZE;

square_sum = avg * avg * POPSIZE;

stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));

best_val = population[POPSIZE].fitness;

fprintf(galog, "\n%5d, %6.6f, %6.6f, %6.6f \n\n", generation,

best_val, avg, stddev);

}

void main(void)

{

int i;

if ((galog = fopen("galog.txt","w"))==NULL)

{

exit(1);

}

generation = 0;

fprintf(galog, "\n generation best average standard \n");

fprintf(galog, " number value fitness deviation \n");

initialize();

evaluate();

keep_the_best();

while(generation

{

generation++;

select();

crossover();

mutate();

report();

evaluate();

elitist();

}

fprintf(galog,"\n\n Simulation completed\n");

fprintf(galog,"\n Best member: \n");

for (i = 0; i < NV ARS; i++)

{

fprintf (galog,"\n var(%d) = %3.3f",i,population[POPSIZE].gene[i]);

}

fprintf(galog,"\n\n Best fitness = %3.3f",population[POPSIZE].fitness); fclose(galog);

printf("Success\n");

}

遗传算法

基于新的混合遗传算法的订单生产工序顺序相关的流水车 间调度问题研究 A novel hybrid genetic algorithm to solve the make-to-order sequence-dependent flow-shop scheduling problem Mohammad Mirabi ?S. M. T. Fatemi Ghomi ?F. Jolai 2013年5月29号收到该文献,2014年3月18号录取,2014年4月9日出版.作者(2014).这篇文章在开放存取的https://www.doczj.com/doc/7813580702.html, 网站发表 摘要流水车间调度问题(FSP)用于处理m台机器n个工序的流水作业。尽管FSP是典 型的NP-hard问题,依然没有有效的算法以找到这个问题的最优解。为了减少库存,延迟和安装成本,在工作时间一定,序列相关的每台机器上解决流水车间调度排序问题,在这提出了一种有三个遗传算子的新型混合遗传算法(HGA)。该算法应用一种改进的方法来生成初始种群,并使用一种应用迭代交换过程改进初始解的改进启发式算法。我们认为订单式生产方式,工序间隔时间是基于最大安装成本的禁忌搜索算法的解。此外,与最近开发的启发式算法通过计算实验结果比较表明,该算法在解\的精度和效率方面表现出非常强的竞争力。 关键词:混合遗传算法流水作业调度序列相关 引言 流车间调度问题(FSP)作为在制造业研究的主要问题已经近七十年。在一个有M台机器的流水作业车间中有m个工位,每个工序又有一台或几台机器。此外,有n个工件在m个工位上依次加工。在经典的流水作业问题里,每个工位都有一台机器,这一领域的研究吸引了最多的人次。FSP的两个主要子问题是序列独立时间设置(SIST)和顺序相关时间设置(SDST)。SDST流水作业问题更具有现实意义,但是吸引的注意力却少得多,特别是2000年以前(Allahverdi等,2008) 在流水车间调度问题的目标是找到一个序列的机器加工的作业,以便一个给定的标准进行了优化。这里有n个工件在每台机器上操作的可能的顺序,以及(N!)*M个的可能处理顺序。流水作业调度的研究通常只参加置换序列,其中操作的处理顺序是所有机器。在这里,我们也采用这种限制。 最小化所有最大完工时间作业(成为完工期并通过的Cmax表示)是公知的,也是在文献M. Mirabi (&) Group of Industrial Engineering, Ayatollah Haeri University of Meybod, P.O. Box 89619-55133, Meybod, Iran e-mail: M.Mirabi@https://www.doczj.com/doc/7813580702.html, S. M. T. Fatemi Ghomi Department of Industrial Engineering, Amirkabir University of Technology, P.O. Box 15916-34311, Tehran, Iran e-mail: Fatemi@aut.ac.ir F. Jolai Department of Industrial Engineering, College of Engineering, University of Tehran, P.O. Box 14395-515, Tehran, Iran

遗传算法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

Pareto最优概念的多目标进化算法综述

Pareto最优概念的多目标进化算法综述 作者:唐云岚, 赵青松, 高妍方, 陈英武, TANG Yun-lan, ZHAO Qing-song, GAO Yan-fang , CHEN Ying-wu 作者单位:唐云岚,TANG Yun-lan(国防科学技术大学信息系统与管理学院 长沙 410073;武警工程学院通信工程系,西安710086), 赵青松,高妍方,陈英武,ZHAO Qing-song,GAO Yan-fang,CHEN Ying-wu(国防科学技术大学信息系统与管理学院 长沙 410073) 刊名: 计算机科学 英文刊名:COMPUTER SCIENCE 年,卷(期):2008,35(10) 被引用次数:1次 参考文献(23条) 1.Zitzler E;Thiele L Multiobjective Evolutionary Algorithms:A Comparative Case Study and the Strength Pareto Approach[外文期刊] 1999(04) 2.Srinivas N;Deb K Muhiobjective Optimization Using Nondomi-nated Sorting in Genetic Algorithms[外文期刊] 1995(03) 3.Hans A E Multicriteria optimization for highly accurate syste-ms 1988 4.Chankong V;Haimes Y Y Multiobjective decision making theo-ry and methodology 1983 5.Knowles J;Come D查看详情 1999 6.Horn J;Nafpliotis N查看详情 1994 7.Fonseca C M;Fleming P J Genetic Algorithm 1993 8.Richardson J T;Palmer M R;Liepins G查看详情[外文期刊] 1989 9.Schaffer J D Some experiments in machine learning using vector evaluated genetic algorithms 1984 10.Rosenberg R S Simulation of Genetic Populations with Bio-chemical Properties 1967 11.Zitzler E Evolutionary algorithms for multiobjeetive optimiza-tion:Methods and applications 1999 12.Deb K Muhiobjeetive Optimization using Evolutionary Algo-rithms 2001 https://www.doczj.com/doc/7813580702.html,umanns M;Thiele L;Deb K Combining Convergence and Diversity in Evolutionary Multi-Objective Optimization[外文期刊] 2002(03) 14.Mann J W;Smith G D A Comparison of Heuristics for Tele-communications Traffic Routing 1996 15.Deb K Genetic algorithms in multimodal function optimization 1989 16.Srinivas N Multiobjective optimization using nondominated sor-ting in genetic algorithms 1994 17.Goldberg D E;Deb K A Comparison of Selsction Schemes used in Genetic Algorithms 1991 18.Goldberg D E;Richardson J查看详情 1987 19.Deb K;Goldberg D E查看详情 1989 20.Osman M S;Abo-Sinna M A;Mousa A A IT-CEMOP:An iter-ative co-evolutionary algorithm for muhiobjeetive optimization problem with nonlinear constraints[外文期刊] 2006(1) 21.Shin S-Y;Lee I-H;Kim D Multiobjeetive Evolutionary O-ptimization of DNA Sequences for Reliable DNA Computing[外文期刊] 2005(02) 22.Deb K;Prata PA;Agatwal S A Fast and Elitist Muhiob-jective Genetic Algorithm:NSGA-II 2002 23.Zitzler E;Laumanns M;Thiele L SPEA2:ImprovingtheS-trength Pareto Evolutionary Algorithm 2001

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)确定决策变量和约束条件;

(整理)遗传算法作业

作业 土规1101班刘迈克2011306200521 求下面加权有向图中从A到G的最短路径。 A B1 B2 C1 C2 C3 C4 D1 D2 D3 E1 E2 E3 F1 F2 G 5 3 1 3 6 8 7 6 6 5 8 3 3 3 8 4 2 2 2 1 3 3 3 5 5 2 6 6 4 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 5 3 1 3 6 8 7 6 6 5 8 3 3 3 8 4 2 2 2 1 3 3 3 5 5 2 6 6 4 3

解: 基本思路: 第一步:确定决策变量及其约束条件。 第二步:建立优化模型。 第三步:确定编码方法。 第四步:确定解码方法。 第五步:确定个体评价方法。 第六步:设计遗传算子。 选择运算使用比例选择算子; 交叉运算使用单点交叉算子; 变异运算使用基本位变异算子。 第七步:确定遗传算法的运行参数。 程序: % n ---- 种群规模 % ger ---- 迭代次数 % pc ---- 交叉概率 % pm ---- 变异概率 % v ---- 初始种群(规模为n) % f ---- 目标函数值 % fit ---- 适应度向量 % vx ---- 最优适应度值向量 % vmfit ---- 平均适应度值向量 clear all; close all; clc; tic; % 生成初始种群 %power=[0 5 3 100 100 100 100 100; % 100 0 100 1 3 6 100 100; % 100 100 0 100 8 7 6 100; % 100 100 100 0 100 100 100 8; % 100 100 100 100 0 100 100 5; % 100 100 100 100 100 0 100 3; % 100 100 100 100 100 100 0 3; % 100 100 100 100 100 100 100 0]; power=[0 5 3 100 100 100 100 100 100 100 100 100 100 100 100 100; 100 0 100 1 3 6 100 100 100 100 100 100 100 100 100 100; 100 100 0 100 8 7 6 100 100 100 100 100 100 100 100 100;

遗传算法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()

AI人工智能的几种常用算法概念

一、粒子群算法 粒子群算法,也称粒子群优化算法(Particle Swarm Optimization),缩写为PSO,是近年来发展起来的一种新的进化算法((Evolu2tionary Algorithm - EA)。PSO 算法属于进化算法的一种,和遗传算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的交叉(Crossover) 和变异(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。 优化问题是工业设计中经常遇到的问题,许多问题最后都可以归结为优化问题.为了解决各种各样的优化问题,人们提出了许多优化算法,比较著名的有爬山法、遗传算法等.优化问题有两个主要问题:一是要求寻找全局最小点,二是要求有较高的收敛速度.爬山法精度较高,但是易于陷入局部极小.遗传算法属于进化算法(EvolutionaryAlgorithms)的一种,它通过模仿自然界的选择与遗传的机理来寻找最优解.遗传算法有三个基本算子:选择、交叉和变异.但是遗传算法的编程实现比较复杂,首先需要对问题进行编码,找到最优解之后还需要对问题进行解码,另外三个算子的实现也有许多参数,如交叉率和变异率,并且这些参数的选择严重影响解的品质,而目前这些参数的选择大部分是依靠经验.1995年Eberhart博士和kennedy博士提出了一种新的算法;粒子群优化(ParticalSwarmOptimization-PSO)算法.这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性. 粒子群优化(ParticalSwarmOptimization-PSO)算法是近年来发展起来的一种新的进化算法(Evolu2tionaryAlgorithm-EA).PSO算法属于进化算法的一种,和遗传算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价

遗传算法经典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表示待解码的二进制串的起始位置

基于遗传算法的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; %这里有待优化

遗传算法作业

遗传、蚁群算法作业 1、利用遗传算法求出下面函数的极小值:z=2-exp[-(x2+y2)], x,y∈[-5,+5] 解: 第一步确定决策变量及其约束条件:x,y∈[-5,+5] 第二步建立优化模型:min z(x,y)=2-exp[-(x2+y2)] 第三步确定编码方法。用长度为50位的二进制编码串来表示决策变量x,y。第四步确定解码方法。解码时将50位长的二进制编码前25位转换为对应的十进制整数代码,记为x,后25位转换后记为y。 第五步确定个体评价方法。 第六步设计遗传算子。选择运算用比例选择算子,交叉运算使用单点交叉算子,变异运算使用基本位变异算子。 第七步确定遗传算法的运行参数。 实现代码: % n ---- 种群规模 % ger ---- 迭代次数 % pc ---- 交叉概率 % pm ---- 变异概率 % v ---- 初始种群(规模为n) % f ---- 目标函数值 % fit ---- 适应度向量 % vx ---- 最优适应度值向量 % vmfit ---- 平均适应度值向量 clear all; close all; clc; tic; n=30; ger=200; pc=0.65; pm=0.05; % 生成初始种群 v=init_population(n,50); [N,L]=size(v); disp(sprintf('Number of generations:%d',ger)); disp(sprintf('Population size:%d',N)); disp(sprintf('Crossover probability:%.3f',pc)); disp(sprintf('Mutation probability:%.3f',pm));

遗传算法的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函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

遗传算法

作业1: 1、多目标优化的基本方法是什么? 答:1)传统方法 绝大多数传统的多目标优化方法是将多个目标通过某种技术转换为一个或者一系列的单目标的优化问题,然后再借助数学规划工具求解一个或一系列单目标优化问题来完成多目标优化问题的求解。常见的传统优化方法有:加权求和法、约束法和目标规划法。 (1)加权求和法 该方法就是将多目标优化中的各个目标函数加权(即乘以一个用户自定义的权值)然后求和,将其转换为单目标优化问题进行求解。 利用加权求和可以将多目标优化转化为以下形式: ()() Ω ∈=∑=x to subject x f X F Minimize m i i i 1 ω 通过选取不同的权重组合可以获得不同的Pareto 最优解。这也是最为简单有效的一种求解多目标优化问题的经典方法,而且对与Pareto 最优前端为凸的多目标优化问题,这种方法可以保证获得Pareto 最优解。 (2 )约束法 约束法的实质是在多目标优化问题中选取其中的一个子目标作为新优化问题的目标函数,将其它子目标转化为约束条件。设选取的子目标为第k 个子目标,则其它n-1个子目标转化为约束条件。其表达式如下: max)min(& )1)(()(N k x f x f y k ≤≤== ..t s ),2,1,,1()()(N n k i n i x f x g i i i ?=≠<<≥=ε ],,[21D d x x x x x ,,,??= ),,2,1(max -min -D d x x x d d d ?=≤≤ 其中,i ε为人为设定的下界,通过调节i ε搜索Pareto 最优解。可见这种方法实现多目标最优化时也存在人为因素,同加权法一样需要技术人员的经验的积累。 (3)目标规划法 目标规划法则首先单独求出各子目标函数的最优解)(* x f 然后进行归一化求和,最终实现多目标优

人工智能导论学习体会及遗传算法应用

《人工智能》课程学习体会兼论遗传算法在最优化问题的应用与发展 一、《人工智能》课程学习体会 1.课程学习历程 这学期,在《人工智能》课程学习中,我们以中国大学MOOC网上浙江工业大学王万良教授主讲的《人工智能导论》课程为主。课上老师给我们讲解了一些课程中的难点,课下老师发放了很多的人工智能课外阅读资料,供我们参考学习。 在学习的过程中,我们先对智能有了初步了解,之后再谈人工智能的概念。要想实现人工智能,就需要把我们人的思维形式化,于是学习了谓词逻辑知识表示,之后是产生式,然后是概率论和数理统计的一些内容。掌握了这些之后,我们就可以根据知识去解决问题了。可是怎么去解决,如何去推出结果,又是一个问题,于是我们学习了一些推理方法,如模糊推理等。按照智能的定义,那么现在已经基本实现智能了。即实现了智能=知识+智力,虽然不是真正意义上的智能。虽然现在可以去处理一些问题了,但是很明显的,它的效率非常的低,甚至于有些问题找到答案花费的时间特别长,是我们无法接受的。于是我们学习了如A*算法、遗传算法、粒子群优化算法、蚁群算法等一些加快处理问题的算法。最后,我们学习了神经网络、专家系统、机器学习和智能体系等内容。对于这些学习的知识,基本上还处于一个了解的水平,要想实际应用还需要更深入的学习。 课下,我们也看了一些和人工智能的书籍,诸如《浪潮之巅》,向我们讲述了科技公司像IBM,微软,英特尔等公司的兴衰;《智能革命》向我们讲述了AI 与我们的生活密切相关,并且越来越离不开智能。通过阅读这些课外读物,也使得我们对人工智能有了更深的理解与思考。 2.课程学习体会与感悟 学习完主要课程之后,给我的第一感觉就是:“哎!怎么还没有学呢!课程就结束了”。有这样的感觉主要还是受到疫情的影响,在家不能像在学校一样学的那么精细。很多的知识几乎是走一个概念便草草离场了,同时,人工智能这门课程本身涉及的知识面也比较广,如讲到神经网络的时候提到了生物学中的神经元、突触等这些结构,想一下子掌握这些内容是不可能的。 另一个方面则是,人工智能的应用领域非常之多,诸如机器学习,专家系统等,每一部分都是可以单独拿出来作为深入学习的方向的。因此,现在的学习,只是对人工智能有了一个初步的了解,想要入门还需要学习更多的内容,还需要投入更多的时间。 二、遗传算法在最优化问题的应用与发展 1.遗传算法简述

MATLAB遗传算法PID大作业.

遗传算法在调节控制系统参数中的应用 【摘要】自动化控制系统多采用PID 控制器来调节系统稳定性和动态性,PID 的 Kp,Ki,Kd 参数需要合理选择方能达到目标。遗传算法是一种模拟生物进化寻求最优解的有效算法,本文通过利用GAbx 工具箱实现对控制电机的PID 进行参数优化,利用matlab 的仿真功能可以观察控制效果。 1. 直流伺服电机模型 1.1物理模型 图1 直流伺服电机的物理模型 αu ---电枢输入电压(V ) a R ---电枢电阻(Ω) S L ---电枢电感(H ) q u ---感应电动势(V ) g T ---电机电磁转矩(N m ?) J---转动惯量(2m kg ?) B---粘性阻尼系数(s m N ??) g i ---流过电枢的电流(A ) θ---电机输出的转角(rad ) 1.2传递函数 利用基尔霍夫定律和牛顿第二定律得出电机基本方程并进行拉布拉斯变换 ) ()()()()()()()()()()(2s s K s U K s I s T s Bs s Js s T s I s L R s I s U s U e q t a g g a a a a q a θθθ?=?=?+?=?+?=- 式中:t K 为电机的转动常数(m N ?)A ;e K 为感应电动势常数(s V ?)rad

图2 直流伺服电机模型方框图 消去中间变量得系统的开环传递函数: s K K B Js R s L K s U s s G C t a d t a ]))([() () ()(+++= = θ 系统参数如下:s m uN B m mg J ??=?=51.3,23.32 A m N K K uH L R e t a a )(03.0,75.2,4?===Ω= 2. PID 校正 图3 PID 校正 s K s K K s G d i p c ++ =)( Kp,Ki,Kd 为比例,积分,微分系数 令Kp=15、Ki=0.8 、Kd=0.6 M 文件:J=3.23E-6; B=3.51E-6; Ra=4; La=2.75E-6; Kt=0.03; num= Kt; den=[(J*La) ((J*Ra)+(La*B)) ((B*Ra)+Kt*Kt) 0]; t=0:0.001:0.2; step(num,den,t); Kp=15; Ki=0.8; Kd=0.6; numcf=[Kd Kp Ki]; dencf=[1 0]; numf=conv(numcf,num); denf=conv(dencf,den); [numc,denc]=cloop(numf,denf); t=0:0.001:0.04; step(numc,denc,t); matlab 进行仿真,我们可以看出不恰当的PID 参数并不能使系统达到控制系统的要求,

基于遗传算法的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;%遗传代数

NSGA-II

Abstract: NSGA(采用Non-dominated sorting and sharing算法的MOEA)存在以下三个问题: a、非劣排序遗传算法的复杂度为O(MN3) b、没有引进精英策略; c、必须人为指定一个共享参数; Introduction: 传统的优化方法(Multi-criterion decision-making methods)提出将多目标优化问题转换为单目标优化问题,强调一次仿真运行只获得一个最优解,然后通过多次仿真希望获得多个不同的最优解; NSGA-II改进主要是针对如上所述的三个方面: a、提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体; b、引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度; c、采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。 NSGA-II提出了一个简单的解决约束优化问题的方法; Part II: 强度Pareto进化算法,SPEA(suggested an elitist multi-criterion EA with the concept of non-domination)具体步骤如下: a、产生初始种群P和空的外部非劣解集NP; b、将种群P中的非劣个体拷贝到非劣解集NP; c、剔除集合NP中受种群P中个体支配的解; d、如果保留在集合NP中的非劣解的个数超过事先给定的最大值,则通过聚 类分析对集合NP进行修剪,剔除多余的解; e、计算种群P和集合NP中每个个体的适应度值; f、利用二元锦标赛方法从P +NP中选择个体进入下一代; g、对个体实施交叉和变异操作; h、如果最大代数达到,停止搜索;否则转到b。 适应度赋值:首先对非劣解集NP中的个体进行赋值,然后对种群中的个体赋值,具体描述如下: a、对于每个解x i∈NP, 赋予一个强度值S i ∈[0,1),S i = h i /(N+1),其中h i 表 示种群中受个体x i 支配的个体数,N为种群规模。S i 即为x i 的适应度值; b、每个个体x j ∈P 的适应度值为1+ ∑S i ,即所有支配解x j 的解x i ∈NP 的强度之和再加1。 聚类分析:通常情况下,非劣解集大小必须受限,必须为其规定最大规模,即保留在其中的解的最大个数,主要原因有四个方面: a、M OP的非劣解集大小可能非常大,甚至无穷大

相关主题
文本预览
相关文档 最新文档