Python遗传算法搜索最优最短路径

程序示例精选
Python遗传算法搜索最优最短路径
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对《Python遗传算法搜索最优最短路径》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。


运行结果


文章目录

一、所需工具软件
二、使用步骤
       1. 主要代码
       2. 运行结果
三、在线协助

一、所需工具软件

       1. VS2019, Qt
       2. C++

二、使用步骤

代码如下(示例):

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

N_CITIES = 20  # DNA长度
CROSS_RATE = 0.1  # 交叉概率
MUTATE_RATE = 0.02  # 变异概率
POP_SIZE = 500  #种群大小
N_GENERATIONS = 500 # 迭代次数

class GA(object):
    def __init__(self, DNA_size, cross_rate, mutation_rate, pop_size, ):
        self.DNA_size = DNA_size
        self.cross_rate = cross_rate
        # 生成种群
        self.pop = np.vstack([np.random.permutation(DNA_size) for _ in range(pop_size)])

    def translateDNA(self, DNA, city_position):     # get cities' coord in order
        """
        这个方法的目的是将城市坐标按照 DNA 中的顺序排列,并将 x 坐标和 y 坐标分别存储在 line_x 和 line_y 中。
        :param DNA:  这里的DNA是pop_size个 不是一个
        :param city_position:
        :return:
        """
        line_y = np.empty_like(DNA, dtype=np.float64)    # 存放y轴的点
        for i, d in enumerate(DNA):     #根据DNA中的每个城市顺序获取坐标
            city_coord = city_position[d]   #根据d重新排列city_position的顺序得到city_coord
            line_x[i, :] = city_coord[:, 0]  # 将city_coord数组的第一列的值赋给line_x数组的第 i 行
            line_y[i, :] = city_coord[:, 1]

        return line_x, line_y

    def get_fitness(self, line_x, line_y):
        """
        获取适应度
        :param line_x:
        :param line_y:
        :return:
        """
np.sum(np.sqrt(np.square(np.diff(xs)) + np.square(np.diff(ys))))
        fitness = np.exp(self.DNA_size * 2 / total_distance)
        return fitness, total_distance

    def select(self, fitness):
        """

        :param fitness:
        :return:  返回一个心中群
        """
        idx = np.random.choice(np.arange(self.pop_size), size=self.pop_size, replace=True, p=fitness / fitness.sum())
        return self.pop[idx]

    def crossover(self, parent, pop):
        """
        交叉
        :param parent:
        :param pop:
        :return:

            # swap_city 通过布尔数组从 pop[i_] 中选取了不在 keep_city 中的城市编码。
            swap_city = pop[i_, np.isin(pop[i_].ravel(), keep_city, invert=True)]
            # 将 keep_city 和 swap_city 进行拼接,得到了新的子代个体的 DNA 序列,
            parent[:] = np.concatenate((keep_city, swap_city))
        return parent

    def mutate(self, child):
        """
        变异
        这里的变异是将DNA序列的两个点给交换一下
        :param child:
        :return:
        """
self.DNA_size)
                swapA, swapB = child[point], child[swap_point]
                child[point], child[swap_point] = swapB, swapA
        return child

    def evolve(self, fitness):
        """
        开始进化算法
        :param fitness:
        :return:
        """
        pop = self.select(fitness)
        pop_copy = pop.copy()
        for parent in pop:  # for every parent
            child = self.crossover(parent, pop_copy)
            child = self.mutate(child)
            parent[:] = child
        self.pop = pop


class TravelSalesPerson(object):
    """
    环境
    """
    def __init__(self, n_cities):
        self.city_position = np.random.rand(n_cities, 2)
        plt.ion()

    def plotting(self, lx, ly, total_d):
        plt.cla()
        plt.text(-0.05, -0.05, "Total distance=%.2f" % total_d, fontdict={'size': 20, 'color': 'red'})
        plt.xlim((-0.1, 1.1))
        plt.ylim((-0.1, 1.1))
        plt.pause(0.01)


if __name__ == '__main__':
    ga = GA(DNA_size=N_CITIES, cross_rate=CROSS_RATE, mutation_rate=MUTATE_RATE, pop_size=POP_SIZE)
    
    # 初始化环境
    env = TravelSalesPerson(N_CITIES)
    # 开始迭代
    for generation in range(N_GENERATIONS):
        lx, ly = ga.translateDNA(ga.pop, env.city_position)
        print('Gen:', generation, '| best fit: %.2f' % fitness[best_idx], )
        env.plotting(lx[best_idx], ly[best_idx], total_distance[best_idx])

    plt.ioff()
    plt.show()



运行结果


在这里插入图片描述

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!

1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
5)云服务器申请
6)网站制作

当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog

博主推荐:
Python人脸识别考勤打卡系统:
https://blog.csdn.net/alicema1111/article/details/133434445
Python果树水果识别https://blog.csdn.net/alicema1111/article/details/130862842
Python+Yolov8+Deepsort入口人流量统计:https://blog.csdn.net/alicema1111/article/details/130454430
Python+Qt人脸识别门禁管理系统:https://blog.csdn.net/alicema1111/article/details/130353433
Python+Qt指纹录入识别考勤系统:https://blog.csdn.net/alicema1111/article/details/129338432
Python Yolov5火焰烟雾识别源码分享:https://blog.csdn.net/alicema1111/article/details/128420453
Python+Yolov8路面桥梁墙体裂缝识别:https://blog.csdn.net/alicema1111/article/details/133434445

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
遗传算法是一种启发式优化算法,常用于解决优化问题,其中包括最短路径问题。在Python中,我们可以使用遗传算法来寻找最短路径。 首先,我们需要定义问题的适应度函数,即衡量每条路径的优劣程度。对于最短路径问题,适应度函数可以定义为路径的总长度。根据问题的具体情况,我们可以选择不同的路径选择策略,如选择较短的路径或者选择较长的路径。 接下来,我们需要定义基因表示和遗传操作。基因可以表示路径,并且可以使用列表来表示。例如,[1, 2, 3, 4, 5] 表示路径1→2→3→4→5。遗传操作包括选择、交叉和变异。选择操作根据适应度函数选择优秀的基因;交叉操作通过交换基因片段来产生新的个体;变异操作通过改变个体的基因来增加多样性。 然后,我们可以使用遗传算法的迭代过程来寻找最短路径。首先,生成一个初始种群,其中每个个体都是一个随机生成的基因。然后,计算每个个体的适应度,根据适应度选择优秀个体。接下来,使用交叉和变异操作产生新的个体,并更新种群。重复进行这个过程,直到达到预定的迭代次数或找到满意的最短路径。 最后,我们可以根据遗传算法的结果,选择适应度最优的个体,并将其基因转换为最短路径。通过分析遗传算法的结果,我们可以得到问题的最优解。 总结起来,使用Python实现遗传算法来求解最短路径问题包括定义适应度函数、选择合适的基因表示和遗传操作,以及设计迭代过程来搜索最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荷塘月色2

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值