一、sph算法简介


1.最小代价树算法

SPH算法也叫做MPH( minimum path heuristic)算法, 用于构造时延约束最算法小代价组播树. 该算法中每 个目的结点通过与当前组播树有最小代价的路径加入组播树,直到所有的目的节点全的进入树。
最小代价树算法中最经典的算法有 3 个: KMB 算法、ADH 算法、 MPH 算法.

  • KMB 算法是由 Kou 等人提出的求解 Steiner 组播树算法, 其复杂度为 O(mn2);
  • ADH ( average distance heuristic)算法复杂度为 O( n3);
  • MPH 算法复杂度为 O( mn2).

2.MPH算法过程

到目前为 止,从降低组播生成树的代价方面考虑,MPH 仍是 一个非常优秀 的求解 Steiner 树问题 的启发式 算法. MPH 算法基本思想如下:

  • 1) 初始化组播树 T,开始时只包括源结点 s;
  • 2) 从余下的目的结点中选取到树 T 具有最小 代价路径的目的结点,将该结点及其最小代价路径 加入树 T ;
  • 3) 重复 2) ,直到所有目的结点加入组播树 T

3.SPH算法过程

具体包括如下几个 步骤:

  • 1)运用 Dijkstra算法,以点集S(初值为源点first)计算到所有结点的最小代价路径 ;
  • 2)选出目的节点中间的代价最小的minNodes;
  • 3)将到点minNodes的路径上的全部节点压进点集S;
  • 4)重复1)、2)、3)直到所有的目标点集进入点集S;

其中Dijkstra算法是一个常用的解单源最短路径的常用算法。其基本思想是,设置一个顶点集合H,并不断贪心的选择来扩充这个集合。此算法网上描述很多,不进行赘述。
本次,完成Dijkstra后同时记录下最短路径的值及最短路径经过的节点,数据结构也只是用了比较low的表去实现。
第二步中间选取最小的minNodes时,下一步的优化方向是采用最小优先级对列的数据结构,及堆算法pop_heap,push_back,pop_back等等。

二、代码实现

sph算法代码GitHub链接
数据集链接

核心代码:

for (;;){if (t > 0){t = T;mind = 99999999;//所有点到目标点的距离for (int i = 1; i <= DD; i++){if (s[i] == 1){Dijkstra(i);//利用新的dist的数据对fdis的数据进行更新for (int j = 1; j <= DD; j++){if (dist[j] < fdis[j] && dist[j] != 0 && s[j] != 1){fdis[j] = dist[j];for (int k = 0; k <= DD; k++){fload[j][k] = load[j][k];if (fload[j][k] == 0)break;}}}}}fdis[first] = 0;//找出最小的点(目标点中)for (int i = 1; i <= DD; i++){for (int j = 0; j < T; j++){if (mind > fdis[i] && i == goal[j] && goal2[i] != 1)//这点距离小,在目标点中间,且未进入点集s{mind = fdis[i];minv = i;}}}//找出的点加入点集sgoal2[minv] = 1;for (int i = 0; i <= DD; i++){if (fload[minv][i] > 0)s[fload[minv][i]] = 1;elsebreak;}for (int i = 1; i <= DD; i++){if (1 == goal2[i])t--;}}elsebreak;}

贴几个跑完的数据。

  • 数据1:
    first:2
    目标点1、2、3、4、5、6、7、8、9、10
    点集图:

路径图:(别吐槽。。。matlab用的烂,有空补不是手绘的。。。)

程序结果截图:

  • 数据2:
    first:1
    目标点1、2、3、4、5、6、7、8、9、10
    点集图:

路径图:

程序结果截图:

-数据3:
点集图:

路径图:

emmmmm........就是这样,学习中大佬们指教。

转载于:https://www.cnblogs.com/nnmaitian/p/7768929.html

SPH算法(求最小代价树)相关推荐

  1. prim求最短路径C语言,[图论]Prim算法求最小支撑树和最短路径

    这个是以前所学,现在总结成博文一篇. 对于图论中的求解最小支撑树问题和最短路径问题都有比较经典的算法,比如最小支撑树可以采用"破圈法",求解最短路径可以用"Dijkstr ...

  2. C++kruskals算法生成最小协议树(附完整源码)

    C++kruskals算法生成最小协议树 C++kruskals算法生成最小协议树完整源码(定义,实现,main函数测试) C++kruskals算法生成最小协议树完整源码(定义,实现,main函数测 ...

  3. C++prims算法生成最小协议树(附完整源码)

    C++prims算法生成最小协议树 C++实现prims算法生成最小协议树完整源码(定义,实现,main函数测试) C++实现prims算法生成最小协议树完整源码(定义,实现,main函数测试) #i ...

  4. 利用Kuhn-Munkras算法求最小权值匹配

    本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...

  5. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Descr ...

  6. 最小代价树(动态规划)

    Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和.  例如:((4+1)+ (2+ ...

  7. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了-- 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  8. 旋转卡壳算法求最小外接矩形代码

    旋转卡壳原理:旋转卡壳详解_大学要有梦想的博客-CSDN博客_旋转卡壳 思路: 1.选择卡壳算法用于求凸多边形的最小外接矩形 1.多边形最小的外接矩形一定是以多边形的的一条边为底的一部分 2.通过这条 ...

  9. 百练/ 北京大学2016研究生推免上机考试(校外)G: Tangled in Cables(最小支撑树)

    题目来源:http://bailian.openjudge.cn/practice/2075/ 2075:Tangled in Cables 总时间限制:1000ms  内存限制: 65536kB 描 ...

最新文章

  1. 《预训练周刊》第24期:Infinite-former:无限记忆变换器、2500万悟道科研基金开始申请
  2. 容量是GPT-2的1.7倍!谷歌打造神经对话模型Meena
  3. nginx日志中文变成类似\xE9\xA6\x96\xE9\xA1\xB5-\xE6\x8E\xA8\xE8\x8D\x90的东西,治本方案
  4. 解决Ubuntu18.04下Qt中无法输入中文的问题
  5. Java Dom解析xml
  6. fedora在此处打开终端
  7. ipad和iphone切图_如何在iPhone,iPad和Mac上使消息静音
  8. Redis——缓存击穿、穿透、雪崩
  9. centos 卸载ffmpeg_Linux下ffmpeg的完整安装
  10. Android官方开发文档Training系列课程中文版:高效显示位图之加载大位图
  11. Docker Registry 删除镜像并清理
  12. PP视频如何查看上下集的快捷键
  13. strutr2运行流程
  14. php卡盟专用主机,php卡盟
  15. QAbstractTableModel中的data()到底执行几遍???
  16. 被神话的Linux, 一文带你看清Linux在多核可扩展性设计上的不足
  17. python绘制风玫瑰图_用Python matplotlib 怎么画风向玫瑰图 能给出程序的
  18. 静态IP设置(超详细)
  19. 如何制作一个可控制的人体骨骼模型
  20. cyj等于什么英语单词_英语参考单词读写规律大全.doc

热门文章

  1. 在减少对内地房地产投资的同时,加快了在内地零售业的布局;并积极推动“走出去”战略,在全球52个国家投资多种业务。...
  2. 12-22 挑战留给自己,积极面对
  3. Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer
  4. 从0开始架构一个IOS程序——iOS 根据文字的长度来动态设置UILabel的大小
  5. Android 中activity中传递数据的方式
  6. jQuery源码解析(3)—— ready加载、queue队列
  7. 【XSY1295】calc n个点n条边无向连通图计数 prufer序列
  8. 在CentOS7上安装配置Corosync高可用集群过程全记录
  9. Block的引用循环问题 (ARC non-ARC)
  10. BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )