动态规划算法最短路径问题分析

一、最短路径简介 用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
二、动态规划求解问题的思路 在《算法导论》上,动态规划的求解过程主要分为如下的四步:
描述最优解的结构
递归定义最优解的值
按自底向上的方式计算最优解的值
由计算出的结果构造一个最优解
在利用动态规划求解的过程中值得注意的就是是否包含最优子结构,简单来讲就是一个问题的最优解是不是包含着子问题的最优解。利用求解子问题的最优解最后得到整个问题的最优解,这是利用动态规划求解问题的基本前提。
三、利用动态规划求解最短路径问题 在解决这个问题的过程中,我其实是在尝试着使用不同的工具,首先我想对这种图处理,我使用了gephi,gephi是我在学习复杂网络的时候学会的一个工具,这个工具可以很方便的处理网络数据,能够动态的生成图的结构,下面是我用gephi画出的图:
gephi的另一个比较重要的工具就是可以在生成图的过程中,将图的数据导出,导出的数据可以方便的使用。
还是重点说说我是怎么利用动态规划的思想去求解这样的最短路径问题的:
1、描述最优解的结构 要使得从0到10的距离最短,令为到第个节点的最短距离,则用同样的方法可以求得等。
2、递归定义最优解的值
其中表示与边有连接的节点,而且。
3、按自底向上的方式计算每个节点的最优值 此时我们就得利用递归公式分别求解,这样最终便能得到最终的解。
结果为:
最短路径解决方法 用于解决最短路径问题的算法被称做“最短路径算法”, 有时被简称作“路径算法”。 最常用的路径算法有:
dijkstra算法
spfa算法\bellman-ford算法
floyd算法\floyd-warshall算法
johnson算法
a*算法
所谓单源最短路径问题是指:已知图g=(v,e),我们希望找出从某给定的源结点s∈v到v中的每个结点的最短路径。
首先,我们可以发现有这样一个事实:如果p是g中从vs到vj的最短路,vi是p中的一个点,那么,从vs沿p到vi的路是从vs到vi的最短路。
java实现:
[java] view plain copypackage org.algorithm.dynamicprogramming;
import java.io.bufferedreader;
import java.io.file;
import java.io.filenotfoundexception;
import java.io.filereader;
import java.io.ioexception;
import java.io.reader;
import java.util.arraylist;
import java.util.iterator;
import java.util.list;
import java.util.stack;
/**
* 利用动态规划求解最短路径问题
*
* @author dell
*
*/
public class calmindistance {
// 计算最短的距离
public static int[] calmindistance(int distance[][]) {
int dist[] = new int[distance.length];
dist[0] = 0;
for (int i = 1; i 《 distance.length; i++) {
int k = integer.max_value;
for (int j = 0; j 《 i; j++) {
if (distance[j][i] != 0) {
if ((dist[j] + distance[j][i]) 《 k) {
k = dist[j] + distance[j][i];
}
}
}
dist[i] = k;
}
return dist;
}
// 计算路径
public static string caltheroute(int distance[][], int dist[]) {
stack《integer》 st = new stack《integer》();
stringbuffer buf = new stringbuffer();
int j = distance.length - 1;
st.add(j);// 将尾插入
while (j 》 0) {
// int num = 0;
for (int i = 0; i 《 j; i++) {
if (distance[i][j] != 0) {
// num++;
if (dist[j] - distance[i][j] == dist[i]) {
st.add(i);
}
}
}
j = st.peek();
}
while (!st.empty()) {
buf.append(st.pop()).append(“--》”);
}
return buf.tostring();
}
// 读取文件
@suppresswarnings(“resource”)
public static int[][] readthefile(file f) {
reader input = null;
try {
input = new filereader(f);
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
bufferedreader buf = null;
buf = new bufferedreader(input);
list《string》 list = new arraylist《string》();
try {
string str = buf.readline();
while (str != null) {
list.add(str);
str = buf.readline();
}
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
iterator《string》 it = list.iterator();
int distance[][] = new int[11][11];
while (it.hasnext()) {
string str1[] = it.next().split(“,”);
int i = integer.parseint(str1[0]);
int j = integer.parseint(str1[1]);
distance[i - 1][j - 1] = integer.parseint(str1[2]);
}
return distance;
}
public static void main(string args[]) {
// 读文件
file f = new file(“d:” + file.separator + “distance_1.csv”);
int distance[][] = readthefile(f);
int dist[] = calmindistance(distance);
system.out.println(“最短路径长度为:” + dist[distance.length - 1]);
system.out.println(“最短路径为:” + caltheroute(distance, dist));
}
}

多个传感器自研!刚刚,马斯克公布最强人形机器人Optimus二代
光学图像稳定原则
思尔芯发布Neuro云管理软件,助力EDA上云
分析我国2020年自动化分拣系统市场现状
模拟乘法器输出与输入的关系式
动态规划算法最短路径问题分析
高通正式发布了骁龙665、骁龙730和骁龙730G三款新SoC
工业数字模拟转换器:如何设计二线制变送器
CYX20差压传感器:精准测量压力差的关键技术
将无传感器BLDC电机控制引入低成本应用
IPC工控机的结构与技术特性
realme不再在国内推4G手机产品 争取全面覆盖5G手机产品
什么是3c产品?3c产品具体包括哪些
基于6ULL-Nand核心板|提取并反编译设备树
模拟技术知识课堂:噪声系数的计算及测量方法
【应用场景】安科瑞交流汇流箱在分布式光伏行业中的应用
2017年LTE占亚太地区漫游流量的26%,2018年增长到43%
拉美智能手机市场在2019年第三季度恢复增长
AI+服饰设计助力重塑行业生态
创维π盒评测 一件不可多得的神器