【数学建模实战案例】外卖送餐路径优化:从模型到 C++ 编程-野牛程序员讲少儿编程
作者:野牛程序员:2025-05-22 18:07:18数学阅读 2329
【数学建模实战案例】外卖送餐路径优化:从模型到 C++ 编程-野牛程序员讲少儿编程
? 背景描述
外卖员每天需要送达多个订单,如何选择最优路径,让配送距离最短、用时最少,是一个现实中的优化问题。这个问题其实可以抽象为:
? 给定一个带权图,从起点出发,求到所有配送点的最短路径。
这正是图论中的最短路径问题(Shortest Path Problem),可以用经典的 Dijkstra算法 建模与求解。
? 数学建模思路
| 步骤 | 内容 |
|---|---|
| 问题定义 | 在城市道路网络中,从外卖站点出发,依次访问 n 个配送点,路径总长度最短 |
| 模型简化 | 将城市看作图,交叉口为点,道路为边,边权为距离 |
| 数学模型 | 最短路径模型(Dijkstra 单源最短路径) |
| 输入数据 | 图中点数 n,边数 m,每条边的起点、终点、距离 |
| 编程求解 | 使用 C++ 实现 Dijkstra 算法 |
? C++ 完整代码
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
// 常量定义:最大节点数量
const int MAXN = 1005;
// 邻接表存图,pair<终点, 权重>
vector<pair<int, int>> graph[MAXN];
// 最短路径数组
int dist[MAXN];
// Dijkstra 算法函数
void dijkstra(int start, int n) {
// 初始化所有距离为无穷大
for (int i = 1; i <= n; ++i) dist[i] = INT_MAX;
dist[start] = 0;
// 小根堆:pair<当前距离, 当前节点>
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, start});
while (!pq.empty()) {
auto [d, u] = pq.top();
pq.pop();
if (d > dist[u]) continue; // 剪枝
for (auto [v, w] : graph[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
}
// 主函数
int main() {
int n, m, s;
cout << "请输入城市点数n、道路数m、起点编号s:" << endl;
cin >> n >> m >> s;
cout << "请输入每条道路:起点 终点 距离" << endl;
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
// 无向图则需要添加双向边
graph[u].push_back({v, w});
graph[v].push_back({u, w});
}
dijkstra(s, n);
cout << "从起点 " << s << " 到所有点的最短距离如下:" << endl;
for (int i = 1; i <= n; ++i) {
if (dist[i] == INT_MAX) cout << "点" << i << ":不可达" << endl;
else cout << "点" << i << ":" << dist[i] << endl;
}
return 0;
}? 示例输入输出
输入: 6 7 1 1 2 4 1 3 2 2 3 1 2 4 5 3 4 8 4 5 3 5 6 6 输出: 从起点 1 到所有点的最短距离如下: 点1:0 点2:3 点3:2 点4:8 点5:11 点6:17
✅ 小结
外卖路径优化问题,是经典的图论建模应用;
通过Dijkstra算法 + 编程实现,可高效求解最短路径;
数学建模与编程结合,是解决现实问题的关键能力。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

