我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python怎么实现遗传算法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python怎么实现遗传算法

这篇文章给大家分享的是有关Python怎么实现遗传算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

(一)问题

遗传算法求解正方形拼图游戏

(二)代码

#!/usr/bin/env python# -*- coding: utf-8 -*- from PIL import Image, ImageDrawimport osimport gcimport random as rimport minpy.numpy as np class Color(object):    '''    定义颜色的类,这个类包含r,g,b,a表示颜色属性    '''    def __init__(self):        self.r = r.randint(0, 255)        self.g = r.randint(0, 255)        self.b = r.randint(0, 255)        self.a = r.randint(95, 115)  def mutate_or_not(rate):    '''    生成随机数,判断是否需要变异    '''    return True if rate > r.random() else False  class Triangle(object):    '''    定义三角形的类    属性:            ax,ay,bx,by,cx,cy:表示每个三角形三个顶点的坐标            color  : 表示三角形的颜色            img_t : 三角形绘制成的图,用于合成图片    方法:            mutate_from(self, parent):      从父代三角形变异            draw_it(self, size=(256, 256)): 绘制三角形    '''      max_mutate_rate = 0.08    mid_mutate_rate = 0.3    min_mutate_rate = 0.8      def __init__(self, size=(255, 255)):        t = r.randint(0, size[0])        self.ax = r.randint(0, size[0])        self.ay = r.randint(0, size[1])        self.bx = self.ax+t        self.by = self.ay        self.cx = self.ax+t        self.cy = self.ay-t        self.dx = self.ax        self.dy = self.ay-t        self.color = Color()        self.img_t = None      def mutate_from(self, parent):        if mutate_or_not(self.max_mutate_rate):            t = r.randint(0, 255)            self.ax = r.randint(0, 255)            self.ay = r.randint(0, 255)            self.bx = self.ax + t            self.by = self.ay            self.dx = self.ax            self.dy = self.ay - t            self.cx = self.ax + t            self.cy = self.ay - t        if mutate_or_not(self.mid_mutate_rate):            t = min(max(0, parent.ax + r.randint(-15, 15)), 255)            self.ax = min(max(0, parent.ax + r.randint(-15, 15)), 255)            self.ay = min(max(0, parent.ay + r.randint(-15, 15)), 255)            self.bx = self.ax + t            self.by = self.ay            self.dx = self.ax            self.dy = self.ay - t            self.cx = self.ax + t            self.cy = self.ay - t        if mutate_or_not(self.min_mutate_rate):            t = min(max(0, parent.ax + r.randint(-3, 3)), 255)            self.ax = min(max(0, parent.ax + r.randint(-3, 3)), 255)            self.ay = min(max(0, parent.ay + r.randint(-3, 3)), 255)            self.bx = self.ax + t            self.by = self.ay            self.dx = self.ax            self.dy = self.ay - t            self.cx = self.ax + t            self.cy = self.ay - t                  # color        if mutate_or_not(self.max_mutate_rate):            self.color.r = r.randint(0, 255)        if mutate_or_not(self.mid_mutate_rate):            self.color.r = min(max(0, parent.color.r + r.randint(-30, 30)), 255)        if mutate_or_not(self.min_mutate_rate):            self.color.r = min(max(0, parent.color.r + r.randint(-10, 10)), 255)         if mutate_or_not(self.max_mutate_rate):            self.color.g = r.randint(0, 255)        if mutate_or_not(self.mid_mutate_rate):            self.color.g = min(max(0, parent.color.g + r.randint(-30, 30)), 255)        if mutate_or_not(self.min_mutate_rate):            self.color.g = min(max(0, parent.color.g + r.randint(-10, 10)), 255)         if mutate_or_not(self.max_mutate_rate):            self.color.b = r.randint(0, 255)        if mutate_or_not(self.mid_mutate_rate):            self.color.b = min(max(0, parent.color.b + r.randint(-30, 30)), 255)        if mutate_or_not(self.min_mutate_rate):            self.color.b = min(max(0, parent.color.b + r.randint(-10, 10)), 255)        # alpha        if mutate_or_not(self.mid_mutate_rate):            self.color.a = r.randint(95, 115)        # if mutate_or_not(self.mid_mutate_rate):        #     self.color.a = min(max(0, parent.color.a + r.randint(-30, 30)), 255)        # if mutate_or_not(self.min_mutate_rate):        #     self.color.a = min(max(0, parent.color.a + r.randint(-10, 10)), 255)      def draw_it(self, size=(256, 256)):        self.img_t = Image.new('RGBA', size)        draw = ImageDraw.Draw(self.img_t)        draw.polygon([(self.ax, self.ay),                      (self.bx, self.by),                      (self.cx, self.cy),                      (self.dx, self.dy)],                     fill=(self.color.r, self.color.g, self.color.b, self.color.a))        return self.img_t  class Canvas(object):    '''    定义每一张图片的类    属性:            mutate_rate : 变异概率            size : 图片大小            target_pixels: 目标图片像素值    方法:            add_triangles(self, num=1)      : 在图片类中生成num个三角形            mutate_from_parent(self, parent): 从父代图片对象进行变异            calc_match_rate(self): 计算环境适应度            draw_it(self, i): 保存图片    '''      mutate_rate = 0.01    size = (256, 256)    target_pixels = []      def __init__(self):        self.triangles = []        self.match_rate = 0        self.img = None      def add_triangles(self, num=1):        for i in range(0, num):            triangle = Triangle()            self.triangles.append(triangle)      def mutate_from_parent(self, parent):        flag = False        for triangle in parent.triangles:            t = triangle            if mutate_or_not(self.mutate_rate):                flag = True                a = Triangle()                a.mutate_from(t)                self.triangles.append(a)                continue            self.triangles.append(t)        if not flag:            self.triangles.pop()            t = parent.triangles[r.randint(0, len(parent.triangles) - 1)]            a = Triangle()            a.mutate_from(t)            self.triangles.append(a)      def calc_match_rate(self):        if self.match_rate > 0:            return self.match_rate        self.match_rate = 0        self.img = Image.new('RGBA', self.size)        draw = ImageDraw.Draw(self.img)        draw.polygon([(0, 0), (0, 255), (255, 255), (255, 0)], fill=(255, 255, 255, 255))        for triangle in self.triangles:            self.img = Image.alpha_composite(self.img, triangle.img_t or triangle.draw_it(self.size))            # 与下方代码功能相同,此版本便于理解但效率低        # pixels = [self.img.getpixel((x, y)) for x in range(0, self.size[0], 2) for y in range(0, self.size[1], 2)]        # for i in range(0, min(len(pixels), len(self.target_pixels))):        #     delta_red   = pixels[i][0] - self.target_pixels[i][0]        #     delta_green = pixels[i][1] - self.target_pixels[i][1]        #     delta_blue  = pixels[i][2] - self.target_pixels[i][2]        #     self.match_rate += delta_red   * delta_red   + \        #                        delta_green * delta_green + \        #                        delta_blue  * delta_blue        arrs = [np.array(x) for x in list(self.img.split())]    # 分解为RGBA四通道        for i in range(3):                                      # 对RGB通道三个矩阵分别与目标图片相应通道作差取平方加和评估相似度            self.match_rate += np.sum(np.square(arrs[i]-self.target_pixels[i]))[0]     def draw_it(self, i):        #self.img.save(os.path.join(PATH, "%s_%d_%d_%d.png" % (PREFIX, len(self.triangles), i, self.match_rate)))        self.img.save(os.path.join(PATH, "%d.png" % (i)))  def main():        global LOOP, PREFIX, PATH, TARGET, TRIANGLE_NUM        # 声明全局变量        img = Image.open(TARGET).resize((256, 256)).convert('RGBA')        size = (256, 256)        Canvas.target_pixels = [np.array(x) for x in list(img.split())]        # 生成一系列的图片作为父本,选择其中最好的一个进行遗传        parentList = []        for i in range(20):            print('正在生成第%d个初代个体' % (i))            parentList.append(Canvas())            parentList[i].add_triangles(TRIANGLE_NUM)            parentList[i].calc_match_rate()        parent = sorted(parentList, key=lambda x: x.match_rate)[0]        del parentList        gc.collect()        # 进入遗传算法的循环        i = 0        while i < 30000:            childList = []            # 每一代从父代中变异出10个个体            for j in range(10):                childList.append(Canvas())                childList[j].mutate_from_parent(parent)                childList[j].calc_match_rate()            child = sorted(childList, key=lambda x: x.match_rate)[0]            # 选择其中适应度最好的一个个体            del childList            gc.collect()            parent.calc_match_rate()            if i % LOOP == 0:                print ('%10d parent rate %11d \t child1 rate %11d' % (i, parent.match_rate, child.match_rate))            parent = parent if parent.match_rate < child.match_rate else child            # 如果子代比父代更适应环境,那么子代成为新的父代            # 否则保持原样            child = None            if i % LOOP == 0:                # 每隔LOOP代保存一次图片                parent.draw_it(i)                #print(parent.match_rate)                #print ('%10d parent rate %11d \t child1 rate %11d' % (i, parent.match_rate, child.match_rate))            i += 1  '''定义全局变量,获取待处理的图片名'''NAME = input('请输入原图片文件名:')LOOP = 100PREFIX = NAME.split('/')[-1].split('.')[0]  # 取文件名PATH = os.path.abspath('.')  # 取当前路径PATH = os.path.join(PATH,'results')TARGET = NAME  # 源图片文件名TRIANGLE_NUM = 256  # 三角形个数 if __name__ == '__main__':    #print('开始进行遗传算法')    main()

(三)运行结果

Python怎么实现遗传算法

(四)结果描述

  代码是在遗传算法求解三角形火狐拼图改进而来,遗传算法求解正方形拼图游戏只需随机生成一个坐标和一个常数值(作为正方形的边长),通过正方形的性质,可以写出正方形其他三个点的坐标,确定了四个点的坐标之后,进行遗传和变异。

感谢各位的阅读!关于“Python怎么实现遗传算法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python怎么实现遗传算法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python怎么实现遗传算法

这篇文章给大家分享的是有关Python怎么实现遗传算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。(一)问题遗传算法求解正方形拼图游戏(二)代码#!/usr/bin/env python# -*- coding
2023-06-21

matlab遗传算法怎么实现

要实现遗传算法(Genetic Algorithm)的MATLAB代码,可以按照以下步骤进行:初始化种群:生成包含若干个个体(染色体)的初始种群,每个个体都是一个基因序列,一般用二进制编码表示。适应度评价:根据问题的具体情况,定义适应度函数
2023-10-22

怎么用python代码实现遗传算法

要使用Python代码实现遗传算法,可以按照以下步骤进行操作:1. 定义问题:首先,需要明确要解决的问题是什么,例如优化问题、寻找最佳解等。2. 初始化种群:创建一个初始的种群,其中每个个体都是问题的一个解决方案。可以使用随机数生成器或其他
2023-10-10

Python中怎么实现一个简单遗传算法

今天就跟大家聊聊有关Python中怎么实现一个简单遗传算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。遗传算法遗传算法是模仿自然选择过程的优化算法。 他们没有使用"数学技巧",而是
2023-06-16

Python中怎么实现一个遗传算法框架

本篇文章给大家分享的是有关Python中怎么实现一个遗传算法框架,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。算法特点以决策变量的编码作为运算对象,使得优化过程借鉴生物学中的概
2023-06-17

如何使用Python实现遗传算法

本篇内容介绍了“如何使用Python实现遗传算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!遗传算法是模仿自然界生物进化机制发展起来的随机
2023-07-05

遗传算法(python版)

1、基本概念遗传算法(GA)是最早由美国Holland教授提出的一种基于自然界的“适者生存,优胜劣汰”基本法则的智能搜索算法。该法则很好地诠释了生物进化的自然选择过程。遗传算法也是借鉴该基本法则,通过基于种群的思想,将问题的解通过编码的方式
2023-01-31

C#中怎么实现一个遗传算法

这篇文章给大家介绍C#中怎么实现一个遗传算法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#遗传算法实现代码:using System; using System.Collections.Generic; usi
2023-06-17

python如何实现高效的遗传算法

小编给大家分享一下python如何实现高效的遗传算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!遗传算法属于一种优化算法。如果你有一个待优化函数,可以考虑次算法
2023-06-14

java遗传算法路径优化怎么实现

要实现Java遗传算法路径优化,您可以按照以下步骤进行:定义遗传算法的基本元素:染色体、个体、种群等。染色体表示一条路径,个体表示染色体的具体实例,种群表示多个个体的集合。设计适应度函数:适应度函数用于评估个体的优劣,即路径的长度。路径的长
2023-10-22

Go语言中怎么实现一个遗传算法

这期内容当中小编将会给大家带来有关Go语言中怎么实现一个遗传算法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Go语言坚决拥护组合(composition),同时也很反对继承的做法,在网络上引起了强烈的讨
2023-06-17

使用Python实现遗传算法的完整代码

这篇文章主要介绍了使用Python实现遗传算法,其本质是一种高效、并行、全局搜索的方法,自适应的控制搜索过程以求得最优解,需要的朋友可以参考下
2023-03-23

遗传算法详解及其MATLAB实现

遗传算法是一种用于优化问题的启发式搜索算法,它模拟自然界中的进化过程,通过遗传、交叉和变异等操作寻找问题的最优解。遗传算法的核心思想是通过不断的迭代,通过对候选解的适应度评估和选择,不断优化候选解的质量。遗传算法的基本步骤包括:1. 初始化
2023-09-14

怎么用Python遗传算法处理TSP问题

本文小编为大家详细介绍“怎么用Python遗传算法处理TSP问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Python遗传算法处理TSP问题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。TSP问题那么
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录