一.前言
在优化问题中,网络模型是很重要的一类问题,各种物流配送计划、供应链管理、公路网络设计等等问题都可以简化为网络模型。从这里开始,我们会进入基本网络模型,回顾最短路径、最大流量、最小费用流、最小生成树等网络模型中的基本问题。
二.最短路径问题描述
最短路径问题是在给定权的有向图或无向图中,从连接两个节点的边上寻找权数之和最小的路径的问题。
三.最短路径问题示例
示例问题如图所示:
每条边上显示该边的长度,求从节点1到节点10的最短路径
三.遗传算方法求解最短路径问题
1.个体编码
- 一种编码方案是使用二进制序列对边进行编码,为每条边分配一个二进制变量,为1代表选择该边加入路径,为0则代表不选择该边。但是这样的编码方式会生成大量的不可行解,相对于搜索空间,可行域极小,难以找到可行解。
- 一种编码方案是用优先度对节点进行编码:要想获得一条可行路径,需要从起始节点到结束节点依次将有路径连接的相邻接点放入备选解中。而每一次沿路径前进中可能会有多个节点作为下一步选择,节点的优先度就代表了在有多个选项的下一个节点中,要选择哪个节点放入备选解
2.代码实现
遗传算法操作:
- 个体编码-用优先度对个体进行编码
- 评价函数-用字典保存每条路径的长度,根据路径索引对应长度,对求得路径长度加和作为评价函数,此时为最小化问题。
- 育种选择:锦标赛选择
- 变异算法:交叉-有序交叉,突变-乱序突变
- 环境选择:子代完全代替父代,无精英保留
#!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