中级篇——Bellmen算法求最短路径

本文介绍Bellmen算法,一种适用于有向图中寻找最短路径的算法,尤其在边权重允许为负的情况下表现突出。文章提供了核心代码及示例,演示了如何通过n-1轮松弛迭代来确定两点间最短路径。

        Bellmen算法是求最短路径的最方便的算法之一,SPFA算法更方便,是Bellmen算法的队列实现但队列不会,掌握Bellmen算法即可解决大部分最短路径的问题。Bellmen算法的最大优势就在于可以解决边权值为负的情况。(限于有向图)

        另外,Bellmen算法的运算时间为O(nm)适合n^2>m的稀疏图!!!当遇到n^2<m的稠密图时最好用Dijkstra算法,其运算时间为O(n^2)。

典例:给n个点,m条路径,求A点到B点的最短路径。

需要开设dis[]记录,dis[i]即到达i点的最短距离,输出时输出dis[i]即可。

*核心代码:

for(int i=1;i<=n-1;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
                    dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
            }
        }

理论上一共要进行n-1轮松弛,但有可能最后几轮的松弛将不再改变dis[]中的值,故可以提前结束循环节省运算时间。需要一个与dis[]一样大的数组dis1[]备份dis[]的值,另外还引进一个flag变量初始化为0。每次松弛过后将dis[]与dis1[]中的值一一比对,若相同则flag=1;判断if(flag==1)则结束循环无需再松弛。

#include <iostream>
#include<stdio.h>
#define max 99999999
using namespace std;
int dis[200],dis1[200],n,m,a,b;
struct node
{
    int u,v,w;       //起点。重点,权值
}edge[100];
void init()          //初始化
{
    for(int i=1;i<=n;i++)
        dis[i]=max;  //初始化将到达每个点的距离设为无穷
    dis[a]=0;      //起点开始故距离为0
}
int main()
{
    while(cin>>n>>m>>a>>b)
    {
        init();
        for(int i=1;i<=m;i++)
        {
            cin>>edge[i].u>>edge[i].v>>edge[i].w;
        }
        //bellmen核心语句!!!
        int flag;
        for(int i=1;i<=n-1;i++)
        {
            flag=0;  
            for(int j=1;j<=m;j++)
            {
                if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
                    dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
            }
	    for(int j=1;j<=n;j++)
            	if(dis[j]!=dis1[j])
                { 	      	     
                     flag=1;dis1[j]=dis[j];
                } 
            if(flag==0) break;   //若值均未变则跳出循环
        }
        //输出结果
        cout<<dis[b]<<endl;
    }
    return 0;
}


数据:

Input:5   5   1   5

             2   3   2

             1   2   -3

             1   5   5

             4   5   2

             3   4   3

Output:4

运算过程(理解运算原理)

初始化:dis     1           2            3          4          5

                           0       max       max     max     max

第一轮:先处理第一条边,2——>3距离为2,此时dis[2]和dis[3]均为max,无法比较,松弛失败。第二条边1——>2距离为-3,此时dis[1]=0,dis[2]=max,dis[2]>dis[1]+(-3),故dis[2]值变为-3。第三条边1——>5距离为5,dis[5]>dis[1]+5,故dis[5]=5。以此方法,第三四条边无法松弛,故第一轮松弛结束。

                dis     1           2            3          4          5

                           0         -3         max      max       5

第二轮:处理刚才未松弛成功的第一条边2——>3,dis[3]>dis[2]+(-3),dis[3]=-1。之后3——>4,dis[4]>dis[3]+3,dis[4]=2。发现了从4——5距离会比1——>5短,但松弛3——>4时已经过了4——>5的边,只能再进行一轮松弛。

                dis     1           2            3          4          5

                           0         -3            -1         2          5

第三轮:处理4——>5,dis[5]>dis[4]+2,dis[5]=4。

                dis     1           2            3          4          5

                           0         -3            -1         2          4

第四轮:无变化的值,flag=0,跳出循环。

                dis     1           2            3          4          5

                           0         -3            -1         2          4





为了实现直流无刷电机的高精度三相电机控制并提高能源转换效率,首先需要深入理解TMS320F2803x微控制器的特性以及HALL传感器的应用。TMS320F2803x微控制器具备高级的处理能力和丰富的电机控制外设接口,这些特点非常适合用于实现复杂的电机控制算法。HALL传感器则提供了电机转子位置的精确信息,使得可以精确控制电机的转速和位置。 参考资源链接:[TI DSP驱动的HALL效应BLDC电机控制详解](https://wenku.youkuaiyun.com/doc/79aao388xu?spm=1055.2569.3001.10343) 在设计过程中,可以采用场定向控制(Field-Oriented Control, FOC)策略,该策略通过将电机电流分解为转矩产生和磁链产生两个分量,并分别控制它们,来实现对电机的高精度控制。TMS320F2803x微控制器的高性能计算能力,使得该控制器能够实时完成复杂的数学变换和控制算法的计算,从而确保电机在不同负载下均能保持高效率和高精度的运行。 HALL传感器的信号处理需要与控制算法紧密集成,以实现快速准确的反馈控制。控制算法可以通过软件实现模块化设计,这样不仅便于调试和维护,也便于后续的功能扩展。 提高能源转换效率的关键在于优化控制算法,减少电机运行中的能量损耗。这可以通过减小相电流的谐波分量、提高逆变器的开关频率以及优化电机驱动策略来实现。例如,可以采用先进的调制技术,如空间矢量脉宽调制(Space Vector Pulse Width Modulation, SVPWM),以减少逆变器的开关损耗并提升电机的效率。 最后,通过实验验证系统的性能至关重要。通过实验,可以测量电机在不同运行条件下的性能,包括启动、加速、减速和运行过程中的效率,以及在不同负载条件下的效率表现。 若想进一步深入了解和掌握这些技术细节,强烈推荐您参阅《TI DSP驱动的HALL效应BLDC电机控制详解》。这份资料将为您提供理论基础、系统设计方法、硬件配置及实验结果的全面分析,帮助您深入理解如何使用TMS320F2803x微控制器和HALL传感器实现直流无刷电机的高效场定向控制,并在实践中优化能源转换效率。 参考资源链接:[TI DSP驱动的HALL效应BLDC电机控制详解](https://wenku.youkuaiyun.com/doc/79aao388xu?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值