【线性规划】基于python的最短路径线性规划

这篇具有很好参考价值的文章主要介绍了【线性规划】基于python的最短路径线性规划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

1. 案例介绍

2. 整数规划模型构建

2.1. 梳理模型思路

2.2. 构建自变量

2.3. 构建目标函数

2.4. 构建约束条件

3. 基于Python+Pulp求解实现

3.1. 构建有向图处理类

3.2. 建立整数规划模型

3.3. 带入案例中的有向图数据

3.4. 查看最优路径


前言

最短路问题(shortest path problem, SSP)是图论的经典问题之一,基本内容是:在一个由边和点组成的有向图(or无向图)中,基于每一条边的属性(比如长度、成本、时间等),寻找两点之间总权最小的路径问题。

最短路问题的求解方法有很多,比如Dijkstra算法、Ford算法等,本文主要介绍整数规划解法。


1. 案例介绍

图1是一个由边和点组成的有向图,其中每一条边都有相应的权重,求从起点A到终点G的最短路径

python 路径规划,线性规划,python,算法,动态规划


2. 整数规划模型构建

2.1. 梳理模型思路

如图1所示,从A到G的任意一条路径如下,左图是有向图中该路径涉及的点与线,右图是剩余的点与线,先定义两个概念:

  • 点入集:进入该点的线的集合
  • 点出集:离开该点的线的集合

可发现以下几点:

  • 选择某条路径时,起点的点出集中被选择的线数量-点入集的 = 1
  • 选择某条路径时,终点的点出集中被选择的线数量-点入集的 = -1
  • 选择某条路径时,其余点的点出集中被选择的线数量-点入集的 = 0
  • 未选择的点,其余点的点出集中被选择的线数量-点入集的 = 0

因此,可以根据以上四点特点,建立线性优化模型和约束函数

python 路径规划,线性规划,python,算法,动态规划 python 路径规划,线性规划,python,算法,动态规划
该路径涉及的点与线 某路径未涉及的点与线

2.2. 构建自变量

设二元变量,表示点到点的线条是否被最优路径选中 

python 路径规划,线性规划,python,算法,动态规划

2.3. 构建目标函数

基于路径中所有线条的加权和最小构建整数规划的目标函数

python 路径规划,线性规划,python,算法,动态规划

式中,表示线条权重,表示所有线条的集合

2.4. 构建约束条件

设点的点出集为,点的点入集为,且;为所有点整理出,针对各个点建立约束条件:

python 路径规划,线性规划,python,算法,动态规划


3. 基于Python+Pulp求解实现

3.1. 构建有向图处理类


class CaseData:

    def __init__(self, edgeMap):
        # key-边编号,value-边权重
        self.edgeMap = edgeMap
        # 边编号集合
        self.edges = list(self.edgeMap.keys())
        # 点编号集合
        self.plots = self._getPlots() 
        # 起点与终点(也可随意选一点)
        self.startPlot = self._getStartSpot()
        self.endPlot = self._getEndSpot()
        # key-plot,value-{"out": 边的列表,"in": 边的列表}
        self.plotMap = self._getPlotMap()

    def _getPlotMap(self):
        plotMap = {}

        for plot in self.plots:
            if plot not in plotMap.keys():
                plotMap[plot] = {"out": [], "in": []}
            for edge in self.edges:
                if plot == edge[0]:
                    plotMap[plot]["out"].append(edge)
                elif plot == edge[-1]:
                    plotMap[plot]["in"].append(edge)
        return plotMap

    def _getPlots(self):
        plots = set()
        for edge in self.edges:
            for plot in list(edge):
                plots.add(plot)
        return list(plots)

    def _getStartSpot(self):
        startPlots = copy.copy(self.plots)
        for edge in self.edges:
            if edge[-1] in startPlots:
                startPlots.remove(edge[-1])
        return startPlots[0]

    def _getEndSpot(self):
        startPlots = copy.copy(self.plots)
        for edge in self.edges:
            if edge[0] in startPlots:
                startPlots.remove(edge[0])
        return startPlots[0]

3.2. 建立整数规划模型


class SppProgram:

    def __init__(self, problemType=None):
        self.setProblemType = "min" if problemType is None else problemType
        self.lpStatus = None
        self.varValuesMap = {}
        self.objectValue = None

    def setSppModel(self, caseData):
        # 1. 建立问题
        prob = LpProblem("最短路问题", LpMinimize) if self.setProblemType == "min" else LpProblem("最短路问题", LpMaximize)

        # 2. 建立变量(以列表形式建立多个变量,变量名为边名)
        edges = caseData.edges
        vars = LpVariable.dicts("x", edges, cat="Binary")

        # 3. 目标函数
        prob += lpSum(caseData.edgeMap[_] * vars[_] for _ in caseData.edges), "路径总权重"

        # 4. 约束条件
        for plot in caseData.plots:
            if plot == caseData.startPlot:
                prob += lpSum(vars[_] for _ in caseData.plotMap[plot]["out"]) - \
                         lpSum(vars[_] for _ in caseData.plotMap[plot]["in"]) == 1, "起点"
            elif plot == caseData.endPlot:
                prob += lpSum(vars[_] for _ in caseData.plotMap[plot]["out"]) -\
                         lpSum(vars[_] for _ in caseData.plotMap[plot]["in"]) == -1, "终点"
            else:
                prob += lpSum(vars[_] for _ in caseData.plotMap[plot]["out"]) -\
                         lpSum(vars[_] for _ in caseData.plotMap[plot]["in"]) == 0

        # 5. 求解
        prob.solve()

        # 6. 保存求解状态
        self.lpStatus = LpStatus[prob.status]

        # 7. 保存每个变量的最优值
        for varName in prob.variables():
            self.varValuesMap[varName] = varName.varValue

        # 8. 保存最优解的目标函数值
        self.objectValue = value(prob.objective)

3.3. 带入案例中的有向图数据


if __name__ == "__main__":
    edgeMap = {"AB": 10, "AC": 21, "AD": 12,
               "BD": 21, "BE": 32,
               "CF": 15,
               "DC": 8, "DG": 50,
               "EG": 17,
               "FG": 11}
    caseData = CaseData(edgeMap=edgeMap)

    lpModel = SppProgram("min")
    lpModel.setSppModel(caseData=caseData)

    # 输出最优解路径集
    varValuesMap = lpModel.varValuesMap    
    print([_ for _ in varValuesMap.keys() if varValuesMap[_] == 1])

3.4. 查看最优路径

python 路径规划,线性规划,python,算法,动态规划

即最优路径为:AD→DC→CF→FG

注意:当存在多个最优解时,Pulp无法返回所有最优解,只会选择其中之一为最优解

案例与代码文件下载链接:https://download.csdn.net/download/ennnnnnnnnnnnnnn/87441544文章来源地址https://www.toymoban.com/news/detail-635660.html

到了这里,关于【线性规划】基于python的最短路径线性规划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 线性规划模型(数学建模python版)

    线性规划模型(数学建模python版)

    前言:本篇文章只涉及问题的应用层面(如何调用包调用函数,如何把问题归结为一般形式方便使用第三方库中的函数求解),不涉及问题的具体求解原理。 首先回顾一下高中学过的线性规划:求一个线性目标函数在先行可行域内的 最值问题。 高中遇到的问题:配送运输问

    2024年02月20日
    浏览(10)
  • 数学建模 (线性规划 python代码 两种)

    数学建模 (线性规划 python代码 两种)

    线性规划(Linear Programming,LP)是一种数学优化方法,用于解决一类特定类型的最优化问题。该问题的目标是在给定的一组线性约束条件下,找到使某个线性目标函数达到最大或最小的变量值。线性规划问题可以表示为以下标准形式: 最小化(或最大化):Z = c^T * x 约束条件

    2024年04月14日
    浏览(12)
  • 数学建模--线性规划方法的Python实现

    目录   1.算法求解问题   2.算法求解思路   3.算法求解代码   4.算法求解结果   

    2024年02月09日
    浏览(14)
  • 数学模型:Python实现非线性规划

    上篇文章:整数规划 文章摘要:非线性规划的Python实现。 参考书籍:数学建模算法与应用(第3版)司守奎 孙玺菁。 PS:只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现:可以参考1.最优化模型与算法——基于Python实现 渐令 粱锡军2.算法导论(原书第3版)

    2024年02月08日
    浏览(10)
  • python数学建模--线性规划问题案例及求解

    python数学建模--线性规划问题案例及求解

    本博客参考: 《python数学实验与建模》 《MATLAB数学建模经典案例实战》 m a x   z = 8 x 1 − 2 x 2 + 3 x 3 − x 4 − 2 x 5 { x 1 + x 2 + x 3 + x 4 + x 5 ≤ 400 x 1 + 2 x 2 + 2 x 3 + x 4 + 6 x 5 ≤ 800 2 x 1 + x 2 + 6 x 3 ≤ 200 x 3 + x 4 + 5 5 ≤ 200 0 ≤ x i ≤ 99 , i = 1 , 2 , 3 , 4 x 5 ≥ − 10 max z=8x_1-2x_2+3x_3-x_

    2023年04月13日
    浏览(12)
  • 数学建模__非线性规划Python实现

    数学建模__非线性规划Python实现

    线性规划指的是目标模型均为线性,除此以外的都是非线性规划,使用scipy提供的方法对该类问题进行求解。

    2024年02月07日
    浏览(15)
  • 【数学建模】Python+Gurobi求解非线性规划模型

    目录 1 概述 2 算例  2.1 算例 2.2 参数设置 2.3 Python代码实现 2.4 求解结果 如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。 参考:(非线性规划Python)计及动态约束及节能减排环保要求的经济调度 2.1 算例 2.2 参数设置 求解NLP/非凸问题时,

    2024年02月09日
    浏览(10)
  • 配电网可靠性评估(4)—(顶刊复现)基于线性规划的配电网可靠性评估

    配电网可靠性评估(4)—(顶刊复现)基于线性规划的配电网可靠性评估

            之前的博客中介绍了配电网可靠性评估的三种方法、分别是解析法中的最小路法,以及序贯蒙特卡罗模拟法及非序贯蒙特卡洛模拟法,顺带提到了含有分布式电源的配电网可靠性评估方法。 配电网可靠性评估(一)最小路法和非序贯蒙特卡洛模拟法 配电网可靠性评

    2024年02月08日
    浏览(10)
  • ✨使用Python进行线性规划求解,高端操作亮瞎你的双眼(文末技术彩蛋)

    ✨使用Python进行线性规划求解,高端操作亮瞎你的双眼(文末技术彩蛋)

    各位童鞋们大家好,我是小小明,前几天我给大家分享了一个SMT求解器z3,链接地址见: https://xxmdmst.blog.csdn.net/article/details/120279521 虽然SMT求解器很强大,能够解逻辑题、解数独、解方程、甚至解决逆向问题,但是有个缺点就是只能找出一个可行解,如果我想要找出可行解的

    2023年04月09日
    浏览(7)
  • 数学建模整理-线性规划、整数规划、非线性规划

    数学建模整理-线性规划、整数规划、非线性规划

    在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济 效益的问题。若目标函数及约束条件均为线性函数,则称为线性规划(Linear Programming 简记 LP)。 可行解 :满足约束条件的解。 可行预 :所有可行解构成的集合称为问题的可行域,记为R。 图解法

    2024年02月06日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包