图的路由查找

图的路由查找算法:
1、 STEP ONE
[b]定义节点对象[/b]
package com.huawei.ams5000.util.routesearcher;

import java.util.ArrayList;
import java.util.List;

/**
* 节点对象
*
* @author zWX144601
*
*/
public class RouteSearcherNodeInfo
{
/**
* 节点ID
*/
private int siteId;

/**
* TOPO图ID
*/
private int topoId;

/**
* 节点名称
*/
private String name = null;

/**
* 关联的站点
*/
public List<RouteSearcherNodeInfo> relationNodes = new ArrayList<RouteSearcherNodeInfo>();

/**
* 关联的链路ID
*/
public List<List<Integer>> relationNmsPGIDS = new ArrayList<List<Integer>>();

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public List<RouteSearcherNodeInfo> getRelationNodes()
{
return relationNodes;
}

public void setRelationNodes(List<RouteSearcherNodeInfo> relationNodes)
{
this.relationNodes = relationNodes;
}

public int getSiteId()
{
return siteId;
}

public void setSiteId(int siteId)
{
this.siteId = siteId;
}

public int getTopoId()
{
return topoId;
}

public void setTopoId(int topoId)
{
this.topoId = topoId;
}

public List<List<Integer>> getRelationNmsPGIDS()
{
return relationNmsPGIDS;
}

public void setRelationNmsPGIDS(List<List<Integer>> relationNmsPGIDS)
{
this.relationNmsPGIDS = relationNmsPGIDS;
}
}

2 STEP TWO
实现查找递归算法
package com.huawei.ams5000.util.routesearcher;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;

import com.huawei.ams5000.util.routesearcher.RouteSearcherNodeInfo;

public class RouteSearcher
{

private Stack<RouteSearcherNodeInfo> stack;

private List<List<String>> resultPath = new ArrayList<List<String>>();

public RouteSearcher(Stack<RouteSearcherNodeInfo> stack)
{
this.stack = stack;
stack.clear();
}

public boolean isNodeInStack(RouteSearcherNodeInfo node)
{
Iterator<RouteSearcherNodeInfo> it = stack.iterator();
while (it.hasNext())
{
RouteSearcherNodeInfo node1 = (RouteSearcherNodeInfo)it.next();
if (node == node1)
return true;
}
return false;
}

public void savePath()
{
Object[] o = stack.toArray();
List<String> asList = new ArrayList<String>(o.length);
for (Object object : o)
{
RouteSearcherNodeInfo node = (RouteSearcherNodeInfo)object;
asList.add(node.getName());
}
resultPath.add(asList);
}

/**
* 查找路由
* @param cNode 当前查找节点
* @param pNode 前一个节点
* @param sNode 开始节点
* @param eNode 结束节点
* @return [参数说明]
*
* @return boolean [返回类型说明] 是否超找通路
* @exception throws [违例类型] [违例说明]
* @see [类、类#方法、类#成员]
*/
public boolean getPaths(RouteSearcherNodeInfo cNode, RouteSearcherNodeInfo pNode, RouteSearcherNodeInfo sNode,
RouteSearcherNodeInfo eNode)
{
RouteSearcherNodeInfo nNode = null;
if (cNode != null && pNode != null && cNode == pNode) //判断环的情况
return false;
if (cNode != null)
{
int i = 0;
stack.push(cNode); //压入当前节点
if (cNode == eNode) //递归结束条件 如果当前查找的节点为终结点,则stack中保存了一条通路
{
savePath(); //获取通路
return true; //标记找到通路
}
else
{ //如果当前节点不是目标节点,则循环找当前节点的关联节点,视图找到关联节点的每一条通路
nNode = cNode.getRelationNodes().get(i);
while (nNode != null)
{
/*
* pNode != null标记 pNode ,cNOde,nNode能组成通路,否则为断开的路,没必要处理;
* nNode == sNode标记关联节点是开始节点,开始节点没必要找通路,所有通路均由开始节点开始
* nNode == pNode标记关联节点已经所搜,没必要继续搜索
* isNodeInStack,标记nNode曾经搜索过,没必要继续搜索
*/
if (pNode != null && (nNode == sNode || nNode == pNode || isNodeInStack(nNode)))
{
i++;
if (i >= cNode.getRelationNodes().size())
nNode = null;
else
nNode = cNode.getRelationNodes().get(i);
continue;
}
//以nNode出发,看能否找到一条通路,如果找到,再找下一个节点,stack.pop()即找下一个cNode的子节点
if (getPaths(nNode, cNode, sNode, eNode) && !stack.isEmpty())
{
stack.pop();
}
//下一个子节点
i++;
if (i >= cNode.getRelationNodes().size())
nNode = null;
else
nNode = cNode.getRelationNodes().get(i);
}
stack.pop();//相对应 cNode = eNode的判断,对于当前节点来说,如果不是end节点,以为这此路不通,此节点不保存(从stack中弹出)
return false;//此路不通,return false
}
}
else
return false;
}

public Stack<RouteSearcherNodeInfo> getStack()
{
return stack;
}

public void setStack(Stack<RouteSearcherNodeInfo> stack)
{
this.stack = stack;
}

public List<List<String>> getResultPath()
{
return resultPath;
}

public void setResultPath(List<List<String>> resultPath)
{
this.resultPath = resultPath;
}

}
内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值