返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用Python地图四色原理的遗传算法着色
  • 194
分享到

如何使用Python地图四色原理的遗传算法着色

2023-06-29 02:06:02 194人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

小编给大家分享一下如何使用python地图四色原理的遗传算法着色,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 任务需求  

小编给大家分享一下如何使用python地图四色原理的遗传算法着色,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    1 任务需求

      首先,我们来明确一下本文所需实现的需求。

      现有一个由多个小图斑组成的矢量图层,如下图所示;我们需要找到一种由4种颜色组成的配色方案,对该矢量图层各图斑进行着色,使得各相邻小图斑间的颜色不一致,如下下图所示。

    如何使用Python地图四色原理的遗传算法着色

    如何使用Python地图四色原理的遗传算法着色

      在这里,我们用到了四色定理(Four Color Theorem),又称四色地图定理(Four Color Map Theorem):如果在平面上存在一些邻接的有限区域,则至多仅用四种颜色来给这些不同的区域染色,就可以使得每两个邻接区域染的颜色都不一样。

    2 代码实现

      明确了需求,我们就可以开始具体的代码编写。目前国内各大博客中,有很多关于Python实现地图四色原理着色的代码,其中大多数是基于回溯法来实现的;而在一个英文博客网页中,看到了基于遗传算法的地图四色原理着色实现。那么就以该代码为例,进行操作。在这里,由于我本人对于遗传算法的理解还并不深入,因此在代码介绍方面或多或少还存在着一定不足,希望大家多多批评指正。

    2.1 基本思路

      遗传算法是一种用于解决最佳化问题的搜索算法,属于进化算法范畴。结合前述需求,首先可以将每一个区域的颜色作为一个基因,个体基因型则为全部地区(前述矢量图层共有78个小图斑,即78个区域)颜色基因的汇总;通过构建Rule类,将空间意义上的“相邻”转换为可以被遗传算法识别(即可以对个体基因改变加以约束)的信息;随后,结合子代的更替,找到满足要求的基因组;最终将得到的基因组再转换为空间意义上的颜色信息,并输出结果。

      具体分步骤思路如下:

    定义“规则”。“规则”用以将区域之间的空间连接情况转换为遗传算法可以识别的信息;被“规则”连接的两个区域在空间中是相邻的。定义区域空间连接情况检查所需函数。这些函数用于检查两两区域之间的连接性是否满足逻辑;例如,若在“规则”中显示区域A与区域B连接,那么区域B也必须在“规则”中显示与区域A连接。定义个体基因型。其中,各个体具有78个基因,每一个基因表示一个区域的颜色。个体更替与最优基因选择。通过个体的不断更迭,选择出满足“规则”要求的个体基因型。基因型解释。将得到的个体基因型进行解释,相当于第一步的反过程,即将基因信息转换为空间连接情况。结果检查。检查所得到的颜色与最优个体基因组中的各个基因是否一致。 2.2 代码讲解

      接下来,将完整代码进行介绍。其中,shapefile_path即为矢量图层的保存路径;"POLY_ID_OG"则为矢量图层的属性表中的一个字段,其代表每一个小图斑的编号。

    # -*- coding: utf-8 -*-"""Created on Sun Oct 31 19:22:33 2021@author: Chutj"""import geneticimport unittestimport datetimefrom libpysal.weights import Queenshapefile_path="G:/Python_Home1/stl_hom_utm.shp"weights=Queen.from_shapefile(shapefile_path,"POLY_ID_OG")one_neighbor_other=weights.neighbors# 定义“规则”,用以将区域之间的空间连接情况转换为遗传算法可以识别的信息。被“规则”连接的两个区域在空间中是相邻的class Rule:    Item = None    Other = None    Stringified = None     def __init__(self, item, other, stringified):        self.Item = item        self.Other = other        self.Stringified = stringified     def __eq__(self, another):        return hasattr(another, 'Item') and \               hasattr(another, 'Other') and \               self.Item == another.Item and \               self.Other == another.Other     def __hash__(self):        return hash(self.Item) * 397 ^ hash(self.Other)     def __str__(self):        return self.Stringified# 定义区域空间连接情况检查所需函数,用以确保区域两两之间相邻情况的准确def buildLookup(items):    itemToIndex = {}    index = 0    for key in sorted(items):        itemToIndex[key] = index        index += 1    return itemToIndex def buildRules(items):    itemToIndex = buildLookup(items.keys())    rulesAdded = {}    rules = []    keys = sorted(list(items.keys()))     for key in sorted(items.keys()):        keyIndex = itemToIndex[key]        adjacenTKEys = items[key]        for adjacentKey in adjacentKeys:            if adjacentKey == '':                continue            adjacentIndex = itemToIndex[adjacentKey]            temp = keyIndex            if adjacentIndex < temp:                temp, adjacentIndex = adjacentIndex, temp            ruleKey = str(keys[temp]) + "->" + str(keys[adjacentIndex])            rule = Rule(temp, adjacentIndex, ruleKey)            if rule in rulesAdded:                rulesAdded[rule] += 1            else:                rulesAdded[rule] = 1                rules.append(rule)     for k, v in rulesAdded.items():        if v == 1:            print("rule %s is not bidirectional" % k)     return rules# 定义颜色所代表的基因组colors = ["Orange", "Yellow", "Green", "Blue"]colorLookup = {}for color in colors:    colorLookup[color[0]] = colorgeneset = list(colorLookup.keys())# 定义个体基因型,其中各个体有78个基因,每一个基因代表一个区域。个体基因需要满足“规则”中相邻的区域具有不同的颜色class GraphColoringTests(unittest.TestCase):    def test(self):        rules = buildRules(one_neighbor_other)        colors = ["Orange", "Yellow", "Green", "Blue"]        colorLookup = {}        for color in colors:            colorLookup[color[0]] = color        geneset = list(colorLookup.keys())        optimalValue = len(rules)        startTime = datetime.datetime.now()        fnDisplay = lambda candidate: display(candidate, startTime)        fnGetFitness = lambda candidate: getFitness(candidate, rules)        best = genetic.getBest(fnGetFitness, fnDisplay, len(one_neighbor_other), optimalValue, geneset)        self.assertEqual(best.Fitness, optimalValue)         keys = sorted(one_neighbor_other.keys())         for index in range(len(one_neighbor_other)):            print(keys[index]," is ",colorLookup[best.Genes[index]])# 输出各区域颜色def display(candidate, startTime):    timeDiff = datetime.datetime.now() - startTime    print("%s\t%i\t%s" % (''.join(map(str, candidate.Genes)), candidate.Fitness, str(timeDiff)))# 检查各区域颜色是否与个体基因所代表的颜色一致    def getFitness(candidate, rules):    rulesThatPass = 0    for rule in rules:        if candidate[rule.Item] != candidate[rule.Other]:            rulesThatPass += 1     return rulesThatPass# 运行程序GraphColoringTests().test()

    2.3 结果展示

    &emsp;&emsp;执行上述代码,即可得到结果。在这里值得一提的是:这个代码不知道是其自身原因,还是我电脑的问题,执行起来非常慢&mdash;&mdash;单次运行时间可能在5 ~ 6个小时左右,实在太慢了;大家如果感兴趣,可以尝试着能不能将代码的效率提升一下。

    &emsp;&emsp;代码执行完毕后得到的结果是文字形式的,具体如下图所示。

    如何使用Python地图四色原理的遗传算法着色

    &emsp;&emsp;可以看到,通过203次迭代,找到了满足要求的地图配色方案,用时06小时06分钟;代码执行结果除显示出具体个体的整体基因型之外,还将分别显示78个小区域(小图斑)各自的具体颜色名称(我上面那幅图没有截全,实际上是78个小区域的颜色都会输出的)。

    &emsp;&emsp;当然,大家也可以发现,这种文字表达的代码执行结果显然不如直接来一幅如下所示的结果图直观。但是,由于代码单次执行时间实在是太久了,我也没再腾出时间(其实是偷懒)对结果的可视化加以修改。大家如果感兴趣的话,可以尝试对代码最终的结果呈现部分加以修改&mdash;&mdash;例如,可以通过Matplotlib库的拓展&mdash;&mdash;Basemap库将78个小区域的配色方案进行可视化。

    如何使用Python地图四色原理的遗传算法着色

    以上是“如何使用Python地图四色原理的遗传算法着色”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网Python频道!

    --结束END--

    本文标题: 如何使用Python地图四色原理的遗传算法着色

    本文链接: https://lsjlt.com/news/321993.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 如何使用Python地图四色原理的遗传算法着色
      小编给大家分享一下如何使用Python地图四色原理的遗传算法着色,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 任务需求&emsp;&emsp;...
      99+
      2023-06-29
    • Python地图四色原理的遗传算法着色实现
      目录1 任务需求2 代码实现2.1 基本思路2.3 结果展示总结1 任务需求   首先,我们来明确一下本文所需实现的需求。   现有一个由多个...
      99+
      2024-04-02
    • 如何使用Python实现遗传算法
      本篇内容介绍了“如何使用Python实现遗传算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!遗传算法是模仿自然界生物进化机制发展起来的随机...
      99+
      2023-07-05
    • python遗传算法之geatpy如何安装使用
      这篇文章主要介绍了python遗传算法之geatpy如何安装使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python遗传算法之geatpy如何安装使用文章都会有所收获,下面我们一起来看看吧。1. geat...
      99+
      2023-07-06
    • python如何实现使用遗传算法进行图片拟合
      小编给大家分享一下python如何实现使用遗传算法进行图片拟合,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引言算法思路假设我们有这样一个生物族群,他们的每个基因片段都是一个个三角形(即只含三个点和颜色信息),他们每个个体...
      99+
      2023-06-29
    • 如何使用Colorer Take Eclipse的语法着色插件
      如何使用Colorer Take Eclipse的语法着色插件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Colorer Take 能为在Eclipse中打开...
      99+
      2023-06-17
    • 如何使用python opencv实现灰度图和彩色图的互相转换
      这篇文章将为大家详细讲解有关如何使用python opencv实现灰度图和彩色图的互相转换,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。opencv灰度图和彩色图互相转换如果摄像头本来就得到3维...
      99+
      2023-06-28
    • 如何使用Python和Django处理编程中的算法问题?
      Python和Django是当前最受欢迎的编程语言和Web框架之一。它们提供了强大的工具和库,使得处理算法问题变得更加容易和高效。本文将介绍如何使用Python和Django处理编程中的算法问题。 一、 Python和Django的优势 P...
      99+
      2023-11-03
      日志 django 编程算法
    • 如何使用 Python 接口实现 LeetCode 算法的自然语言处理?
      LeetCode 是一个非常流行的算法学习和练习平台。许多人使用 LeetCode 来提高他们的算法能力,并在各种面试中表现出色。但是,有时候,只有解决问题是不够的,还需要清晰地表达你的思路和解法。这就需要自然语言处理的技能了。本文将介绍...
      99+
      2023-08-16
      自然语言处理 接口 leetcode
    • 如何在Linux系统上使用Python进行大数据处理的编程算法设计?
      随着科技的不断发展,大数据技术已经成为了当今时代的重要组成部分。而Python作为一种高效、易于学习的编程语言,也成为了大数据处理的重要工具之一。本文将介绍如何在Linux系统上使用Python进行大数据处理的编程算法设计。 一、安装Py...
      99+
      2023-08-11
      linux 大数据 编程算法
    • 如何使用Python中的函数式编程思想优化复杂的数据处理逻辑和算法
      使用Python中的函数式编程思想优化复杂的数据处理逻辑和算法导言:函数式编程是一种编程范式,它强调将计算视为数学函数的求值,避免使用可变状态和可变数据。Python作为一种多范式的编程语言,支持函数式编程,并提供了一些工具和库来帮助开发者...
      99+
      2023-10-22
      算法优化 Python函数式编程 数据处理优化
    • 如何使用Python中的内存管理技巧和优化算法提高代码性能和资源利用率
      如何使用Python中的内存管理技巧和优化算法提高代码性能和资源利用率引言:Python作为一种高级编程语言,以其简洁、易读的语法和强大的功能而受到广泛的应用。然而,由于其动态类型和垃圾收集机制的特性,Python在内存管理方面可能存在一些...
      99+
      2023-10-27
      内存管理 性能提升 优化算法
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作