遗传算法求解函数最小值问题
遗传算法求解函数最小值问题
继上一次用遗传算法求解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
谢谢大家阅读!
遗传算法求解函数最小值问题相关推荐
- 实值遗传算法求解函数极值问题(基于MATLAB)
实值遗传算法求解函数极值问题(基于MATLAB) 声明: 1.本文源代码来自书目<智能优化算法及其MATLAB实例(第3版)>,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了 ...
- 利用遗传算法求解函数极值
1.利用遗传算法求解函数极值 例1 利用遗传算法求函数 f(x) = 11sin(6x) + 7cos(5x),x∈[- π,π]的最大值点. 解:在MATLAB中编制绘制函数曲线的代码,运行得到题中 ...
- 运用遗传算法求解函数极值(fortran)
运用遗传算法求解函数极值(fortran) 写在前面 遗传算法的前世今生 算法步骤简介 遗传算法的主体结构 开始求解: 结果显示: 最后再来说一些需要注意的地方 写在前面 这篇文章适合一些应急学习最优 ...
- <<人工智能导论>>上机--遗传算法求解函数最值
利用遗传算法求解函数 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, ...
- 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)
1 从布谷鸟的育雏到布谷鸟算法 2 布谷鸟算法 3 萊维飞行与公式(1)的深层含义 4 附:CS算法求解函数最小值代码 5 源码下载 6 参考文献 1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝,也不 ...
- 基于遗传算法求函数最小值
一.遗传算法概述 遗传算法( genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的"物竞天择.适者生存"的演化法则.遗传算法是把问题参数编码为染色体 ...
- python实现遗传算法求解函数极值问题
python实现遗传算法求解函数极值问题 import random import numpy as np #定义染色体类 class chromosome:def __init__(self,chr ...
- 遗传算法计算函数最小值(多维)
函数 仿真过程 君主方案 代码实现 1.函数 的最小值,其中x的维数n=10,这是一个简单平方和函数,只有一个极小点 =(0,0,...,0),理论最小值 2.仿真过程: (1)初始化种群数目NP= ...
- 采用遗传算法求解最大值c语言,遗传算法求解函数最大值用例
学习遗传算法自己改了一个用例,感谢下面两篇文章的作者: /*********************************************************************** ...
最新文章
- Windows中的tree命令不可用的解决办法
- HDU2045 不容易系列之(3)—— LELE的RPG难题(递推)
- MySQL监控系统Lepus的搭建
- 数据结构-循环单链表之约瑟夫问题
- 学习笔记(43):Python实战编程-事件处理简介
- 【FPGA VerilogHDL】第一次尝试:LED灯基础实验
- flask 上传 excel 并导入mysql
- oracle10g rac启动,ORACLE 10G RAC启动与关闭
- free() 是如何释放不同内存区块大小的指针?
- linux中java 里面启动 重启 停止jar 的 shell
- 修改了JS代码,刷新网页后,加载的JS还是原来旧的?
- 一行代码让纯文本编辑器秒变 Markdown 编辑器
- 论如何优雅的处理回文串 - 回文自动机详解.
- css 对话框 水平居中,css 水平居中的几种方法
- Hi, This is CarPlay!
- Tess4J 安装及使用介绍
- 编译原理中单线箭头->和双线箭头=>有什么区别
- 2019最新个税计算_python
- 红帽子linux转中文后乱码,安装redhat时中文显示乱码(小方框)解决方法
- Power BI中文版