nsga2算法c++实现_Bellman-Ford算法

之前文章对于Dijkstra算法进行了讲解和实现,其实现的原理在于采用贪心算法,遍历N(结点数)次,每次找到局部最优的路径的结点u,判断该节点可达的顶点v的权重是否大于结点u权重+u->v的权重,如果大于则替换顶点v的权重(也叫松弛操作)。因为Dijkstra算法无法正确计算负权路径的最短路径(详情可看上一节),所以有了Bellman-Ford算法来解决这一问题。
3363b7bc9b099989a206c7aa6e4aea0c.png

相关文章

图论-图的构建

深度优先搜索遍历图

广度优先搜索遍历图

单源最短路径之Dijkstra算法

贪心算法如何贪心

贝尔曼-福特算法

贝尔曼-福特算法(Bellman-Ford)是由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的,求解单源最短路径问题的一种算法。

有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。

它的原理是对图进行V-1次松弛操作(V是顶点数量),得到所有可能的最短路径。

其优于Dijkstra算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(VE)。但算法可以进行若干种优化,提高了效率。

贝尔曼-福特算法与迪科斯彻算法类似,都以松弛操作为基础,即估计的最短路径值渐渐地被更加准确的值替代,直至得到最优解。

在两个算法中,计算时每个边之间的估计距离值都比真实值大,并且被新找到路径的最小长度替代。

然而,迪科斯彻算法以贪心法选取未被处理的具有最小权值的节点,然后对其出边进行松弛操作;

而贝尔曼-福特算法简单的对所有边进行松弛操作,共V-1次,其中V是图的顶点数量。

在重复地计算中,已计算得到正确的距离的边的数量不断增加,直到所有边都计算得到了正确的路径。

这样的策略使得贝尔曼-福特算法比迪科斯彻算法适用于更多种类的输入

实现过程

从上面介绍我们可以知道,Bellman算法对每一条边采用松弛操作,对于单源最短路径实现来说,

源点到某一顶点所经过的边最多为V-1条(可以看成树的两个结点),如下,三个顶点ABC,A->C最多走过2两条边即A->B->C

A->BA->CB->C

在我们将源点最短路径设置为0时,每次松弛操作,**至少会松弛一条边**,而最多共有N-1条边,所以我们需要遍历N-1次。

每一次遍历的松弛操作和Dijkstra算法类似,判断结点u权重是否大于 v->u的权重+v的权重。

与Dijkstra算法使用最短边向其他顶点扩展方案不同,在Bellman-Ford算法中松弛操作是针对边,其目的是对每一条边进行松弛,

这样总能使得边达到最小,如下图解,A为源点

A->C 2D->C 1A->B -1B->D 1 

上面共计 4个顶点,源点A到达任意顶点B,C,D最高走V-1=3条边,也就是松弛3轮,

初始化时源点A到任意顶点设置为无穷大,s[]表示最短距离,S[A]=0。

那么第一轮:

A -> C 边权2 可以推导==> (S[C] = ∞) > (S[A] + W[AB] = 0+2)条件符合,所以进行松弛操作 S[C] = 2

D -> C 边权1 可以推导==> (S[C] = 2) > (S[D] + W[DC] = ∞+1)条件不符合,无法进行松弛操作

A -> B 边权-1 可以推导==> (S[B] = ∞) > (S[A] + W[AB] = 0+(-1))条件符合,所以进行松弛操作 S[B] = -1

B -> D 边权1 可以推导==> (S[D] = ∞) > (S[B] + W[BD] = -1+1)条件符合,所以进行松弛操作 S[D] = 0

然后进行第二轮(基于第一轮):

A -> C 边权2 可以推导==> (S[C] = 2) > (S[A] + W[AB] = 0+2)条件不符合,无法进行松弛操作

D -> C 边权1 可以推导==> (S[C] = 2) > (S[D] + W[DC] = 0+1)条件符合,所以进行松弛操作 S[C] = 1

A -> B 边权-1 可以推导==> (S[B] = -1) > (S[A] + W[AB] = 0+(-1))条件不符合,无法进行松弛操作

B -> D 边权1 可以推导==> (S[D] = 0) > (S[B] + W[BD] = -1+1)条件不符合,无法进行松弛操作

第三轮逻辑同上。

我们会发现其实第二轮的时候,已经实现最短路径了,第三轮属于没有用的遍历。

负环

负环,又叫负权回路,负权环,指的是一个图中存在一个环,里面包含的边的边权总和<0。在存在负环的图中,是求不出最短路径的,

因为每次要在这个环上遍历,最短路径就会无限次的变小。如下

A->B 1A->C 1C->B -1B->D 1D->C 1

那么BCD就会存在负环,按照上面N-1次遍历后,我们再遍历,最短路径仍会变小。

实现代码(C++)

  main.cpp//  Bellman-Ford  Created by 陈龙.//  Copyright © 2019 陈龙. All rights reserved.//#include using namespace std;//顶点和边和源点int N,E,S; struct Graph{    //起点,终点    int u,v;    int w;//    Graph(int _u,int _v,int _w):u(_u),v(_v),w(_w){};};int main(int argc, const char * argv[]) {    // insert code here...    cin>>N>>E>>S;    Graph g[N];    int dis[N];    int u,v,w;    for (int i=0; i>u>>v>>w;        g[i].u = u;        g[i].v=v;        g[i].w=w;    }    //初始化    dis[S] = 0;    for(int i=0;i g[j].w + dis[g[j].u]) {                dis[g[j].v] =g[j].w + dis[g[j].u];            }        }    }    // 判断是否有负环路    for(int i=0; i dis[g[i].u] + g[i].w){               cout<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 获取phone实例,Android ContentProvider获取手机联系人实例

在做项目的时候&#xff0c;因为要用到我们自动获取联系人的姓名和电话&#xff0c;就想到了ContentProvider分享数据的功能&#xff0c;这样做既节省了时间&#xff0c;也减少了我们输入错误号码的几率&#xff0c;所以&#xff0c;想在这里把小demo分享给大家&#xff0c;方便…

电脑长截图软件_电脑屏幕长截图+WORD文档里没有插入PDF文件选项时怎么办? 简单一招轻松完成...

111111办 公 小 技 巧在用电脑查看网页时&#xff0c;想把网页上的内容截下来&#xff0c;保存成一张图片&#xff0c;可是内容又不全在一屏里&#xff0c;不能简单的用截屏完成&#xff0c;这时怎么办&#xff1f;想把一个PDF文件插入到WORD文档里&#xff0c;而电脑里的WORD版…

Goland配置leetcode

1. 安装 首先在goland的setting界面上找到Plugins&#xff0c;然后搜索关键字leetcode&#xff0c;找到LeetCode Editor&#xff0c;安装它。 在安装后&#xff0c;第一次需要对其进行配置&#xff0c;在Tools中找到LeetCode Plugins&#xff0c;如下图所示进行配置。首先国内…

华为联发科可以升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...

原标题&#xff1a;华为鸿蒙系统降临&#xff01;首批升级手机确定&#xff0c;联发科芯片被放弃&#xff1f;按照计划&#xff0c;华为会在4月份逐渐开放鸿蒙系统手机版的升级&#xff0c;首批可升级的机型目前华为只确定了Mate X2。虽然说这两年采用华为自主芯片的手机&#…

wordpress html页面缓存 cdn,WordPress 下老旧又高效的本地缓存插件 cos-html-cache

摘要Cos Html Cache是一种非常有效的WordPress页面缓存插件可以让你的站点更快更灵敏。基于URL重写&#xff0c;插件将自动生成HTML文件的帖子真正当他们第一次加载&#xff0c;并自动更新HTML文件。说起 WordPress 的缓存插件来对明月来说绝对是个老生常谈的话题了&#xff0c…

html5视差滚动效果,视差滚动效果

插件描述&#xff1a;制作视差滚动效果The meat and potatoes. Invoking these will move that page in from that side.parallax.bar.left(); //Bar slides in from the leftparallax.foo.top(); //bringing back foo from the topparallax.bar.bottom(IAmBack()); //We got c…

Oracle--基础

Oracle数据库的体系结构 数据库: databaseOracle数据库是数据的物理存储,和mysql不一样的是,只要我们愿意,我们就可以在mysql下创建任意的数据库,每个新项目的启动,创建一个数据库,然后通过showdatabases可以查看到全部数据库,但是Oracle的数据库是一个操作系统只有一个库,说白…

html动态跟随鼠标效果,使用JS实现气泡跟随鼠标移动的动画效果

气泡跟随鼠标移动&#xff0c;并在每次点击时产生不同的变化效果如下简单的气泡效果body{background-color:#000000;margin:0px;overflow:hidden}var canvas document.createElement(canvas),context canvas.getContext(2d),windowW window.screen.width ,windowH window.s…

html的数据类型有哪些,数据库数据类型有哪些

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串(字符)类型。推荐教程&#xff1a;MySQL入门视频教程一、数值类型MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类…

2021 河南 高考成绩查询,2021河南高考成绩查询入口

随着高考结束&#xff0c;高考阅卷工作陆续启动&#xff0c;已有多个省份公布了查分时间&#xff0c;那我们知道河南高考时间是什么时候嘛?下面是小编整理2021河南高考成绩查询入口_2021河南高考查分时间公布&#xff0c;仅供参考&#xff0c;希望能够帮助到大家。2021河南高考…

人脸检测算法_腾讯已开源高精度人脸检测算法DSFD

腾讯提出一种高精度双分支人脸检测器DSFD并开源。该算法曾在全球两大权威人脸检测数据集WIDERFACE和FDDB上均取得了第一。任务介绍人脸检测算法是在图像上检测出人脸的位置(通常以矩形框形式输出)&#xff0c;是人脸配准、人脸属性识别、人脸核身、人脸检索等技术的基础。随着人…

java之struts2之数据检验

1.使用struts2时&#xff0c;有时候需要对数据进行相关的验证。如果对数据的要求比较严格&#xff0c;或对安全性要求比较高时&#xff0c;前端 js 验证还不够&#xff0c; 需要在后端再进行一次验证&#xff0c;保证数据的安全性。 2.struts2提供了两种机制来进行后端的数据验…

sdk开发包如何使用_SDK如何使能行业?华为昇腾要用软件充分释放硬件性能

谈及落地&#xff0c;软件永远是激发硬件性能的核心。自AI出现&#xff0c;围绕传统产业“智能化转型”的探讨就一直没有停下。而随着“新基建”口号的喊出&#xff0c;工业制造等场景的智能化进程更是被加上了助推器。以智能制造为例&#xff0c;依据Markets报告所预计的&…

vue入门:(组件)

模板&#xff1a;&#xff08;template&#xff09;模板声明了数据和最终展现给用户的DOM之间的映射关系。初始数据&#xff1a;&#xff08;data&#xff09;一个组件的初始数据状态。对于可复用的组件来说&#xff0c;通常是私有的状态。接收外部参数&#xff1a;&#xff08…

excel删除行 uipath_学会这8个Excel神技巧,轻松告别零基础!

无论你是个学生还是职场中人&#xff0c;谁不知道Excel呢&#xff1f;尤其是办公一族&#xff0c;总是不可避免会使用到Excel。下面小电就向大家介绍8个神技巧&#xff0c;让你的工作量大大减少&#xff01;那什么技巧有如此威力呢&#xff1f;想必有些大家都用过的&#xff0c…

qt 5编程入门(第2版)_《C++并发编程实战第2版》第六章:设计基于锁的并发数据结构(1/3)...

本章主要内容设计并发数据结构的含义设计指南并发数据结构的示例实现在上一章中我们了解了底层原子操作和内存模型。本章我们先把底层的细节放一放(尽管在第7章我们将需要它们)&#xff0c;探讨一下数据结构。为编程问题选择数据结构可能是整个解决方案的关键部分&#xff0c;并…

转学到斯坦福大学计算机专业,斯坦福大学转学申请条件有哪些?

斯坦福大学转学申请条件有哪些&#xff1f;据托普仕小编了解&#xff0c;斯坦福大学(Stanford University&#xff0c;简称Stanford)位于美国加州旧金山湾区南部的帕罗奥多市(PaloAlto)境内&#xff0c;临近世界著名高科技园区硅谷&#xff0c;是世界著名私立研究型大学。斯坦福…

深入理解Asp.net MVC路由

深入理解Asp.net MVC路由 吴剑 2012-10-22 原创文章&#xff0c;转载必需注明出处&#xff1a;http://www.cnblogs.com/wu-jian/ 前言 从.Net Framework 1.0时代开始写WebForm&#xff0c;直到最近断断续续看到Razor的语法风格&#xff0c;然后搜了Asp.net MVC的一些介绍&#…

高中计算机学业水平测试知识点总结,高中化学学业水平测试知识点总结

高中化学学业水平测试知识点总结大家有总结吗&#xff1f;下面小编整理了高中化学学业水平测试知识点总结&#xff0c;欢迎大家参考借鉴&#xff01;高中化学学业水平测试知识点总结第一章从实验学化学 第一节化学实验基本方法一.化学实验安全1. 遵守实验室规则。2. 了解安全措…

chrome html 读写文件路径,Chrome浏览器支持直接读写本地文件了

本文首发于公众号&#xff1a;符合预期的CoyPan写在前面最新版的Chrome(Chrome 83, 须要开启权限)支持直接读写本地文件了。javascript开启方法&#xff1a;Chrome浏览器升级到83版本以上&#xff1b;访问chrome://flags/&#xff0c;开启 Native File System API 选项当前如何…