网络分析优化Steiner Tree算法初探

                                 网络分析优化Steiner Tree算法初探

                                            By wangsh 2011-11-26

 

    网络图分析中,Steiner Tree是一个重要研究内容(参考1),斯坦纳树问题是组合优化的经典问题, 
    目前能求解这个问题的算法和工具比较多(参考2),Geosteiner(参考3),FLUTE(参考4),Goblin(参考5),PHYLIP(参考6)和Salowe(参考7)。
 
    未完整,待后续补充完整。
 

 

参考资料

1.     Wiki网址 http://en.wikipedia.org/wiki/Steiner_tree_problem   

2.     Steiner Tree介绍网址 http://www.cs.sunysb.edu/~algorith/files/steiner-tree.shtml  

3.     Geosteiner网址 http://ganley.org/steiner/

4.     FLUTE网址 http://home.eng.iastate.edu/~cnchu/flute.html

5.     Goblin网址 http://www.math.uni-augsburg.de/~fremuth/goblin.html

6.     PHYLIP网址 http://evolution.genetics.washington.edu/phylip.html

7.     Salwoe网址 http://www.cs.sunysb.edu/~algorith/implement/salowe/distrib/

 

 保留版权,版权归作者所有,未经同意,请勿作他用。若转载请注明:http://blog.youkuaiyun.com/wsh6759/article/details/7015699 

 

 

 

 

 

斯坦纳树(Steiner tree)问题, 是组合优化这门学科中的一个著名问题, 是一个在VLSI布线、网络通信中所遇到的组合优化问题, 20世纪70年代美国贝尔实验室的三位数学家Gary,Johnson和Graham从计算复杂性的观点出发,证明求出最短网络(又称斯坦纳最小树)是非常困难的,是一个NP-难解问题。 胡晓东博士——中国科学院数学与系统科学研究院研究员,应用数学所副所长,中国数学会理事会常务理事 于1985年7月毕业于清华大学应用数学系,并获理学学士学位。同年9月被免试推荐到中国科学院应用数学研究所做硕士研究生,跟随韩继业研究员学习不可微规划。1987年9月转为博士生,跟随韩继业研究员学习非线形规划的统一理论和算法。1989年10月获运筹与控制专业理学博士学位。 1998年11月至2001年11月中的两年,胡晓东博士先后被香港城市大学聘为研究员和高级研究员,在电脑科学系与贾小华副教授和当时正在该校访问的堵丁柱研究员一起研究了计算机通讯网络中的组合优化问题,其中包括,光纤通讯网络中的波长最优分配和路由最优设计问题,分布式计算机系统或者互联网中的数据备份的最优放置问题。这期间,他与两位合作者完成了英文著作《多波长光纤网络》。 目前,胡晓东博士是国际学术杂志《组合最优化》(Journal of Combinatorial Optimization,Kluwer Academic Publishers, USA)的编委(1996年 - ),国内期刊《应用数学学报》(中文版)编委和国内期刊《应用数学》编委;他还是美国《数学评论》(Mathematical Review)评论员。此外胡晓东博士是中国运筹学会会员(1992年 - ),美国数学会会员 (1994年 - ),美国IEEE计算机学会会员 (1997年 - )。 近十年来,胡晓东博士担任了两个国际会议的程序委员会委员,ISAAC'94 (ISAAC - Annual International Symposium on Algorithm and Computation)和IEEE/ICCCN’2000 (ICCCN – International Conference on Computer Communications and Networks);同时,他还参与组织了两个系列国际会议,COCOON'95, COCOON'97, COCOON'98, COCOON'01 (COCOON - Annual International Computing and Combinatorics Conference)和ISORA'95, ISORA'96, ISORA'98 (ISORA - International Symposium on Operations Research and its Applications)。
Minimal Steiner Tree (MST) 是图论中的一个重要问题,用于寻找连接给定节点集合(称为Steiner树)所需的最小权重边集。基于点权的算法通常是指Prim或Kruskal算法,但在这里,我会给你介绍一种基于Prim算法的简化版本,因为它的实现更符合题目要求。 首先,假设我们有一个无向加权图G = (V, E),其中V是一组顶点,E是一组带权重的边。Prim算法从一个初始顶点开始,逐步添加边来构建最小生成树。 ```java import java.util.*; // 定义图的结构,包含顶点和邻接权重 class Edge implements Comparable<Edge> { int src; int dst; double weight; // 构造函数 public Edge(int src, int dst, double weight) { this.src = src; this.dst = dst; this.weight = weight; } // 按照权重进行比较 @Override public int compareTo(Edge other) { return Double.compare(this.weight, other.weight); } } // 最小生成树类,使用优先队列存储边 class PrimMST { private List<Edge>[] adjList; // 邻接列表表示图 private PriorityQueue<Edge> minHeap; // 优先队列,按权重排序 // 构造函数,初始化数据结构 public PrimMST(int vertices) { adjList = new ArrayList[vertices]; for (int i = 0; i < vertices; i++) { adjList[i] = new ArrayList<>(); } minHeap = new PriorityQueue<>(); } // 添加边到图并更新优先队列 void addEdge(int src, int dst, double weight) { Edge edge = new Edge(src, dst, weight); adjList[src].add(edge); adjList[dst].add(edge); // 对称边 minHeap.offer(edge); } // Prim算法的核心步骤 List<Edge> findMST() { int[] included = new int[adjList.length]; // 标记哪些顶点被加入生成树 Arrays.fill(included, 0); Edge currentEdge = null; while (!minHeap.isEmpty()) { // 只要堆不空 currentEdge = minHeap.poll(); // 获取当前最小权重的边 int u = currentEdge.src; // 边的起点 if (included[u] == 0) { // 如果u还未被加入,将其标记为1 included[u] = 1; // 将u的所有未包括的邻居边加入优先队列 for (Edge e : adjList[u]) { if (e.dst != currentEdge.dst && included[e.dst] == 0) { minHeap.offer(e); } } } } List<Edge> mstEdges = new ArrayList<>(); // 存储找到的最小生成树的边 for (int i = 0; i < included.length; i++) { if (included[i] == 1) { mstEdges.add(currentEdge); // 如果顶点i被包括,则记录这条边 } } return mstEdges; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值