一、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;
    1. 从余下的目的结点中选取到树 T 具有最小 代价路径的目的结点,将该结点及其最小代价路径 加入树 T ;
    1. 重复 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;
}
}
}
//找出的点加入点集s
goal2[minv] = 1;
for (int i = 0; i <= DD; i++)
{
if (fload[minv][i] > 0)
s[fload[minv][i]] = 1;
else
break;
}
for (int i = 1; i <= DD; i++)
{
if (1 == goal2[i])
t--;
}
}
else
break;
}

贴几个跑完的数据。

  • 数据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........就是这样,学习中大佬们指教。

SPH算法(求最小代价树)的更多相关文章

  1. [swustoj 404] 最小代价树

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

  2. poj3565 Ants km算法求最小权完美匹配,浮点权值

    /** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...

  3. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

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

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

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

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

  6. POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解

    扩展欧几里得算法模板 #include <cstdio> #include <cstring> #define ll long long using namespace std ...

  7. POJ-2195 Going Home---KM算法求最小权值匹配(存负边)

    题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...

  8. sw算法求最小割学习

    http://  blog.sina.com.cn/s/blog_700906660100v7vb.html 转载:http://www.cnblogs.com/ylfdrib/archive/201 ...

  9. HDU-3746 Cyclic Nacklace 字符串匹配 KMP算法 求最小循环节

    题目链接:https://cn.vjudge.net/problem/HDU-3746 题意 给一串珠子,我们可以在珠子的最右端或最左端加一些珠子 问做一条包含循环珠子的项链,最少还需要多少珠子 思路 ...

随机推荐

  1. UOJ #356. 【JOI2017春季合宿】Port Facility

    Description 小M有两个本质不同的栈. 无聊的小M找来了n个玩具.之后小M把这n个玩具随机顺序加入某一个栈或把他们弹出. 现在小M告诉你每个玩具的入栈和出栈时间,现在她想考考小S,有多少种方 ...

  2. bootstrap、qjuery、插件 、字体网页

    http://www.bootcss.com/ 前端框架bootstrap http://www.fontawesome.com.cn/faicons/ 字体图标库 https://daneden.g ...

  3. 机器学习classification_report方法及precision精确率和recall召回率 说明

    classification_report简介 sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息. 主要 ...

  4. thinkphp 查询单个“年-月-日” FROM_UNIXTIME

    *时间格式转换,使datetimepicker.js 能够搜索 查询 单个 年月日而不需是区间 查询. //另起一行看转换结果 select *,FROM_UNIXTIME(CreateTime,'% ...

  5. 阿里云搭建hadoop集群服务器,内网、外网访问问题(详解。。。)

    这个问题花费了我将近两天的时间,经过多次试错和尝试,现在想分享给大家来解决此问题避免大家入坑,以前都是在局域网上搭建的hadoop集群,并且是局域网访问的,没遇见此问题. 因为阿里云上搭建的hadoo ...

  6. Dubbo安装及其实战1

    一.Dubbo安装 (1)安装zk和tomcat yum 安装tomcat 默认路径为 /usr/share/tomcat zookeeper 我这里采用的是使用zookeeper管理的.所以要安装z ...

  7. 理解CSS3 transform中的Matrix(矩阵)——张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2427 一.哥,我被你 ...

  8. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...

  9. Myeclipse打war包方法

    Myeclipse三种打包方法第一种方法打开Myeclipse如图操作. 如果该项目已存在需要移除之后在进行第三步,接着往下走. 项目打war包成功,推荐使用第一种方法. 第二种方法https://b ...

  10. drupal7 带表达式条件的update

    原本的mysql语句是这样的: ; 转化成drupal的api是这样的 $total_amount=1; $rows= db_update('my_payment_card') ->expres ...