构建生成树算法----得到父节点的值

最近在一个项目中接触到一个算法,类似于构建生成树算法,但是还是有点不同,首先讲一下该算法的构建所需要实现的功能,如下图所示:

 比如:要得到A的值,若是B和C的值不为空,那么A=B+C,若是B的值为空,那么就继续找父节点为B的节点信息,若D和E的值不为空,那么A=C+D+E,若是D为空,那么A的值是得到不到的,返回为空,若是D值不为空,E值为空,那么找E的孩子节点信息,若是G不为空的话,那么A=D+G-+C   本算法的大致意思就是这样,那么该如何实现呢?

再项目开发过程中,我是先考虑实现功能,在功能实现的基础上再考虑算法功能优化为题,该算法采用的是算法思想中的回溯法,首先看下该算法设计的步骤

1.构建树之前先建立一个实体类TreeModel,其中该类中包含三个参数,如下代码所示:

public class TreeModel {
		
	private Long no;
	private String scheduleid;
	private Long fatherno;
	public Long getNo() {
		return no;
	}
	public void setNo(Long no) {
		this.no = no;
	}
	public String getScheduleid() {
		return scheduleid;
	}
	public void setScheduleid(String scheduleid) {
		this.scheduleid = scheduleid;
	}
	public Long getFatherno() {
		return fatherno;
	}
	public void setFatherno(Long fatherno) {
		this.fatherno = fatherno;
	}
	public TreeModel(Long no, String scheduleid, Long fatherno) {
		super();		
		this.no = no;
		this.scheduleid = scheduleid;
		this.fatherno = fatherno;
	}
	public TreeModel() {
		super();		
	}	
}

2.第一个参数是一个节点的标识,第二个是该节点的值,第三个参数对应的是父节点的标识,对于第一个节点A,父节点我标识为0,构建生成树的具体代码如下所示:

public class TreeModelUtil {
	/**
	 * 构建树的形状,A中的id类似一个电路路由的id,父节点id值为11的代表的是第一层,
	 *下面的则是逐层遍历
	 * */		
		public String s="";
	public String forRecursion(List<TreeModel> list,long pid){
		for (int i = 0; i < list.size(); i++) {
		//	System.out.println("treemodelutil--->"+list.get(i).getNo()+"___"+list.get(i).getScheduleid()+"__"+list.get(i).getFatherno());
			long id=list.get(i).getNo();
			String scheduleid=list.get(i).getScheduleid();
			if (list.get(i).getFatherno()==pid) {	
				Long flag=isendNode(list,id);
				if (flag==1) {
					if (scheduleid!=null) {
						s+=scheduleid+"+";
					}else {
						forRecursion(list, id);
					}					
				}
				if(flag==2){
					if (scheduleid!=null) {
						s+=scheduleid+"+";
					}else {
						s+="不可测+";
					}
				}
			}
		}
		
		return s;
	}
	public Long isendNode(List<TreeModel> list,long id){
		//此处判断是不是根节点,不是根节点为1,是跟节点2
		Long flag=(long)1;
		List<Long> listFno=new ArrayList();		
		for (int i = 0; i < list.size(); i++) {
			listFno.add(list.get(i).getFatherno());			
		}
		if (listFno.contains(id)) {
			//不是根节点
			flag=(long)1;
		}else{
			//是根节点
			flag=(long)2;
		}
		return flag;
	}	

该类中包含两个方法,第一个方法是构建生成树,第二个方法是判断是不是叶子节点。

3.先写一个测试类,如下:

public class TreeModelMain {
	public void getTestResult(){
		List<TreeModel> list = new ArrayList();
		/**
		 * 构建树的形状,A中的id类似一个电路的id,父节点id值为11的代表的是第一层, 下面的则是逐层遍历
		 * treeModel中封装的是电路id,路由段对应的规则id和(再项目中是这么应用的),攥取得到的父类id
		 */

		TreeModel treeModel1 = new TreeModel((long) 11, "A", (long) 0);
		TreeModel treeModel2 = new TreeModel((long) 22, null, (long) 11);
		TreeModel treeModel3 = new TreeModel((long) 33, "C", (long) 11);
		TreeModel treeModel4 = new TreeModel((long) 44, "D", (long) 22);
		TreeModel treeModel5 = new TreeModel((long) 55, "E", (long) 22);
		TreeModel treeModel6 = new TreeModel((long) 66, "F", (long) 33);
		TreeModel treeModel7 = new TreeModel((long) 77, "G", (long) 55);
	//	TreeModel treeModel8 = new TreeModel((long) 88, "H", (long) 33);
	//	TreeModel treeModel9 = new TreeModel((long) 99, "I", (long) 33);
		list.add(treeModel1);
		list.add(treeModel2);
		list.add(treeModel3);
		list.add(treeModel4);
		list.add(treeModel5);
		list.add(treeModel6);
		list.add(treeModel7);
	//	list.add(treeModel8);
	//	list.add(treeModel9);
		TreeModelUtil tm=new TreeModelUtil();
		String ss="";
		ss=tm.forRecursion(list, 11);
		if ( ss.contains("不可测")) {
   ss="不可测";
   System.out.println("不可测");
  }else {
   System.out.println("A=" + ss.substring(0, ss.length()-1));
  }	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
			TreeModelMain tmmain=new TreeModelMain();			
			tmmain.getTestResult();
		
	}

}

上例的输出结果是:A=D+E+C
这是在B不可测的情况下得到的值。

若是修改D为空,哪儿就会输出不可测,得不到值的情况

本算法主要采用的是一个递归思想,通俗的话来说出了叶子节点之外,别的孩子节点始终会变成父亲,然后就这样递归下去,最后得到值,本算法中可能还存在很多的缺陷,能忘能够得到高手的指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多机器人螺旋生成树算法(Multi-Robot Spiral Spanning Tree Algorithm)是一种分布式算法,用于多个机器人在未知环境中构建最小生成树。以下是一些 Python 代码示例: ```python import rospy from geometry_msgs.msg import Twist from nav_msgs.msg import Odometry from std_msgs.msg import String import math class Robot: def __init__(self, robot_name): self.name = robot_name self.position = [0, 0] self.neighbors = [] self.parent = None self.children = [] self.visited = False self.pub = rospy.Publisher(robot_name + '/cmd_vel', Twist, queue_size=10) self.sub = rospy.Subscriber(robot_name + '/odom', Odometry, self.update_position) def update_position(self, msg): x = msg.pose.pose.position.x y = msg.pose.pose.position.y self.position = [x, y] def move(self, direction): vel_msg = Twist() vel_msg.linear.x = 0.5 vel_msg.angular.z = direction self.pub.publish(vel_msg) def stop(self): vel_msg = Twist() self.pub.publish(vel_msg) def add_neighbor(self, neighbor): self.neighbors.append(neighbor) def set_parent(self, parent): self.parent = parent def add_child(self, child): self.children.append(child) def set_visited(self, visited): self.visited = visited def distance(p1, p2): return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) def get_closest_neighbor(robot, robots): closest_neighbor = None closest_distance = float('inf') for neighbor in robot.neighbors: if not neighbor.visited: d = distance(robot.position, neighbor.position) if d < closest_distance: closest_distance = d closest_neighbor = neighbor return closest_neighbor def get_direction(robot, destination): dx = destination[0] - robot.position[0] dy = destination[1] - robot.position[1] return math.atan2(dy, dx) def move_to(robot, destination): direction = get_direction(robot, destination) robot.move(direction) while distance(robot.position, destination) > 0.1: rospy.sleep(0.1) robot.stop() def spiral(robot, robots, level): robot.set_visited(True) if level == 0: return for i in range(level): move_to(robot, [robot.position[0] + i, robot.position[1]]) neighbor = get_closest_neighbor(robot, robots) if neighbor: robot.add_child(neighbor) neighbor.set_parent(robot) spiral(neighbor, robots, level-1) if __name__ == '__main__': rospy.init_node('multi_robot_spiral') robots = [] for i in range(5): robot = Robot('robot' + str(i)) robots.append(robot) for i in range(5): for j in range(i+1, 5): robots[i].add_neighbor(robots[j]) robots[j].add_neighbor(robots[i]) root = robots[0] spiral(root, robots, 4) for robot in robots: parent = robot.parent if parent: print(robot.name + ' -> ' + parent.name) ``` 这段代码创建了 5 个机器人,并在它们之间建立了邻居关系。然后,从第一个机器人开始,沿着螺旋路径移动,直到达到最小生成树的根节点。最后,打印出每个机器人的父节点

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值