算法项目报告:物流中的最短路径问题
问题描述
物流问题
有一个物流公司需要从起点A到终点B进行货物运输,在运输过程中,该公司需要途径多个不同的城市,并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间,该公司需要确定经过哪些配送站点,并且给出完成货物运输的最短路径长度。
路线分布图
问题分析
问题简化
可以将该问题抽象为多段图的最短路径问题,其中每个城市对应图中的一个节点,不同城市之间的距离对应着图中的边权,城市内部的配送站可以看作同一个节点。从起点A到终点B的货物运输路径可以表示为多段图中的一条路径。找到起点A到终点B的最短路径并给出路径长度即可求解此问题。
路线简化图
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
元素值 | 4 | 8 | 6 | 10 | 8 | 12 | 14 | 17 | 15 |
状态转换 | 0->1 | 0->2 | 0->3 | 1->4 | 3->5 | 5->6 | 5->7 | 5->8 | 7->9 |
最短路径为:0->3->5->7->9,最短路径长度为15
算法设计
算法设计分析
多段图的最短路径问题满足最优性原理,可以使用动态规划法求解。
设Cuv表示多段图的有向边<u,v>上的权值,从源点s到终点t的最短路径长度记为d(s,t),原问题的部分解d(s,v),则下式成立:
d(s,v)=Csv (<s,v>∈E)
d(s,v)=min{d(s,u)+Cuv} (<u,v>∈E)
数组arc[n][n]存储图的代价矩阵,数组cost[n]存储最短路径长度,cost[j]表示从源点s到顶点j的最短路径长度,数组path[n]记录转移状态,path[j]表示从源点s到顶点j的路径上顶点j的前一个顶点。
算法伪代码
输入:多段图的代价矩阵
输出:最短路径长度及路径c[n][n]
1.循环变量j从1~n-1重复下述操作,执行填表工作
1.1考察顶点j的所有入边,对于边<i,j>∈E,执行下述操作
1.1.1cost[j]=min{cost[i]+c[i][j]}
1.1.2path[j]=使cost[i]+c[i][j]最小的i
1.2 j++
2.输出最短路径长度cost[n-1]
3.循环变量i=path[n-1],循环直到path[i]=0,输出最短路径经过的顶点
3.1输出path[i]
3.2 i=path[i]
实验结果
最短路径
最短路径为:0->3->5->7->9,最短路径长度是15
算法分析
时间复杂度分析
算法第一部分是依次计算从源点到各个顶点的最短路径长度,由两层循环嵌套组成,外层循环执行n-1次,内层循环对所有入边进行计算,在所有循环中,每条入边只计算一次。假设图的边数为m,时间复杂度为O(m);第二部分是输出最短路径经过的顶点,设多段图划分为k段,时间复杂度为O(k)。整个算法的时间复杂度为O(m+k)。
空间复杂度分析
算法的空间复杂度主要体现在图的代价矩阵arc[n][n]的存储,空间复杂度为O(n^2),存储最短路径长度的数组cost[n]的空间复杂度为O(n),转移状态记录数组path[n]的空间复杂度为O(n),所以整个算法的空间复杂度为O(n^2)。
源代码
#include<iostream>
using namespace std;
#define INF 999
int arc[10][10]; // 最多10个点
int CreateGraph()
{int i, j, k;int weight;int vnum, arcnum;cout << "请输入顶点和边的个数:";cin >> vnum >> arcnum;for (int i = 0; i < vnum; i++) // 初始化图的代价矩阵 for (int j = 0; j < vnum; j++)arc[i][j] = INF;for (k = 0; k < arcnum; k++){cout << "请输入第" << k + 1 << "条边的两个顶点和权值:";cin >> i >> j >> weight;arc[i][j] = weight;}return vnum; // 返回顶点的个数
}
// 求 n个顶点的多段图的最短路径
int BackPath(int n)
{int i, j, temp;int cost[100], path[100]; // 存储路径长度和路径 for (i = 1; i < n; i++){cost[i] = INF;path[i] = -1;}cost[0] = 0; // 顶点0为源点 path[0] = -1;for (j = 1; j < n; j++) // 依次计算后面下标为1到n-1的点(填表) for (i = j - 1; i >= 0; i--){if (cost[i] + arc[i][j] < cost[j]){cost[j] = cost[i] + arc[i][j]; // 更新值 path[j] = i; // 记录前一个点 }}// 输出路径i = n - 1;cout << "最短路径为:" << i;while (path[i] >= 0)// 前一个点大于0 {cout << "<-" << path[i];i = path[i]; // 更新为前一个点 }cout << endl;return cost[n - 1]; // 返回最短路径长度
}
int main()
{int graph = CreateGraph();cout << "最短路径长度为:" << BackPath(graph) << endl;return 0;
}
感谢大家的观看
相关文章:

算法项目报告:物流中的最短路径问题
问题描述 物流问题 有一个物流公司需要从起点A到终点B进行货物运输,在运输过程中,该公司需要途径多个不同的城市,并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间,该公司需要确定经过哪些配送站点ÿ…...
linux中 crontab 定时器用法
*/10 * * * * python3 /home/code/haha2.py Crontab 当然,以下是一个简短的博客,介绍了 Cron 和 Crontab 的用法: --- # 简介:使用 Cron 和 Crontab 在 Linux 中进行定时任务调度 在 Linux 系统中,Cron 是一个用于…...
java算法day16
java算法day16 112 路径总和404 左叶子之和513 找树左下角的值 112 路径总和 题型判定为自顶向下类型,并且为路径和类型。 那就套模板。 自顶向下就是从上到下处理,那么就是前序遍历的思想。 class Solution {boolean res false;public boolean hasP…...

华为HCIP Datacom H12-821 卷41
1.多选题 以下关于BGP Atomic_Aggregate和Aggregator的描述,正确的是哪些项? A、Aggregator属性属于可选过渡属性 B、Atomic_Aggregate属于公认任意属性 C、收到携带Atomic_Aggregate属性的路由表示这条路由不能再度明细化 D、 Agregator表示某条路由可能出现…...

【React Hooks原理 - forwardRef、useImperativeHandle】
概述 上文我们聊了useRef的使用和实现,主要两个用途:1、用于持久化保存 2、用于绑定dom。 但是有时候我们需要在父组件中访问子组件的dom或者属性/方法,而React中默认是不允许父组件直接访问子组件的dom的,这时候就可以通过forwa…...
用于可穿戴传感器的人类活动识别、健康监测和行为建模的大型语言模型
这篇论文题为《用于可穿戴传感器的人类活动识别、健康监测和行为建模的大型语言模型:早期趋势、数据集和挑战的综述》,由埃米利奥费拉拉(Emilio Ferrara)撰写。论文主要内容如下: 摘要 可穿戴技术的普及使得传感器数…...

react事件绑定
react基础事件绑定 function passwordChange(e){console.log(e.target.value); } function usernameChange(e){console.log(e.target.value); }function App() {return (<div><input type"text" placeholder请输入用户名onChange{usernameChange}/><i…...

spring框架之AOP注解方式(java代码实例)
目录 半注解形式: 业务层接口实现类: 编写切面类: 在配置文件里面唯一需要加的: 测试类: 全注解形式: 不要配置文件,改为配置类: 同样的业务层接口实现类: 同样的…...

windows下gcc编译C、C++程序 MinGW编译器
文章目录 1、概要2、MinGW安装2.1 编译器下载2.2 编译器安装2.3 设置环境变量2.4 查看gcc版本信息 3、编译C、C程序3.1 编写Hello World.c3.2 编译C程序3.3 运行程序3.4 编译C程序 1、概要 GCC原名为GNU C语言编译器(GNU C Compiler),只能处…...

uniapp启动图延时效果,启动图的配置
今天阐述uniapp开发中给启动图做延迟效果,不然启动图太快了,一闪就过去了; 一:修改配置文件:manifest.json "app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"…...

SQL,python,knime将数据混合的文字数字拆出来,合并计算(学习笔记)
将下面将数据混合的文字数字拆出来,合并计算 一、SQL解决: ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…...

【算法】LRU缓存
难度:中等 题目: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,…...

解决elementUI列表的疑难杂症,排序显示错乱的问题
大家好,在使用elementUI表格时,有时会出现一些意料之外的问题,比如数据排序正常但表格显示、排序错乱等。在网上搜索后一般有2种解决方法:1.给表格每一项的el-table-column添加唯一的id用于区分。2.给表格每一项的el-table-column…...

重大消息:手机车机互联投屏专题发布-千里马带你学框架
背景: android投屏的使用场景以前在新能源车机还没火爆时候,大部分停留在手机小屏幕投屏到大屏幕的情况及整个多端设备的互动,整体需求和技术发展其实也就是比较有限,但是新能源车机火爆后,那么这种手机和车机互联互动…...
jail子系统里升级Ubuntu focal到jammy
Ubuntu focal是20.04 ,jammy版本是22.04,本次的目的就是将FreeBSD jail子系统里的Ubuntu 从20.04升级到22.04 。这个focal 子系统是通过cbsd克隆得到的。使用CBSD克隆复制Ubuntu jail子系统环境-CSDN博客 do-release-upgrade升级没成功,用de…...

2024年7月20日(星期六)骑行支里山
2024年7月20日 (星期六)骑行支里山,早8:00到8:30,大观公园门口集合,9:00准时出发【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点:大观公园门口集合 ,家住东,南,北…...
Python:正则表达式相关整理
最近因为一些原因频繁使用正则表达式,因为以前系统整理过关于正则表达式的相关知识,所以这里仅记录使用期间遇到的问题。 本文内容基于re包 1. match和search方法的区别 在Python中,re.search和re.match都是用于匹配字符串的正则表达式函数&a…...
ChatGPT对话:有关花卉数据集
【编者按】编者准备研究基于深度学习的花卉识别,首先需要花卉数据集。 后续,编者不断会记录研究花卉识别过程中的技术知识,敬请围观 1问:推荐一下用于深度学习的花卉数据集 ChatGPT 以下是一些用于深度学习的优秀花卉数据集&am…...
特征向量及算法
数据挖掘流程 加载数据 把需要的模型数据先计算出来 特征工程 提取数据特征,对特征数据进行清洗转化 数据的筛选和清洗数据转化 类型转为 性别 男,女 ----> 1,0特征交叉 性别/职业/收入 —> 新特这 优质男性程序员 将多个特征值组合在一起特征筛选…...

cpp 强制转换
一、static_cast static_cast 是 C 中的一个类型转换操作符,用于在类的层次结构中进行安全的向上转换(从派生类到基类)或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换(即从派生…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...