最近接触遗传算法,参考了众多例子,有些又不尽然对,所以自己边理解边修改,然后写出了下面这堆传说中的屎山。。。

PS1:遗传算法原理啥的太多了,就不赘述了,CSDN里面很多帖子都讲得很透彻了;

PS2:要看简洁的,直接油管搜遗传算法,看莫烦的视频。

代码

不废话了,赶紧上车,啊不,上代码。

import math

import numpy as np

import matplotlib.pyplot as plt

import random

class GA(object):

# 目标求解2*sin(x)+cos(x)最大值

def __init__(self, population_size, chromosome_length, pm):

self.population_size = population_size

self.chromosome_length = chromosome_length

self.pm = pm

# 初始化种群

def species_origin(self): # 生成染色体和基因

population = [[]] # 二维列表,包含染色体和基因

for i in range(self.population_size):

temporary = [] # 染色体寄存器

for j in range(self.chromosome_length):

temporary.append(random.randint(0, 1)) # 生成基因,二进制

population.append(temporary) # 将基因添加到染色体中

return population[1:] # 返回种群,包含染色体和基因

# 种群解码,用于适应度判断

def translation(self, population): # 二进制转十进制

chromosome_d_list = [] # 创建染色体十进制列表

for i in range(len(population)):

chromosome_value_d = 0

for j in range(len(population[0])):

chromosome_value_d += population[i][j] * (math.pow(2, len(population[0])-j-1))

chromosome_d_list.append(chromosome_value_d)

return chromosome_d_list

# 适应度计算

def function(self, population, lower_bound, upper_bound):

all_fitness_list = [] # 创建所有染色体适应度列表

fv_list = self.translation(population)

for i in range(len(fv_list)):

x = lower_bound + fv_list[i] * (upper_bound - lower_bound)/(math.pow(2, self.chromosome_length) - 1)

y = 2 * math.sin(x) + math.cos(x) # 目标函数

all_fitness_list.append(y)

return all_fitness_list

# 剔除适应度负值

def positive_fitness(self, all_fitness_list):

pf = []

for i in range(len(all_fitness_list)):

if all_fitness_list[i] > 0:

pf.append(all_fitness_list[i])

return pf

# 正适应度染色体列表

def positive_chromosome(self, all_fitness_list, population):

positive_chromosome_list = []

for i in range(len(all_fitness_list)):

if all_fitness_list[i] > 0:

positive_chromosome_list.append(population[i])

return positive_chromosome_list

# 计算正适应度总和

def pf_sum(self, pf):

pf_total = 0

for i in range(len(pf)):

pf_total += pf[i]

return pf_total

# 正适应度变为小数

def pf_float(self, pf_total, pf):

pf_float = []

for i in range(len(pf)): # 正适应度除以适应度总数,转化为小数

pf_float.append(pf[i] / pf_total)

return pf_float

# 适应度累加,为分区做准备

def pf_div(self, pf_float):

pft_div = []

for j in range(len(pf_float)): # 将适应度转化为轮盘赌的概率

if j == 0:

pft_div.append(pf_float[j])

else:

pft_div.append(pf_float[j] + pft_div[j-1])

return pft_div

def selection(self, pcl, pft_div):

selected_pop = [] # 挑选后的新种群

select_float = [] # 随机产生的小数

for i in range(len(pcl)): # 产生随机小数

select_float.append(random.random())

for i in range(len(pcl)): # 轮盘赌选择

j = 0

while j < len(pcl):

if select_float[i] <= pft_div[j]: # 随机小数与适应度区间对比

selected_pop.append(pcl[j])

break

else:

j += 1

return selected_pop

# 交叉

def crossover(self, selected_pop, population): # 单点交叉

new_pop = [[]]

for i in range(len(population)):

cpoint = random.randint(0, len(selected_pop[0]) - 1) # 随机生成截取点 #

while True:

spoint1 = random.randint(0, len(selected_pop) - 1)

spoint2 = random.randint(0, len(selected_pop) - 1)

if spoint1 == spoint2:

continue

else:

break

temp = [] # 染色体片段暂时存储器

temp.extend(selected_pop[spoint1][0:cpoint]) # 第i个染色体0~截取点阶段的基因存储于temp中

temp.extend(selected_pop[spoint2][cpoint:len(selected_pop[0])]) # 第i+1个染色体截取点~末端阶段的基因存储于temp中

new_pop.append(temp)

return new_pop[1:]

# 变异

def mutation(self, new_pop):

for i in range(len(new_pop)): # 对所有染色体进行有概率的变异

mpoint = random.randint(0, len(new_pop[0])-1) # 根据染色体长度,随机生成变异的位数

prandom = random.random() # 随机生成[0,1)之间的小数作为比较概率

if prandom <= self.pm:

if new_pop[i][mpoint] == 1:

new_pop[i][mpoint] = 0

else:

new_pop[i][mpoint] = 1

next_pop = new_pop

return next_pop

# 二进制转十进制

def b2d(self, value_b):

pf_d = []

for i in range(len(value_b)):

value_d = 0

for j in range(len(value_b[0])):

value_d += value_b[i][j] * math.pow(2, len(value_b[0])-1-j)

pf_d.append(value_d)

return pf_d

# 可视化

def plot(self, pcl_d_list, pf, lower_bound, upper_bound, generation, iteration):

px = []

for i in range(len(pcl_d_list)):

pxt = lower_bound + pcl_d_list[i] * (upper_bound - lower_bound) / (math.pow(2, self.chromosome_length) - 1)

px.append(pxt)

py = pf

sca = plt.scatter(px, py, s=200, lw=0, c='red', alpha=0.5)

plt.pause(0.05)

print('px', len(px))

j = generation

if j < iteration-1:

if 'sca' in locals():

sca.remove()

# 主程序

def main(self, iteration):

population = self.species_origin() # 创建种群

results = []

for i in range(iteration):

self.translation(population)

all_fitness_list = self.function(population, 0, 2*math.pi)

pf = self.positive_fitness(all_fitness_list)

pcl = self.positive_chromosome(all_fitness_list, population)

self.plot(self.translation(pcl), pf, 0, 2 * np.pi, i, iteration)

print('pcl', pcl)

pf_total = self.pf_sum(pf)

pf_float = self.pf_float(pf_total, pf)

pft_div = self.pf_div(pf_float)

print('pft_div', pft_div)

selected_pop = self.selection(pcl, pft_div)

new_pop = self.crossover(selected_pop, population)

next_pop = self.mutation(new_pop)

population = next_pop

results.append(pf_total)

print('The', i, 'generation pf:', pf, '\npf length', len(pf))

plt.ioff()

plt.show()

if __name__ == '__main__':

ga = GA(100, 17, 0.01)

plt.ion()

x = np.linspace(0, 2*np.pi, 100)

Fx = 2 * np.sin(x) + np.cos(x)

plt.plot(x, Fx)

plt.grid()

ga.main(500)

python随机函数random求最大值_Python遗传算法求一元函数最大值相关推荐

  1. 遗传算法求解一元函数最大值

    基于遗传算法求解一元函数最大值python 一.问题介绍 二.算法设计 2.1 类数据成员 2.2 初始化种群 2.3 转换种群编码 2.4 适应度计算 2.5 种群选择 2.6 种群交配 2.7 基 ...

  2. python求函数极值_python 遗传算法求函数极值的实现代码

    废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import rando ...

  3. python随机函数random要导入哪个包_python学习之随机函数random

    文章目录 python学习之随机函数random 提示:以下是本篇文章正文内容,下面案例可供参考 一.随机函数模块 要想使用随机数,需先导入随机数模块: # 导入模块 import random 也就 ...

  4. python中random模块用法_Python中random模块用法实例分析

    本文实例讲述了Python中random模块用法.分享给大家供大家参考.具体如下: import random x = random.randint(1,4); y = random.choice([ ...

  5. python中random模块验证码_Python之random模块详解

    python的random模块 random模块是python中一个生成随机数的模块. random不是python解释器内置的模块. 导入random模块的方法是:import random 如果只 ...

  6. python求一组数的最大值_python快速求一个数组的最大值/最小值及其索引

    enumerate()函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标. x = [3, 2.2, 7.4, 6, 4] list(enumerate( ...

  7. python最大公约数和最小公倍数_python怎么求最大公约数和最小公倍数

    python怎么求最大公约数和最小公倍数 一.求最大公约数 用辗转相除法求最大公约数的算法如下: 两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数.比如10和 ...

  8. python中合法的二进制整数_python:求整数的二进制表示

    求解方法: 1.整数求余 2.重复进行,整数除2再求余,直到除数为0 3.拼接余数 4.反转字符串 defint2two(intNo): twoStr='' if intNo ==0: twoStr= ...

  9. python如何求阶乘_python如何求阶乘

    python如何求阶乘 python阶乘的方法:1.使用普通的for循环:2.使用[reduce()]函数,代码为[num = reduce(lambda x,y:x*y,range(1,7))]:3 ...

最新文章

  1. centos7 网卡配置vlan_【linux】Centos7单网卡多VLAN配置
  2. win10子系统ubuntu文件夹位置_win10子系统(WSL)自定义安装路径
  3. android API 参考大全
  4. js:点击button后返回值
  5. SP22343 NORMA2 - Norma(分治优化复杂度)
  6. dbnetlib sqlserver不存在或拒绝访问_SQL Server数据库损坏和修复
  7. HTTP与HTTPS协议
  8. 3h精通OpenCV(六)-图像堆叠
  9. leetcode(90)子集 2
  10. [机器学习必知必会]泛化误差率的偏差-方差分解
  11. R语言的digamma、gamma、dgamma与norm函数对应python函数包的问题
  12. 一个免费开源、跨平台的可视化源码探索项目
  13. 2021年安全生产模拟考试(建筑起重机司机-塔式起重机模拟考试题库)安考星
  14. Corrective feedback
  15. UE4实时渲染基础及深入探究
  16. InForSec@武汉“江夏晴川”网络安全Workshop记录-1
  17. C# 山寨版完整版QQ
  18. Maxon Cinema 4D Release 21可立即供货
  19. 算法:深度优先搜索(一)
  20. chrony时间同步端口

热门文章

  1. Linux的timerfd分析
  2. 总结一下矩阵的基本操作
  3. Netty 的基本简单实例【服务端-客户端通信】
  4. C程序设计 电文密码——有一行电文,已按下面规律译成密码
  5. 新概念英语(1-37)Making a bookcase
  6. asynchronous vs non-blocking
  7. TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES
  8. ffmpeg 编译成功,Mark一下
  9. centOS restart xinetd
  10. cocos2dx win32下的MainLoop分析(启动流程)