遗传算法求解函数最小值问题

继上一次用遗传算法求解TSP问题问题以后,万万没有想到,实验的时候,老师居然改了题目,改成了求解函数的最小值问题(有点坑哈),而且要求结果尽量的稳定,可以确定得到最小值,并且,精度尽可能的高……虽然有点坑,不过老师还是简单的说明了一下基本的思路,思路和上一次没有太大的变化,唯一的难点就是怎样尽可能的提高解的精度。
不管怎样,终究在实验课的时候解决了这个问题,唯一的问题就是进度最多10的负六次方,老师说他的精度可以达到10的负几百次方(膜拜……)。
思路不变,选择用轮盘赌,变异要稍微变一下,具体会在下面讲解,废话少说,进入正题。.

问题描述:

设计高效遗传算法,求解下列函数在-5<=x1,x2<=5上的最小值:
在正式的开始求解之前,老师先将函数的图片展示了出来,如下图所示:
并且公布结果,在(0,0)的位置取得最小值0。
在这个结果的基础上,我们开始试验。

代码编写:

首先是个体的类代码:

class problem1_individual(object):def __init__(self, n1, n2):self.gene = [n1, n2]self.score = 0pass

接着轮盘赌选择的代码,和上一次没有多少变化,同样是采用倒数的方式来作为个体的适配值,因为事先知道结果的最小值为0,所以采用倒数的方式很好,因为越接近0,倒数越大,被选中的概率就越大。
代码如下所示:

def roulette_wheel(self):"""轮盘赌普通方法得到被选中的基因型:param individuals: 种群中各个基因类型的数量:return: 返回被选中的基因型的代号"""all_individual = 0for i in range(len(self.list)):all_individual += 1 / self.list[i].scoreprobabilities = []for i in range(len(self.list)):probabilities.append((1 / self.list[i].score) / all_individual)selected_individual = random.uniform(0, 1)now_individual = 0.0for ind, val in enumerate(probabilities):now_individual += valif now_individual > selected_individual:return self.list[ind]

接着是交叉的代码。在编写之前还没有办法,个体是两个自变量,但是交叉怎么办?上网查了一下,有了思路,很简单,就是用不同的比例进行划分。
随机生成一0-1的数字,作为其中一个父个体的基因比例,再用1减去这个数字,得到另一个父个体的基因比例,两者相加得到的就是最后的孩子的基因序列:

def crossgene(self, parent1, parent2, index1, index2):child = [0, 0]child[0] = parent1.gene[0] * index1 + parent2.gene[0] * index2child[1] = parent1.gene[1] * index1 + parent2.gene[1] * index2return childdef crossover(self, father, mother):""":param father: 需要进行遗传的父类个体:param mother: 需要进行遗传的母类个体:return:"""x = random.randint(0, 9999)# 变异有概率,大于某个值就不发生,小于某个值就发生变异k = 10000 * self.variationrateif x < k:# 进行单点交换index1 = random.uniform(0, 1)index2 = 1 - index1child1 = self.crossgene(father, mother, index1, index2)child2 = self.crossgene(mother, father, index1, index2)else:child1 = father.genechild2 = mother.genereturn child1, child2

结果测试:

代码编写完毕,现在进行测试,看看结果如何:

from problem1_GA import problem1_GAtest = problem1_GA(1, 1)
test.initpopulation()
for i in range(10000):test.next_generation()generation, answer, score = test.get_what_we_need()print(str(answer[0])+" "+str(answer[1])+" "+str(score))print()pass

迭代次数就采用10000次,看看最后的结果达到什么样的精度:

运气不错,最后的结果精度可以达到10^-9次方的水平。当然这次是运气好,但是不是每一次都可以重现这种操作,我还会继续的进行代码的优化,下一次让结果有更好的精度。
当然这都是后话。
最后完整的代码就放在以下链接中
遗传算法求解函数最小值问题
提取码:v2y6
还有上一次的文章缺少的CSDN链接,是tomcat的安装包和eclipse插件:
CSDN—tomcat
谢谢大家阅读!

遗传算法求解函数最小值问题相关推荐

  1. 实值遗传算法求解函数极值问题(基于MATLAB)

    实值遗传算法求解函数极值问题(基于MATLAB) 声明: 1.本文源代码来自书目<智能优化算法及其MATLAB实例(第3版)>,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了 ...

  2. 利用遗传算法求解函数极值

    1.利用遗传算法求解函数极值 例1 利用遗传算法求函数 f(x) = 11sin(6x) + 7cos(5x),x∈[- π,π]的最大值点. 解:在MATLAB中编制绘制函数曲线的代码,运行得到题中 ...

  3. 运用遗传算法求解函数极值(fortran)

    运用遗传算法求解函数极值(fortran) 写在前面 遗传算法的前世今生 算法步骤简介 遗传算法的主体结构 开始求解: 结果显示: 最后再来说一些需要注意的地方 写在前面 这篇文章适合一些应急学习最优 ...

  4. <<人工智能导论>>上机--遗传算法求解函数最值

    利用遗传算法求解函数 f(x,y)=1/(x2+y2+1),x,y∈[−5,5]f(x,y)=1/(x^2+y^2+1),x,y\in[-5,5]f(x,y)=1/(x2+y2+1),x,y∈[−5, ...

  5. 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)

    1 从布谷鸟的育雏到布谷鸟算法 2 布谷鸟算法 3 萊维飞行与公式(1)的深层含义 4 附:CS算法求解函数最小值代码 5 源码下载 6 参考文献 1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝,也不 ...

  6. 基于遗传算法求函数最小值

    一.遗传算法概述 遗传算法( genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的"物竞天择.适者生存"的演化法则.遗传算法是把问题参数编码为染色体 ...

  7. python实现遗传算法求解函数极值问题

    python实现遗传算法求解函数极值问题 import random import numpy as np #定义染色体类 class chromosome:def __init__(self,chr ...

  8. 遗传算法计算函数最小值(多维)

    函数 仿真过程 君主方案 代码实现 1.函数 的最小值,其中x的维数n=10,这是一个简单平方和函数,只有一个极小点 =(0,0,...,0),理论最小值  2.仿真过程: (1)初始化种群数目NP= ...

  9. 采用遗传算法求解最大值c语言,遗传算法求解函数最大值用例

    学习遗传算法自己改了一个用例,感谢下面两篇文章的作者: /*********************************************************************** ...

最新文章

  1. Windows中的tree命令不可用的解决办法
  2. HDU2045 不容易系列之(3)—— LELE的RPG难题(递推)
  3. MySQL监控系统Lepus的搭建
  4. 数据结构-循环单链表之约瑟夫问题
  5. 学习笔记(43):Python实战编程-事件处理简介
  6. 【FPGA VerilogHDL】第一次尝试:LED灯基础实验
  7. flask 上传 excel 并导入mysql
  8. oracle10g rac启动,ORACLE 10G RAC启动与关闭
  9. free() 是如何释放不同内存区块大小的指针?
  10. linux中java 里面启动 重启 停止jar 的 shell
  11. 修改了JS代码,刷新网页后,加载的JS还是原来旧的?
  12. 一行代码让纯文本编辑器秒变 Markdown 编辑器
  13. 论如何优雅的处理回文串 - 回文自动机详解.
  14. css 对话框 水平居中,css 水平居中的几种方法
  15. Hi, This is CarPlay!
  16. Tess4J 安装及使用介绍
  17. 编译原理中单线箭头->和双线箭头=>有什么区别
  18. 2019最新个税计算_python
  19. 红帽子linux转中文后乱码,安装redhat时中文显示乱码(小方框)解决方法
  20. Power BI中文版

热门文章

  1. 2018年第九届蓝桥杯Java本科B组国赛题解
  2. 数学建模matlab和python_参加数学建模用 MATLAB,还是 Python?
  3. 《巨人不死密码》读书笔记
  4. Linux下面SVN 命令详解
  5. 利用python实时获取公网IP地址
  6. Altium Designer 18中Keep-Out层画法
  7. java文件上传以及上传至FastDFS
  8. 计算机专业英语第六单元,计算机专业英语 (六)(示例代码)
  9. 【CSDN浏览器插件测评超详细版】——万能便捷的C功能,直接爱不释手,强烈推荐!更多功能等你探索
  10. Vue中如何扩展⼀个组件