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

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

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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

小编给大家分享一下如何使用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地图四色原理的遗传算法着色”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

    免责声明:

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

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

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

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

    下载Word文档

    猜你喜欢

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

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

    python如何实现使用遗传算法进行图片拟合

    小编给大家分享一下python如何实现使用遗传算法进行图片拟合,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引言算法思路假设我们有这样一个生物族群,他们的每个基因片段都是一个个三角形(即只含三个点和颜色信息),他们每个个体
    2023-06-29

    编程热搜

    • 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动态编译

    目录