机器人全遍历——矩形分解法之拓扑图找Hamilton路径代码

论文思路

参考文献
	
田春颖,刘瑜,冯申珅,朱世强.基于栅格地图的移动机器人完全遍历算法——矩形分解法[J].机械工程学报,2004,40(10):56-61.

存在性证明

存在性证明

算法

相邻分块求解

原文如下,但实际写代码过程中发现没有必要用这些公式进行复杂得计算,因此直接根据坐标判断是何种相邻方式,因为后面求解的算法仅仅需要区分开右相邻与其他相邻,相邻与不相邻。

在这里插入图片描述

public static int adjacent(Vector A,Vector B) {  //判断两个矩阵是何种相邻方式
	int x1,x2,x3,x4,y1,y2,y3,y4;

	x1 = (int)A.elementAt(0);
	x2 = (int)A.elementAt(1);
	y1 = (int)A.elementAt(2);
	y2 = (int)A.elementAt(3);

	x3 = (int)B.elementAt(0);
	x4 = (int)B.elementAt(1);
	y3 = (int)B.elementAt(2);
	y4 = (int)B.elementAt(3);

	if(x2 == x3 && !(y1 >= y4) && !(y2 <= y3)) {
		return 1; //right
	}
	else if(y1 == y4 && x1 <= x4 && x2 >= x3) {
		return 2; //above
	}
	else if(y2 == y3 && x3 <= x2 && x4 >= x1) {
		return 3;//below
	}
	else if(x1 == x4 && y4 <= y1 && y3 >= y2) {
		return 5;//left
	}
	else {
		return 0;
	}

}

Hamilton路径求解算法

由于后面需要在两个相邻矩阵中插入共同的相邻队列(似乎和先入先出队列有矛盾?),所以还是利用的Vector来存储。
在这里插入图片描述

	Vector path = new Vector(6);

	path.addElement(matrix);

	for(int i = 0; i < matrix3.size(); i++) {
		Vector b = (Vector)matrix3.elementAt(i);
		if(adjacent(matrix,b) == 1){
			path.addElement(b);
		}
	}
	System.out.println("all adjacent matrix for initial matrix");
	printvec(path);
	for(int i = 0; i < path.size() ; i++) {
		for(int j = 0; j!=i&&j < path.size(); j++) {
		if(adjacent((Vector)path.elementAt(i),(Vector)path.elementAt(j))!=0) {
			for(int k = 0; k < matrix3.size();k++) {
				if(!path.contains(matrix3.elementAt(k))&&adjacent((Vector)path.elementAt(i),(Vector)matrix3.elementAt(k))!=0&&adjacent((Vector)path.elementAt(j),(Vector)matrix3.elementAt(k))!=0)
				{
					path.insertElementAt((Vector)matrix3.elementAt(k),i);
				}
				}
			}

		}
	}
	
	System.out.println("the hamilton path:");
	printvec(path);

三重循环看起来实属有些许愚蠢,但感觉好像也只能这样?不知是否有更好的方法,欢迎交流学习

完整代码见github
rectangle decomposition

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值