这个系列还有两篇:

计算机智能专题-遗传算法(1不带约束的)_两只蜡笔的小新的博客-CSDN博客

计算机智能专题-遗传算法(2带约束的实数编码)_两只蜡笔的小新的博客-CSDN博客

前言:

遗传算法的原理及python实现

一、原理

遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。

其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。

遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。

二、整体步骤

以下步骤是遗传算法的基本原理,可以在此基础上进行扩展。

三、编程实现

求0.5x-x^2的最大值,x为整数。

import numpy as np
import copy
'''目标函数'''f = lambda x:0.5*x-x*xclass genetic_algorithms():def __init__(self,N=8,Bit_num=5):_groups = np.zeros([N,Bit_num],int)for index in range(0,N):for _index in range(0,Bit_num):_groups[index,_index] = np.random.choice([0,1])self._groups = _groupsdef Binary2Decimal(self,Binary,include_negative=False):'''fct: 将二进制转化为十进制:param Binary: 输入的二进制数组:param include_negative: 最高位是不是 符号位:return:'''sum = 0bit_flag = -1 if include_negative==True else 1for index in range(1,len(Binary)):sum = sum + Binary[-index]*2**(index-1)if  bit_flag==-1:if Binary[0]==1:sum = sum * bit_flagelse:sum = sum + 0else:sum = sum + Binary[0]*2**(index)return sum# 适宜度的设计 很重要# 会出现负数,负数怎么处理# 这里将 负数变成正数 进行处理def calculate_suitability(self,input):y_get = list(map(lambda x:f(x),input))if np.min(y_get)<=0:input_Data = y_get - np.min(y_get)  # 这里有一个bug 当所有的值都为 负数 且都一样时,分母为零if np.sum(input_Data)==0:input_Data = list(map(lambda x:x+1,input_Data))else:input_Data = y_getout_data = []for data in input_Data:out_data.append(float(data)/np.sum(input_Data))return out_datadef optimize_choose(self,input_Data):out_data_index = []for index in range(len(input_Data)):         # 需要优选的次数random_value = np.random.rand(1)sum_value = 0for _index in range(len(input_Data)):    # 遍历查找优选的值sum_value = sum_value + input_Data[_index]if random_value <= sum_value:out_data_index.append(_index)breakelse:continuereturn out_data_indexdef cross_variation(self,init_groups, opt_chose):opt_chose_data = [] # 优选的后的结果for opt_flag in opt_chose:opt_chose_data.append(init_groups[opt_flag,:])cross_Data = copy.deepcopy(opt_chose_data)# 分组index_groups = list(range(0,len(init_groups)))np.random.shuffle(index_groups) #分组是随机的,按顺序排完之后,再次打乱# 染色体 交叉# 1. 交叉的位置是随机的for index in range(0,int(len(index_groups)/2)):index = index*2variation_site = np.random.choice(list(range(0,np.shape(init_groups)[-1]))[1:]) # 变异的起始位置 是随机的try:variation_data = opt_chose_data[index_groups[index]][variation_site:] # 保存 中间变量except:a = 10cross_Data[index_groups[index]][variation_site:] = opt_chose_data[index_groups[index+1]][variation_site:]cross_Data[index_groups[index + 1]][variation_site:] = variation_data# 染色体 变异# 1. 变异的位置是随机的# 2. 变异是否 发生是随机的variation_Data = copy.deepcopy(cross_Data)variation_value = 1/np.shape(init_groups)[-1]for index in range(len(variation_Data)):variation_random_value = np.random.rand(1)if variation_random_value>=variation_value:variation_site = np.random.choice(list(range(0, np.shape(init_groups)[-1]))[1:]) #变异发生的位置variation_Data[index][variation_site] = 1 - variation_Data[index][variation_site]return np.array(variation_Data)def run(self):init_groups = self._groupsdata_collect = []for epochs in range(100):y_group = [] # 转十进制for Binary in init_groups:y_group.append(self.Binary2Decimal(Binary,True))if y_group[0]=='nan':a = 10y_suit = self.calculate_suitability(y_group)opt_chose = self.optimize_choose(y_suit)cross_variation_data = self.cross_variation(init_groups, opt_chose)init_groups = copy.deepcopy(cross_variation_data)y_get = list(map(lambda x: f(self.Binary2Decimal(x,True)), init_groups))data_collect.append(np.max(y_get))print('epoch: %d 当前最优值为%f'%(epochs,np.max(data_collect)))# print('epoch: %d 当前最优值为%f'%(epochs,np.max(y_get)))# if __name__=='__mian__':
obj = genetic_algorithms(N=4,Bit_num=9)
obj.run()

遗传算法-python版(计算机智能算法)相关推荐

  1. 异同点 模拟退火 遗传算法 邻域搜索_智能算法浅介----模拟退火,遗传算法,禁忌搜索,神经网络等...

    本文讲的过于笼统,如果想真正理解,请参考: 智能算法浅介----By cooler 一个比方 在工程实践中,经常会接触到一些比较"新颖的算法"如模拟退火,遗传算法,禁忌搜索,神经网 ...

  2. Python版选择排序算法

    关于Python版冒泡排序算法请参考Python版冒泡法排序算法. def selectSort(lst, reverse=False): length = len(lst) for i in ran ...

  3. 图解leetcode初级算法python版 pdf_LeetCode初级算法的Python实现--数组

    # -*- coding: utf-8 -*- """ @Created on 2018/6/3 17:06 @author: ZhifengFang "&qu ...

  4. python版 常用排序算法 思路加详解 冒泡排序、快速排序、插入排序、选择排序

    注:这里所有排序操作都以从小到大排列为例,想要从大到小排的自行修改代码即可 目录 一.冒泡排序 思路: 步骤: 解析: 二.快速排序 思路: 步骤: 代码: 三.插入排序 思路: 代码: 四.选择排序 ...

  5. 智能算法浅介----模拟退火,遗传算法,禁忌搜索,神经网络等

    本文讲的过于笼统,如果想真正理解,请参考: 1模拟退火 2遗传算法 3禁忌搜索 智能算法浅介----By cooler 一个比方 在工程实践中,经常会接触到一些比较"新颖的算法"如 ...

  6. python数据结构与算法分析_数据结构与算法(Python版)

    为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...

  7. Python版插入排序算法

    问题描述:在插入排序算法中,把所有元素分为前面的已排序序列和后面的未排序序列两部分,每次处理未排序序列中的第一个元素,将其插入到前面已排序序列中的合适位置,从而不停地扩大已排序序列并缩小未排序序列,直 ...

  8. Python版基于递归的冒泡排序算法

    应读者要求,写个基于递归的冒泡排序算法代码,之前发过的排序算法代码请参考Python版快速排序算法,Python版选择排序算法,Python版冒泡法排序算法. from random import r ...

  9. Python版快速排序算法

    Python版冒泡排序算法请参考Python版冒泡法排序算法 Python版选择排序算法请参考Python版选择排序算法 from random import randint def quickSor ...

最新文章

  1. NTU课程笔记:MAS 714 algorithm and theory of computing(1):introduction
  2. python 连 mongodb
  3. Application log debug - storage
  4. c语言链表错误,C语言创建链表错误之通过指针参数申请动态内存实例分析
  5. POJ 1703 Find them, Catch them 并查集
  6. 虚拟服务器和虚拟主机(空间)的区别
  7. poj 2778 DNA Sequence
  8. mdadm命令参数详解
  9. linux mysql 5.7 配置_Linux环境下详细讲解部署MySQL5.7版本
  10. DevExpress WinForms v20.2版本亮点放送——PDF Viewer功能加强
  11. 曲线运动与万有引力公式_高中物理公式大全
  12. 基于ROS的机器人建图与导航仿真全过程
  13. OKR工作法学习心得
  14. 【原创】带下划线单选菜单栏-标签Tab
  15. 企业安全最佳实践:多层级对抗DDoS攻击
  16. VMware下OSSIM 5.2.0的下载、安装和初步使用(图文详解)
  17. C++微信网页协议实现和应用
  18. iOS TCP UDP通信
  19. 计算机安装Hp1005打印机,hp1005打印机驱动 (64)
  20. Centos7防火墙与IPTABLES详解

热门文章

  1. caffe代码阅读6:Filler的实现细节-2016.3.18
  2. python求峰面积_大学慕课2020年用Python玩转数据答案大全
  3. 动作捕捉技术识别细小错位 机械外骨骼适应性升级
  4. iso12233测试方法_ISO12233分辨率测试卡的使用方法
  5. RSS阅读——在繁杂的社会接受纯粹的信息 RSS介绍与RSS订阅源分享
  6. 使用NetBackup进行oracle备份和恢复
  7. 360春招笔试算法题题解
  8. PHP接入网易易盾验证码
  9. iOS 12升级_iOS 12描述文件安装操作方法
  10. Redis学习笔记(四):过期策略、持久化、事件