遗传问题求解函数最优化问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

人工智能大作业

遗传问题求解函数最优化问题

姓名:

学号:

班级:

日期:

基本遗传算法及其在函数优化中的应用

摘要

遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。

遗传算法是一种是模拟生物遗传学和自然选择机理,通过人工方式构造的一类优化搜索算法,其编码技术和遗传操作比较简单,优化不受限制条件的约束,不需要有先验条件。其搜索过程是从问题解的一个随机产生的集合开始的,而不是从单个个体开始的,具有隐含并行搜索特性,也就大大减少可陷入局部极小值的可能。因而,遗传算法在求解函数优化问题中有着良好的应用,同时,遗传算法在解决可能在求解过程中产生组合爆炸的问题时会产生很好的效果。

关键字:遗传算法函数优化人工智能

前言

这是一个关于遗传算法的问题,而本文的主要目的就是利用C语言编写程序实现利用遗传算法中的编码,变异,交叉,复制来求解函数最大值的问题。

一、遗传算法概述

遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术

二、遗传算法基本机理

遗传算法是模拟生物遗传学和自然选择机理,通过人工方式构造的一类优化搜索算法,是对生物进化过程进行的一种数学仿真,是进化计算的一种重要形式。遗传算法与传统数学模型截然不同,它为那些难以找到传统数学模型的难题找出了一个解决方法。同时,遗传算法借鉴了生物科学中的某些知识,从而体现了人工智能的这一交叉学科的特点。遗传算法基本机理主要分为以下三方面:1、编码与解码

将问题结构变换为位串形式编码表示的过程叫做编码;相反的,将位串形式编码表示变换为原问题结构的过程叫做解码或者译码。把位串形式编码表示叫做染色体,有时也叫做个体。

2、适应度函数

为了体现染色体的适应能力,引入了对问题中的每一个染色体都进行度量的函数,叫做适应度函数(fitness function)。通过适应度函数来决定染色体的优劣程度,它体现了自然界进化中的优胜劣汰原则。对于优化问题,适应度函数就是目标函数。

3、遗传操作

简单的遗传算法操作主要有三种:选择(selection)、交叉(crossover)、

变异(mutation)。改进的遗传算法大量扩充了遗传操作,以达到更高的效率。

选择操作也叫做复制操作(reproduction)操作,根据个体的适应度函数值所度量的优劣程度决定它在下一代是被淘汰还是被遗传。

交叉操作的简单方式是将被选择出的两个个体P1和P2作为父母个体,将两者的部分码值进行交换。

变异操作的简单方式是改变数码串的某个位置上的数码。

4、遗传算法基本步骤

1、初始化种群;

2、计算种群上每个个体的适应度值;

3、按由个体适应度值所决定的某个规则选择将进入下一代的个体

4、按概率P

进行交叉操作

C

5、按概率P

进行变异操作

C

6、若没有满足某种停止条件,则转步骤2),否则进入下一步;

7、输入种群中适应度值最优的染色体作为问题的满足解或最优解

5、基本遗传算法框图

基本遗传算法框图

6、遗传算法求解举例

利用遗传算法求解函数:

f(x)=x*sin(10π*x)+1.0

的最大值,其中,x∈[-1,2]|。

7、编程实现

const int MAX = 4194304;

const int MIN = 0;

#include

#include //产生随机数要用到time(int),以使每次产生的数不同。#include //sin(float)在这儿。

using namespace std;

const double pi = 3.1415926;

class Individuality {

private:

int chromosome; //染色体

public:

void set(int chromosome)

{ this->chromosome = chromosome; }

Individuality operator =(Individuality c)

{ this->chromosome = c.chromosome; return *this; }

bool operator ==(Individuality c)

{ return this->chromosome == c.chromosome; }

float resolve() //通过染色体取得x的值.

{ return -1.0 + (float)chromosome * 3.0 / (MAX - 1); }

float evaluate() //求f()

{

return resolve() * (float)sin(10*pi*resolve()) + 1.0;

}

相关文档
最新文档