最短路与动态规划(一)

2023-05-16

运筹学有时候面临的一种场景是求最短路(shortest path)问题:比如城市交通的网络设计,芯片的表面设计等。解决这类问题常用离散动态规划(discrete dynamic)方法。今天我们就来学习这种场景以及解决的算法。

1

抽象为模型

我们用三个与现实场景十分相似的例子来介绍模型以及相关术语。

  • 利特尔维尔交通规划

假设你是利特尔维尔城市的交通工程师,下图是该城市的市区街道规划图,图中标注了道路是单行道还是双向道,也标注了汽车通过每条街区所需要的平均时间(单位:秒).

从调查报告和其他数据中我们可以估计出出行居民的数量、出行的起点和终点,但是他们具体选择怎样的路径则不得而知。交通工程师的一项任务就是估计出居民所选择的路径,从而使得城市管理者能够估计出是否有某条道路会产生拥堵。

为了得到一个不错的初步估计,我们可以首先假设所有的出行居民都会做出理性的决策——也就是选择连接起点和终点的最短路径。因此,我们首先需要找到图中任意两点间的所有最短路径。

35ee941648a2beaff18a77cf4b41436c.png

要用数学来解决这个问题,首先,先将给定的街区系统抽象为图(graph)网络(network),图模型我们在机器学习的概率图一块给出了初步定义,在运筹学这里有稍微的不同,为了表达得清晰准确,我们定义:

节点表示网络中的实体、交点和转移点,为了方便,利特尔维尔例子的节点用1到10进行标号。节点之间可能被或者相连(弧特指有方向的边,比如这里用弧表示单向街道,边表示双向街道。

利特尔维尔例子转化为图,表示如下:

ae7f51c377fc818fcb1a75e77852393b.png

有了图,我们可以给路(path)下定义:

路是图中连接两个特定节点的一序列的弧或者边。在这个序列中,每条弧或者边与其前方的弧或者边有且只有一个共同点。在经过弧时,只能按照该条弧所标注的方向通过。同时,没有节点会被一条路重复经过

举个例子,利特尔维尔例子中,从节点3到节点8有很多路径,比如3-7-10-8和3-4-10-8,这两条都是路。而3-7-6-5-8不是路,因为(5,8)是弧,只能8-5;3-7-6-9-7-10-8也不是路,因为重复使用了节点7.

当一个实际问题的抽象图中的弧和边涉及成本或者长度时,我们就面临一个优化问题:最短路问题就是寻找图中两节点之间总长度最短的路的问题.

利特尔维尔案例是一种最短路问题类别,它有如下基本假设:

  • 图:弧和边

  • 成本:非负

  • 输出:最短路

  • 配对方式:所有节点与其他节点

除此之外,最短路问题涉及最多的还有额外两个类别,我们分别用例子说明。

  • 德克萨斯运输公司

下图展示了德克萨斯州内几个重要城市的高速公路连接图,边上标记的数字代表着标准的驾驶距离(单位:英里).

德克萨斯运输公司需要将货物从位于沃斯堡的中心仓库运送到图中其他所有城市去。卡车从仓库出发并直接开往目的地,在中途不会进行货物的装卸。司机们可以自主选择从沃斯堡到目的地的路径,但会根据从起点到终点的最短路径来给司机们发工资。为了明确这个提案对公司的影响,我们需要计算出仓库到所有城市的最短路的长度。

dbbd3281e62e128eb372dc801cd63cc0.png

德克萨斯运输公司的基本假设有:

  • 图:只有边

  • 成本:非负

  • 输出:最短路

  • 配对方式:一个起点到其他节点

  • “双环”马戏团

“双环”马戏团的表演临近演出尾声。他们计划回到塔拉哈西的总部。按照目前的安排,他们最后一场演出在林肯县结束,但如果返程途径的城市有提前预定的话,仍然有可能在当地加演。下图画出了可能的返程路径以及估计出的费用(单位:千美元)。图上还标注了在该城市出演预计可以得到的收益(单位:千美元)。我们希望能求出马戏团最优的返程路线,以达到收益最大化(这里的收益在节点产生)。

3610b00b132b6a9b39ed486690361166.png

这张原始的马戏团旅行网是一张无向图,首先要处理节点的收益,必须转化为等价的有向图,再将节点的收益“转嫁”到弧上。由于两个城市之间往返的路费是一样的,因此,对应有向图为:

2d486bb8db83a9116823da63c71cbfa0.png

从成本出发,将节点收益转移到弧上:将弧上的成本减去弧末端所在城市的利润。合并节点的“收益”,得到从一个城市到另一个城市的成本(这时候往返成本不一样):

e2734666c1bd2060a73bec7f8e75abbc.png

因为最短路只允许一个节点经过一次,因此这样计算的弧成本是正确的。“双环”马戏团的基本假设是:

  • 图:只有弧(有向图)

  • 成本:可正可负

  • 输出:最短路

  • 配对方式:一个起点到一个终点

上面的最短路模型可以归纳为两类:一对多多对多最短路问题。

2

动态规划

可以利用动态规划(dynamiic programming)的方法来解决上述提到的最短路径问题。为此,需要定义一些数学符号:

415108a4048b01c6869cbe247ca518c6.png

为了便于理解,举个例子。考虑下图从起点1到达其他所有节点的最短路问题。

8c23492b26f40547a010ad4af6e72dfd.png

根据定义,我们可以得到每个节点的最短路长度以及路径:

906409202a3da2fd298bf814d4feba0d.png

下面我们思考这个逻辑:对于德克萨斯州案例,从3到10的最短路径为3-8-7-10,这条路经过节点8和7,现在考虑从3到8的最短路,很显然只有3-7-8,不存在其他比这条更短的路,如果有,只需要沿着这条路先到达8,再到10即可,那么就会存在比原来更短从3到10的路。

因此,我们有结论:最优路径一定包含着最优的子路径(sub path)

但可惜,这个结论是有问题的。考虑下图的例子,从节点1到3的最短路是1-2-3,但从1到2的最短路是1-3-4-2.

3e019df6e42d97083dd93bded2dc1fdc.png

造成这样的现象的原因在于存在负权有向环路(negative dicycle):环路指的是起点和终点重合的路,负权环路指的是总长度为负的环路.

上图的3-4-2-3就是一个负权环路,总长度为-10.但幸运的是,负权环路是最短路问题中唯一难以解决的情况,因此,上面的结论更加精准的定义为:在一个没有负权环路的图中,最优路径一定包含着最优子路径

有了这个结论,我们可以利用动态规划的函数方程(functional equation)来梳理最短路问题的递归关系。我们用两个例子来说明这种思想。

  • 一个节点到其他节点的函数方程(一对多)

在一个没有负权环路的图中,从起点s到所有其他节点的最短路函数方程为:

bc5295531251f4d4f55cb0856dc8646f.png

以德克萨斯州运输为例子,要从3到4,经过计算比较可以得到:

81cd21c34c6a9269aa1563a17d3392a2.png

v[4]的最短路径为什么经过节点5?因为与4相连的只有节点2,5,6,若最短子路径经过节点2,那么距离只能是122+345或167+345,都比443长,节点6同样的道理,只能是5.

3a458b2c66607d02c35eef08013ceba9.png

  • 从所有节点到所有其他节点的函数方程(多对多)

在没有负权环路的图中,从所有节点到其他节点的最短路问题的函数方程为:

a002e13ff12eb64168a435ce8f707b08.png

这函数方程表明,从k到l的最短路要么包含了弧/边(k,l),要么就存在一个中介点i,最优路径包含从k到i的最短路加上从i到l的最短路。

举个例子,找出下图任意两点的最短路。

88688fac9baefac553ab82c705e791a5.png

利用观察,我们得到从节点i到节点j的最短路及其路径:

4bb8a162e1e026b7c2929c6b23f98d80.png

然后我们利用原理得到从节点1到4和2到3的最短路:

d783f0f35ec745b585c039b7c9a3582e.png

上面两个例子展现了动态函数方程的工作原理。但我们也可以发现,环路的存在会使得函数方程造成循环依赖的状况无法求解。为此,我们必须开发可以操作的算法来实现动态规划的这种思想。这些我们下一次介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最短路与动态规划(一) 的相关文章

  • CentOS8中使用Libreoffice7.3遇到的问题

    首先借鉴了这篇文章对Libreoffice进行了下载和安装 https blog csdn net UnicornRe article details 119677482 在本地的centos7环境中测试word转pdf是没有问题的 xff
  • UIImageView的基本使用

    UIImageView作为iOS开发里基本控件 xff0c 是我们第四个需要学习的 下面我来为大家介绍一下UIImageView的一些常用属性和它们的用法 这里附上UI控件演示的源码地址 xff1a https github com LOL
  • 如何使用Docker搭建PhotoPrism - 打造基于AI私有化的个人相册系统

    一 简介 PhotoPrism 是一款由人工智能驱动的应用程序 xff0c 用于浏览 组织和分享您的照片集 它利用最新技术自动标记和查找图片 您可以在家里 私人服务器或云端运行它 PhotoPrism对很多设备提供了支持 xff0c 包括M
  • Power Keys - 彻底解放电脑使用效率

    简介 Power Keys 是一款十分强大的 快速启动 系统辅助工具 xff0c 支持 Windows 与 macOS xff0c 它可以利用 F1 F12 43 字母或数字 来启动程序或打开网页等操作 xff0c 还拥有类似 VIM 编辑
  • Windows安装Gradle详细图文教程

    简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具 它使用一种基于Groovy的特定领域语言 DSL 来声明项目设置 xff0c 也增加了基于Kotlin语言的kotlin based D
  • CentOS7防火墙(Firewalld篇)

    一 防火墙设置 1 启用防火墙 systemctl start firewalld 2 关闭防火墙 systemctl stop firewalld 3 查看状态 systemctl status firewalld 4 开机启用防火墙 s
  • 9.图--拓补排序

    1 概念 无环图 xff1a 活动 2 拓补序列 xff1a 3 拓补排序 xff1a 对有向图构造拓补序列的过程 1 1 例子 比如有下表 xff0c 要学习 汇编语言 就需要先学习C1和C13课程 要将表画为AOV网图 xff1a 拓补
  • wxHelper使用教程

    方法介绍 前言1 工具介绍 x1f517 1 1 环境介绍1 2 功能介绍1 3 源码地址 2 使用说明 x1f517 2 1 Server说明2 2 引入jar包 3 方法介绍 x1f517 1 服务器配置 token验证 2 自定义菜单
  • go-mysql-elasticsearch 使用

    文档 github 链接 GitHub go mysql org go mysql elasticsearch Sync MySQL data into elasticsearch 参考博客 注意事项 go mysql elasticsea
  • docker快速搭建zookeeper集群

    一 准备工作 1 拉取zookeeper镜像 docker pull zookeeper docker tag docker io zookeeper zookeeper docker rmi docker io zookeeper 2 安
  • kafka优化配置,Kafka 的消费者客户端详解

    目录 前言 一 消费者与消费者组 1 1 图解消费者模型 1 2 消息投递模式 二 Kafka 消费者的应用 2 1 消费者客户端演示 2 2 必要参数配置 2 3 订阅主题与分区 三 消费位移 3 1 什么是偏移量 3 2 自动提交偏移量
  • php mysql mysqli取出的数据都成了string

    mysqli是可以获取数据库中的数据类型的 xff0c 但是默认并没有开启 需要设置option参数 MYSQLI OPT INT AND FLOAT NATIVE function construct database username
  • centOS7下安装GUI图形界面

    1 如何在centOS7下安装GUI图形界面 当你安装centOS7服务器版本的时候 xff0c 系统默认是不会安装GUI的图形界面程序 xff0c 这个需要手动安装CentOS7 Gnome GUI包 2 在系统下使用命令安装gnome图
  • nginx反向代理配置和文件上传ab压测

    安装nginx apt get install y nginx 配置 nginx 查看自己服务器ip curl ip sb vim etc nginx conf d cdn conf server listen 80 server name
  • docker 日常命令小笔记

    目录 常见命令 启动并启动日志 进入容器 dockerfiles apk 命令 编辑网卡centos 重启网卡 查看防火墙的状态 关闭防火墙 xff1a 查看网络ip 查看端口 杀端口 查找php ini位置 安装bcmath扩展 安装ac
  • Wsl2 ubuntu 配置git 阿里云codeup

    目录 创建一个跟你windows git使用相同的用户名 特别重要 配置git 用户名和邮箱 配置阿里云codeup 拉取仓库提示文件权限问题 给用户目录权限 配置项目文件别名 key load public invalid format
  • Docker tarsgo

    目录 参考 xff1a mysql镜像安装 一 安装镜像 二 创建mysql容器 使用 tarscloud framework 部署框架 拉取最新版本镜像 启动镜像 目前只考虑了 linux 上 时间和本机同步 目录说明 参数解释 Dock
  • go-zero使用consul作为注册中心

    目录 在rpc服务中添加配置 导入包 xff1a 在rpc服务中添加配置 xff1a 引入 Consul config 配置项 user yml 文件 修改 user go 将 rpc注册到consul rpc的发现 在api服务中添加配置
  • docker-compose搭建consul集群环境

    目录 consul基本概念 server模式启动的命令行参数 使用docker compose来搭建如下的consul集群环境 编辑docker compose yml文件 启动服务 常用命令 注册配置中心例子 yml KV访问的例子 co
  • WSL ubuntu sshd: no hostkeys available -- exiting.

    最好在root权限下执行 1 查看sshd 报错情况 如果配置有问题及时修改配置 我之前有行配置有问题 usr sbin sshd T 2 再次执行提示 sshd no hostkeys available exiting 启动sshd失败

随机推荐

  • win10下 WSL2安装及配置

    目录 一 Windows中WSL2 xff08 子系统 xff09 安装前提条件 二 Windows中WSL2 xff08 子系统 xff09 安装步骤 xff08 默认安装C盘 xff09 选择包安装模式 选择到其他盘安装 三 Windo
  • wsl2 docker 安装

    一 更换镜像源 备份默认源 xff1a cp etc apt sources list etc apt sourses list bak 编辑文件 xff1a vim etc apt sources list 删除原有内容并替换为 xff1
  • wsl2 ubuntu安装golang

    目录 下载 golang 导入 wsl 代码 打开一个新项目 一直加载 go list m json all Debug 提示gcc 不存在 在 Ubuntu 20 04 上安装 GCC 环境变量消失 编辑器里面包报红 先给权限 选择项目的
  • 如何使用VNC Viewer连接远程CentOS服务器

    连接WIndows服务器可以使用Windows自带的远程桌面连接 xff0c 但连接Linux服务器它就不灵了 这里就讲一下Windows7下如何使用VNC Viewer连接远程CentOS服务器 注意 xff1a 服务器上必须安装了VNC
  • go-zero rpc直连配置和postman请求rpc

    go zero 默认是支持 rpc 直连接的 无需配置 当然我问他官方群里大佬说是可以参考 go zero lock lock 有示例 后续再研究吧 搜搜关键词 go zero服务端使用endpoints配置rpc直连 在 go zero
  • Phpunit php7.0.9 phpstrom笔记

    目录 安装 命令行 环境变量设置 测试代码 断言函数 用法参考 下载关包 安装 命令行 composer require dev phpunit phpunit 5 7 27 如果引入失败 自行解决compose源的问题 环境变量设置 pa
  • golang 云效私有模块依赖拉取配置

    目录 相关文档 go 环境变量配置 凭证设置 Linux MacOS Windows 代码发版 新建版本 执行 go get go mod 生成 代码使用引入 docker容器中没有凭证配置 相关文档 阿里官方文档 go 环境变量配置 ex
  • 【旁门Python03】如何正确使用Python logging库

    前言 距离上一篇博客也是一年半过去了 xff0c 真的是鸽了非常久 最近在学习一个开源项目的时候对logging有了更深的理解 xff0c 决定上班摸鱼写篇博客来讲讲 logging库的好处 python新手可能会觉得 xff1a 我有pr
  • Linux系统中两种安装go环境的方法

    在Linux系统中安装go环境 下面介绍两种方法 一 基于Debian的发行版本 xff0c 使用apt get安装go环境 1 安装命令 xff1a sudo apt get install golang 2 设置环境变量 有三个变量GO
  • Mysql5.7版本中,查询分组GROUP BY通过子查询中ORDER BY进行排序无效的问题解决办法

    前言 xff1a 使用场景 xff0c 查询用户所访问的同一个客服的列表 xff0c 但是存在多次访问的情况 xff0c 这时候就需要使用分组 xff0c 获取客户访问的所有客服 且通过子查询提前将交互时间 xff08 最后一次访问客服时间
  • 在MAC上快速升级GO版本

    只需三步 xff0c 在MAC迅速完成升级GO版本 1 删除原有版本 xff08 1 xff09 查看go的安装路径 which go xff08 2 xff09 执行删除 xff0c 一般路径是 usr local go bin go r
  • PHP使用chilkat入门教程

    前言 xff1a 我们需要先确认自己的版本 xff0c 在PHP中 xff0c 可以利用phpinfo 函数来查看php是ts版本还是nts版本 xff0c 该方法可以展示出当前phpinfo信息 xff0c 若 Thread Safety
  • Go 语言中的 Chilkat 入门(Linux 64 位)

    这是在 Go 编程语言中使用 Chilkat 获得 Hello World 的演练 我们将从头开始 xff0c 下载 Go 并运行一个简单的 Hello World Go 示例 然后我们将安装 Chilkat 并构建和运行示例程序 1 我的
  • phpstudy出现80端口被占用,占用进程为system

    背景 公司分配的电脑是还未离职的另外一位同事 主管要求我不能重装电脑 问题 使用这台电脑的phpstudy环境发现所调用的接口是9096端口 xff0c 在站点域名配置的时候发现一个很麻烦的问题 xff0c 就是在hosts文件设置127
  • Centos7安装vmware workstation

    VMware Workstation在windows环境中大家都会安装 xff0c 但是如何在Linux环境下安装呢 xff1f 1 你需要下载vmware workstation的Linux的安装包 xff0c 下载完后是个 bundle
  • QtCreator 远程调试 (win10亲测)

    一 终端设备环境搭架 实测终端设备是windows8 1 windows10都测试成功 xff1b 1 安装WinDbg xff0c 使用winDbg中的cdb exe来启动远程调试服务 xff1b 可下载Windows Kits进行安装D
  • VSCode 使用教程-3.设置主题文件图标与字体大小

    前言 VSCode 可以根据自己的喜好设置不同的主题 xff0c 字体大小也可以调整 设置主题 点开设置 颜色主题 按上下键可以切换主题 xff0c 看到预览效果 选好自己喜欢的主题 xff0c 点击就设置成功了 设置字体大小 编辑界面默认
  • ping 超时原因

    ping超时 xff0c 不通 xff0c 没结果主要有三方面参考 xff1a 网站服务器真的不通 xff0c 服务器出现故障了 xff0c 要联系服务器管理员处理 客户端电脑与服务器之间 xff0c 网络设备出现故障 xff0c 要通过路
  • 使用Rclone实现网盘挂载

    使用Rclone实现网盘挂载 xff08 Windows xff09 一 为啥要用Rclone 最近发现了一个 好 工具 RaiDrive 这是一款能够将一些网盘映射为本地网络磁盘的工具 xff0c 支持 Google Drive Goog
  • 最短路与动态规划(一)

    运筹学有时候面临的一种场景是求最短路 xff08 shortest path xff09 问题 xff1a 比如城市交通的网络设计 xff0c 芯片的表面设计等 解决这类问题常用离散动态规划 xff08 discrete dynamic x