论文思路
参考文献
田春颖,刘瑜,冯申珅,朱世强.基于栅格地图的移动机器人完全遍历算法——矩形分解法[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