数学建模学习(15):动态规划模型之求图的所有最短路径最详讲解,讲解不易只求三连!

本文详细介绍了如何使用动态规划方法求解有向图和无向图的最短路径,通过MATLAB实现,包括sparse创建稀疏矩阵、graphallshortestpaths函数的应用,并解析了最短路径的过程。
摘要由CSDN通过智能技术生成

介绍

动态规划(dynamicprogramming)是运筹学的一个分支,是求解多阶段决策问题的最优化方法。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。以丰富的想象力去建立模型,用创造性的技巧去求解。

sparse创建稀疏矩阵

当然,他还有一个好处,使用稀疏存储空间节省内存。

官方例子:根据 i、j 和 v 三元组生成 1500×1500 的稀疏矩阵。

i = [900 1000];
j = [900 1000
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个简单的用栈求解迷宫问题所有路径及最短路径的C++程序: ```c++ #include <iostream> #include <stack> using namespace std; const int N = 5; // 迷宫大小为5*5 int maze[N][N] = { {0, 0, 1, 0, 1}, {0, 0, 1, 0, 0}, {0, 0, 0, 1, 0}, {1, 1, 0, 0, 0}, {0, 0, 1, 0, 0} }; // 迷宫地,0表示通路,1表示障碍物 struct Node { int x, y, step; Node(int _x, int _y, int _step) : x(_x), y(_y), step(_step) {} // 定义一个结构体表示节点的坐标和步数 }; stack<Node> s; // 定义一个栈存储节点 void printPath(stack<Node> path) { // 打印路径 stack<Node> tmp; while (!path.empty()) { tmp.push(path.top()); path.pop(); } while (!tmp.empty()) { cout << "(" << tmp.top().x << ", " << tmp.top().y << ") "; tmp.pop(); } cout << endl; } void findPath() { int dx[4] = {0, 1, 0, -1}; // 定义四个方向 int dy[4] = {1, 0, -1, 0}; s.push(Node(0, 0, 0)); // 将起点压入栈中 while (!s.empty()) { Node cur = s.top(); s.pop(); if (cur.x == N-1 && cur.y == N-1) { // 到达终点 printPath(s); // 打印路径 cout << "步数为:" << cur.step << endl; // 打印步数 return; } for (int i = 0; i < 4; i++) { // 遍历四个方向 int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if (nx >= 0 && nx < N && ny >= 0 && ny < N && maze[nx][ny] == 0) { // 判断是否越界和是否是通路 s.push(Node(nx, ny, cur.step+1)); // 将新节点压入栈中 maze[nx][ny] = 1; // 标记为已经走过 } } } } int main() { findPath(); return 0; } ``` 代码中使用了一个栈来存储节点,每次从栈中取出一个节点,判断它是否到达终点,如果到达终点则输出路径和步数,否则遍历四个方向,将新节点压入栈中,同时标记为已经走过。这里只求了一条最短路径,如果要求所有的最短路径,可以使用广度优先搜索算法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川川菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值