基于DEAP库的python进化算法--遗传算法实践--最短路径问题

一.前言

在优化问题中,网络模型是很重要的一类问题,各种物流配送计划、供应链管理、公路网络设计等等问题都可以简化为网络模型。从这里开始,我们会进入基本网络模型,回顾最短路径、最大流量、最小费用流、最小生成树等网络模型中的基本问题。

二.最短路径问题描述

最短路径问题是在给定权的有向图或无向图中,从连接两个节点的边上寻找权数之和最小的路径的问题。
在这里插入图片描述

三.最短路径问题示例

示例问题如图所示:
在这里插入图片描述
每条边上显示该边的长度,求从节点1到节点10的最短路径
在这里插入图片描述

三.遗传算方法求解最短路径问题

1.个体编码
  1. 一种编码方案是使用二进制序列对边进行编码,为每条边分配一个二进制变量,为1代表选择该边加入路径,为0则代表不选择该边。但是这样的编码方式会生成大量的不可行解,相对于搜索空间,可行域极小,难以找到可行解。
  2. 一种编码方案是用优先度对节点进行编码:要想获得一条可行路径,需要从起始节点到结束节点依次将有路径连接的相邻接点放入备选解中。而每一次沿路径前进中可能会有多个节点作为下一步选择,节点的优先度就代表了在有多个选项的下一个节点中,要选择哪个节点放入备选解
    在这里插入图片描述
2.代码实现

遗传算法操作:

  1. 个体编码-用优先度对个体进行编码
  2. 评价函数-用字典保存每条路径的长度,根据路径索引对应长度,对求得路径长度加和作为评价函数,此时为最小化问题。
  3. 育种选择:锦标赛选择
  4. 变异算法:交叉-有序交叉,突变-乱序突变
  5. 环境选择:子代完全代替父代,无精英保留
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: liujie
@software: PyCharm
@file: 最短路径.py
@time: 2020/11/29 16:30
"""
import numpy as np
import matplotlib.pyplot as plt
import random
from deap import creator,tools,base

params = {
   
    'font.family':'serif',
    'figure.dpi':300,
    'savefig.dpi':300,
    'font.size':12,
    'legend.fontsize':'small'
}

plt.rcParams.update(params)

# 定义问题
creator.create('FitnessMin',base.Fitness,weights=(-1.0,))
creator.create('Individual',list,fitness = creator.FitnessMin)

# 生成序列编码-优先级序列
gen_size = 10
toolbox = base.Toolbox()
toolbox.register('Sequence',np.random.permutation,gen_size)
# 注册个体
toolbox.register('Individual',tools.initIterate,creator.Individual,toolbox.Sequence)
# 注册种群
toolbox.register('Population',tools.initRepeat,list,toolbox.Individual)

# 解码
# 存储每个节点的可行路径,用于解码
nodeDict = {
   '1':[2,3], '2':[3,4,5], '3':[5,6], '4':[7,8], '5':[4,6], '6':[7,9], '7':[8,9],
            '8':[9,10], '9':[10]}


def decode(ind):
    # 输入一个优先度序列之后,返回一条从节点1到节点10的可行路径
    path = [1]
    while not path[-1] == 10:
        curNode = path[-1]  # 当前所在节点
        toBeSelected = nodeDict[str(curNode)]  # 获取可以到达的下一个节点列表
        priority = np.asarray(ind)[np
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值