Dijkstra和动态规划
有人说Dijkstra也是动态规划。
它不是贪心吗?怎么变成动态规划了,是动态规划的话,那么就有状态,有状态方程。
将图中的顶点分成2个部分,已知最短路径的顶点集合U,不知最短路径的集合V-U
问题规模:就是U里面顶点个数
状态:已知最短路径长度:
状态方程如下:
如果v 在 U中:cdis[v] = dis[v]
如果v和U中某点u直连:cdis[v] =min(dis(u) + w(u,v))
其他情况:cdis[v] = inf
但是这个状态方程怎么去实现了,我们知道需要维护这个表cdis[v] ,这个就是备忘数组,遍历的i就是U里面的顶点个数,i++就是U里面的顶点增长,U里面的顶点怎么得来了?
贪心算法来了,每次取cdis[v]里面最小的点
为了取最小的点我们引入了优先级队列,不用优先级也可以,处理起来复杂一点,我们只把优于cdis里的结果放入优先级队列
优先级队列弹出的过程也就是U里面的顶点增长过程,于是i++就有了
贪心+动态规划,应该都是这个框架,没有直接的for循环了
代码实现如下,仔细体会:
import heapq
import numpy as npdef dijkstra(graph,start):pqueue = []heapq.heappush(pqueue,(0.0,start))#U:已知最短距离的集合visit = set()# 追踪解parent = {start:None}# DP数组distance = {vertex:np.Inf for vertex in graph}distance[start] = 0.0while pqueue:pair = heapq.heappop(pqueue) dist = pair[0]vertex = pair[1]# 相当于以前的for循环visit.add(vertex)# 这里我们只考虑直连的边,非直连的边为inf肯定进不了候选集edges = graph[vertex]for v in edges:if v not in visit:if dist + graph[vertex][v] < distance[v]:heapq.heappush(pqueue,(dist + graph[vertex][v],v))# 更新DP数组distance[v] = dist + graph[vertex][v]parent[v] = vertex return parent,distance
#%%g = {'A':{'B':1,'C':2},'B':{'A':1,'C':3,'D':4},'C':{'A':2,'B':3,'D':5,'E':6},'D':{'B':4,'C':5,'E':7,'F':8},'E':{'C':6,'D':7,'G':9},'F':{'D':8},'G':{'E':9}}i,j=dijkstra(g,'A')print iprint j{'A': None, 'C': 'A', 'B': 'A', 'E': 'C', 'D': 'B', 'G': 'E', 'F': 'D'}
{'A': 0.0, 'C': 2.0, 'B': 1.0, 'E': 8.0, 'D': 5.0, 'G': 17.0, 'F': 13.0}
Dijkstra和动态规划相关推荐
- 基于Hmm模型和Viterbi算法的中文分词和词性标注
使用 python 实现基于Hmm模型和Viterbi算法的中文分词及词性标注:使用 最大概率算法 进行优化.最终效果:人民日报语料:分词(F1:96.189%):词性标注(F1:97.934%) 完 ...
- ORers‘ Bling Chat | 【高光聊天记录集锦-03】:运小筹读者群里那些热烈的讨论
ORers' Bling Chat | [高光聊天记录集锦-03]:运小筹读者群里那些热烈的讨论 1. 关于Dijkstra算法和A*算法的讨论 2. 关于神经网络的讨论 3. 关于tight for ...
- Dijkstra 贪心算法 动态规划
我认为 Dijkstra算法 的本质是 广度优先搜索, 而此处的广度是定义在路程的cost之上的. (就好比从圆心处向外扩散一个圆环,首次碰到的就是最近) 动态规划泛指,重叠子问题与原问题的推算关系( ...
- 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...
- 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。
十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...
- 一文弄懂动态规划(DP Dynamic Programming)下楼梯,国王和金矿,背包问题,Dijkstra算法
动态规划 参考链接 漫画算法,什么是动态规划? DP 动态规划是一种分阶段求解决策问题的数学思想 题目一 问:下楼梯问题,有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,请 ...
- 【面向对象】记一次错误的Dijkstra算法优化—动态规划与贪心
目录 Floyd(弗洛伊德)算法 Dijkstra(迪杰斯特拉)算法 联想:贪心与动态规划--不恰当的贪心导致出错 没有学过算法,请各位大佬们轻拍 本文将简单比较一下图论中最短路的两大最短路算法:Fl ...
- A Walk Through the Forest HDU - 1142(dijkstra+动态规划)
题目大意: 给你一个图,找最短路.但是有个非一般的的条件:如果a,b之间有路, 且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的 一条路.问满足这样的路径条数 有多少... 解题思路 ...
- 【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)
最短路径问题是图论中很重要的问题. 解决最短路径几个经典的算法 1.Dijkstra算法 单源最短路径(贪心),还有用 priority_queue 进行优化的 Dijkstra 算法. 2.bell ...
最新文章
- jmeter用户自定义变量的实际使用
- [No0000130]WPF 4.5使用标记扩展订阅事件
- html点击按钮执行php代码,php代码在html文件里面执行的示例
- PHP中exec、system等函数调用linux命令问题
- Java 常用类库 之 比较接口 Comparator
- Linux学习笔记018---Centos7 下安装JDK1.8
- 项目启动过后,停在了加载mapper xml文件过程中
- 第 2 章 MybatisPlus 通用 CRUD
- 把生活过的像模像样已经很不容易
- JAVA计算机毕业设计大学生二手物品交易网站演示记录2021Mybatis+系统+数据库+调试部署
- bat 命令返回结果_bat教程[283] zip压缩
- 奇幻RPG(人物构建 与 Abstract Factory模式)
- 阿里云服务器遭ddos攻击防御案例
- 私有云和服务器虚拟化的区别,私有云和服务器有什么区别
- 宜宾学院谢江宜计算机基础题,宜宾学院2011-2012学年度下期期末公共课考试安排表.xls...
- 【板栗糖GIS】怎么将网络上只能在线预览文档另存为pdf(插件篇)
- Redis原子计数器incr,防止并发请求
- C语言中getchar()函数的详解
- shell 中的单行注释和多行注释
- 数据结构与算法——链式存储(链表)的插入及删除
热门文章
- php+签到+二进制方式,PHP开发中如何实现二进制搜索?
- emacs php,如何在Emacs中关闭php-indent警告
- java代码解锁华为_如何编写可怕的Java代码?
- 【maven插件】maven-resources-plugin
- 【CentOS】EOF使用
- 单臂路由配置命令_如何通过单臂路由实现VLAN间通信?(配置篇)
- 简单的错觉画_错觉图片生成实验 - 正方形错觉
- 浏览器字体大小设置_全新内核 Edge 浏览器来了,这回或许能成为你的真 · 默认浏览器...
- console修改 ajax,【快速】chrome中console下ajax访问后台
- html messagebox确定取消,Element MessageBox弹框的具体使用