【分层最短路】行动!行动!

本文深入解析分层最短路径算法,一种经典图论问题解决方案,通过拆点技术处理带有限制条件的最短路径问题。文章提供详细算法步骤,包括SPFA算法的应用与代码实现,适用于解决涉及决策路径优化的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

分析

第一次遇到这类题,表示比较不熟悉
但其实这是一类经典题型,即分层最短路
分层最短路,其实就是拆点,由于一个点有多个决策,故我们应该将这个点拆成n个决策点,类似于枚举每种可能性,然后连边跑好spfa即可

还有一种从DP的角度出发的理解,即对于点v,使用了k个血包,有
dis[v][k]=min(dis[pre[v]][k]+w,dis[pre[v]][k−1]),k&lt;K(血包数量)dis[v][k]=min(dis[pre[v]][k]+w,dis[pre[v]][k-1]),k&lt;K(血包数量)dis[v][k]=min(dis[pre[v]][k]+w,dis[pre[v]][k1]),k<K()
跑spfa时由于方向和方程是相反的,所以方程稍作改动即可

code

#include<bits/stdc++.h>
using namespace std;
#define loop(i,start,end) for(register int i=start;i<=end;++i)
#define clean(arry,num); memset(arry,num,sizeof(arry));
#define min(a,b) ((a>b)?b:a)
const int maxn=100005,maxm=100000+10,maxk=10+5;
int dis[maxn][maxk];
bool vis[maxn][maxk];
int head[maxn];
int cnt=0,n,m,k,s,t;
struct NODE
{
	int e;
	int w;
	int nxt;
	NODE():e(0),w(0),nxt(0){}
	NODE(int e,int w,int nxt):e(e),w(w),nxt(nxt){}
}edge[maxm<<1];
struct node
{
	int pos;int Dis;int used;
	node():pos(0),Dis(0),used(0){}
	node(int pos,int Dis,int used):pos(pos),Dis(Dis),used(used){}
	friend bool operator<(node a,node b)
	{
		return dis[a.pos][0]>dis[b.pos][0];//这个重载好像有点问题
	}
};
inline int read()
{
	int _ans=0;bool _neg=false;char _r=getchar();
	while(_r>'9'||_r<'0'){if(_r=='-')_neg=true;_r=getchar();}
	while(_r>='0'&&_r<='9'){_ans=(_ans<<3)+(_ans<<1)+_r-'0';_r=getchar();}
	return (_neg)?-_ans:_ans;
}
inline void addl(int u,int v,int w)
{
	edge[cnt]=NODE(v,w,head[u]);
	head[u]=cnt++;
}
inline void dijkstra()
{
	clean(vis,false);
	clean(dis,0x7f);
	loop(i,0,k)dis[s][i]=0;
	priority_queue<node>q;
	q.push(node(s,0,0));
	vis[s][0]=true;
	while(!q.empty())
	{
		node _f=q.top();q.pop();
		if(vis[_f.pos][_f.used]==false)continue;
		vis[_f.pos][_f.used]=false;
		for(int i=head[_f.pos];i!=-1;i=edge[i].nxt)
		{
			int _v=edge[i].e;
			if(dis[_v][_f.used]>dis[_f.pos][_f.used]+edge[i].w)//处理当前点不用血包
			{
				dis[_v][_f.used]=dis[_f.pos][_f.used]+edge[i].w;
				if(!vis[_v][_f.used])q.push(node(_v,dis[_v][_f.used],_f.used)),vis[_v][_f.used]=true;
			}
			if(_f.used<k&&dis[_v][_f.used+1]>dis[_f.pos][_f.used])//当前点用血包
			{
				dis[_v][_f.used+1]=dis[_f.pos][_f.used];
				if(!vis[_v][_f.used+1])q.push(node(_v,dis[_v][_f.used+1],_f.used+1)),vis[_v][_f.used+1]=true;
			}
		}
	}
}
//由于每个点只可能拓展出最多两个节点,故最后一定会有某个节点的使用血包数达到k
int main()
{
	#ifndef ONLINE_JUDGE
    freopen("datain.txt","r",stdin);
    #endif
    n=read(),m=read(),k=read(),s=read(),t=read();
    clean(head,-1);
    loop(i,1,m)
    {
    	int a,b,c;
    	a=read(),b=read(),c=read();
    	addl(a,b,c);
    	addl(b,a,c);
	}
	dijkstra();
	int minn=INT_MAX;
	loop(i,0,k)minn=min(dis[t][i],minn);
	printf("%d",minn);
	return 0;
}


移动机器人系统设计大作业报告 第一部分:背景与意义 1.1 应用背景 在当今社会,移动机器人的应用已渗透到多个领域,具有重要的现实意义。以室内物流场景为例,随着电商行业的蓬勃发展,仓储物流的自动化需求日益增长。在大型仓库中,每天需要处理大量的货物存储和搬运工作,传统的人工操作方式不仅效率低下,而且容易出现错误。同时,在一些危险环境下,如化工仓库、核电站等,人工操作可能会对工作人员的生命安全造成威胁。因此,设计一种能够自主完成地图构建、定位和货物搬运任务的移动机器人具有重要的应用价值。 1.2 制约因素 安全因素:在室内环境中,机器人需要与人类工作人员共同作业,因此必须确保机器人的运行安全。例如,机器人在移动过程中需要避免碰撞到人员和障碍物,防止对人员造成伤害。同时,机器人的电气系统和机械结构也需要具备足够的安全性,防止发生漏电、短路等安全事故。 健康因素:如果机器人在运行过程中产生噪音、粉尘等污染物,可能会对工作人员的身体健康造成影响。因此,需要确保机器人的运行符合相关的健康标准。 法律因素:在机器人的设计和应用过程中,需要遵守相关的法律法规。例如,机器人的知识产权保护、数据隐私保护等方面都需要符合法律要求。 文化因素:在不同的文化背景下,人们对机器人的接受程度和使用习惯可能会有所不同。因此,在机器人的设计过程中,需要考虑文化因素的影响,使机器人能够更好地适应不同的文化环境。 环境因素:机器人的设计和应用需要考虑对环境的影响。例如,机器人的能源消耗、废弃物处理等方面都需要符合环保要求。 1.3 移动机器人功能 本设计的移动机器人主要具有以下功能:能够在室内环境中自主构建地图,并准确地确定自身在地图中的位置;可以根据任务需求,规划优的运动路径,完成货物的搬运任务;具备避障功能,能够在运行过程中自动检测并避开障碍物,确保运行安全。 第二部分:移动机器人的系统构成 2.1 控制系统结构 本移动机器人采用分层控制系统结构,主要包括决策层、规划层和执行层。 决策层:是机器人的核心控制层,负责整个机器人系统的任务分配、路径规划和决策制定。它接收来自传感器的数据,进行分析和处理,然后根据任务需求和环境信息,制定出优的行动方案。决策层通常由高性能的微处理器或工控机组成,运行复杂的算法和控制系统软件。 规划层:根据决策层制定的行动方案,生成具体的运动轨迹和控制指令。它需要考虑机器人的动力学特性、环境约束和任务要求,确保生成的轨迹可行且优。规划层可以采用各种路径规划算法,如 A * 算法、Dijkstra 算法等。 执行层:负责执行规划层生成的控制指令,驱动机器人的各个执行机构,如电机、舵机等,实现机器人的运动和操作。执行层通常由电机驱动模块、传感器接口模块等组成,它需要快速、准确地响应控制指令,确保机器人的运动精度和稳定性。 2.2 机器人运动控制系统构成 机器人的运动控制系统主要由以下几个部分组成: 电机驱动模块:采用直流电机驱动机器人的车轮,通过 PWM(脉冲宽度调制)技术控制电机的转速和转向。电机驱动模块可以根据控制指令精确地控制电机的运行,实现机器人的前进、后退、转弯等动作。 传感器系统:包括激光雷达、深度相机、IMU(惯性测量单元)等多种传感器。激光雷达用于获取周围环境的三维点云数据,是地图构建和定位的主要传感器;深度相机可以提供近距离的深度信息,辅助激光雷达进行环境感知;IMU 用于测量机器人的加速度和角速度,提供机器人的姿态信息,辅助定位和导航。 控制器:采用 STM32 系列微控制器作为底层控制器,负责接收传感器数据和上层控制器的指令,进行数据处理和控制算法的实现。STM32 微控制器具有高性能、低功耗的特点,能够满足机器人实时控制的需求。 电源管理系统:为机器人的各个模块提供稳定的电源供应。考虑到移动机器人的便携性和续航能力,采用锂电池作为电源,并设计了电源管理电路,实现对电池的充电、放电和电量监测等功能。 2.3 硬件设计 主控制器:选择 Raspberry Pi 4B 作为主控制器,它具有较强的计算能力和丰富的接口资源,能够满足决策层和规划层的计算需求。Raspberry Pi 4B 可以运行 Linux 操作系统,支持 Python、C++ 等多种编程语言,方便开发各种算法和应用程序。 传感器配置:配备一个 16 线激光雷达(如 Velodyne VLP-16)用于环境感知和地图构建;一个深度相机(如 Intel RealSense D435)用于近距离深度信息获取;一个 IMU(如 MPU-9250)用于姿态测量和辅助定位;还配备了超声波传感器和红外传感器用于近距离避障。 驱动系统:采用四轮差速驱动方式,每个车轮由一个直流电机驱动。选用高扭矩、低转速的直流电机,并配备减速箱,以提供足够的驱动力和稳定的运行性能。 电源系统:使用 12V、10Ah 的锂电池组作为电源,为整个机器人系统供电。通过电源管理模块将 12V 电压转换为各个模块所需的电压,如 5V、3.3V 等。 2.4 软件设计 操作系统: Ubuntu Mate 操作系统,它是基于 Ubuntu 的轻量级桌面操作系统,具有良好的兼容性和稳定性。 开发环境:使用 ROS(机器人操作系统)作为软件开发平台。ROS 提供了丰富的工具和库,方便进行机器人的开发和调试。它具有良好的模块化设计和分布式计算能力,能够有效地组织和管理机器人的各个功能模块。 核心算法: SLAM 算法:采用 Cartographer 算法实现同时定位与地图构建。Cartographer 是一种基于图优化的 SLAM 算法,具有较高的精度和稳定性,能够在室内环境中构建出精确的地图。 路径规划算法:使用 A算法进行全局路径规划,DWA(动态窗口法)进行局部路径规划。A算法能够在已知地图中找到优路径,DWA 算法则能够根据机器人的当前状态和环境信息,实时调整机器人的运动轨迹,避障障碍物。 控制算法:采用 PID 控制算法对电机进行速度控制和位置控制,确保机器人的运动精度和稳定性。给出ros仿真实验结果
最新发布
06-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AndrewMe8211

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

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

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

打赏作者

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

抵扣说明:

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

余额充值