拉斯维加斯算法结合分枝限界算法解决电路板布线问题Word文档格式.docx
- 文档编号:18910970
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:18
- 大小:18.57KB
拉斯维加斯算法结合分枝限界算法解决电路板布线问题Word文档格式.docx
《拉斯维加斯算法结合分枝限界算法解决电路板布线问题Word文档格式.docx》由会员分享,可在线阅读,更多相关《拉斯维加斯算法结合分枝限界算法解决电路板布线问题Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
&
(nbr.col==finish.col))
break;
selectPostion[num].row=nbr.row;
----------
selectPostion[num].col=nbr.col;
num++;
}
}
if(num>
0)//如果标记,则在这么多个未标记个数中随机选择一个位置
//将这个邻居入队
q_FindPath.push(selectPostion[rand()%(num)]);
二、结果分析
红色字表示输入
蓝色字表示输出结果
运行时间表示算法复杂度
1)样例一:
3*3棋盘
---------分支限界法之布线问题--------
在一个m*n的棋盘上,请分别输入m和n,代表行数和列数,然后输入回车
33(回车)
初始化棋盘格和加围墙
-------------------------------
-2-2-2-2-2
-2-1-1-1-2
-------------------------------
请输入已经占据的位置行坐标列坐标,代表此位置不能布线
例如输入22表示坐标22不能布线;
当输入的坐标为00表示结束输入
21(回车)
23(回车)
33(回车)
00(回车)
布线前的棋盘格
-2-3-1-3-2
-2-1-1-3-2
请输入起点位置坐标
11(回车)
请输入终点位置坐标
31(回车)
没有找到路线,第1次尝试
没有找到路线,第2次尝试
没有找到路线,第3次尝试
$代表围墙
#代表已经占据的点
*代表布线路线
=代表还没有布线的点
$$$$$
$**=$
$#*#$
$**#$
路径坐标和长度
(1,1)(1,2)(2,2)(3,2)(3,1)
路径长度:
5
布线完毕,查找4次
运行时间:
12ms
2)样例二:
5*5棋盘
在一个m*n的棋盘上,请分别输入m和n,代表行数和列数
55(回车)
-2-2-2-2-2-2-2
-2-1-1-1-1-1-2
32(回车)
34(回车)
35(回车)
45(回车)
-2-3-3-1-3-3-2
-2-1-1-1-1-3-2
52(回车)
没有找到路线,第4次尝试
没有找到路线,第5次尝试
没有找到路线,第6次尝试
$$$$$$$
$*====$
$***==$
$##*##$
$==*=#$
$=**==$
(1,1)(2,1)(2,2)(2,3)(3,3)(4,3)(5,3)(5,2)
8
布线完毕,查找7次
16ms
3)样例三:
10*10棋盘
1010(回车)
-2-2-2-2-2-2-2-2-2-2-2-2
-2-1-1-1-1-1-1-1-1-1-1-2
51(回车)
53(回车)
54(回车)
57(回车)
58(回车)
59(回车)
-2-3-3-3-3-3-1-3-3-3-1-2
99(回车)
没有找到路线,第7次尝试
$$$$$$$$$$$$
$*=====**==$
$**********$
$=========*$
$=====*****$
$#####*###=$
$=====*====$
$=====****=$
$==========$
(1,1)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(1,7)(1,8)(2,8)(2,9)(2,10)(3,10)(4,10)(4,9)(4,8)(4,7)(4,6)(5,6)(6,6)(7,6)(8,6)(9,6)(9,7)(9,8)(9,9)
27
布线完毕,查找8次
31ms
代码:
#include<
queue>
iostream>
#include<
time.h>
stdio.h>
stdlib.h>
windows.h>
math.h>
usingnamespacestd;
//表示方格上位置的结构体
structPosition
{
introw;
intcol;
};
//分支限界算法
boolFindPath(Positionstart,Positionfinish,int&
PathLen,Position*&
path,int**grid,intm,intn)
//找到最短布线路径,则返回真,否则返回假
//起点和终点想同,不用布线
if((start.row==finish.row)&
start.col==finish.col)
PathLen=0;
returntrue;
//设置方向移动坐标值:
东、南、西、北
Positionoffset[4];
offset[0].row=0;
offset[0].col=1;
//右
offset[1].row=1;
offset[1].col=0;
//下
offset[2].row=0;
offset[2].col=-1;
//左
offset[3].row=-1;
offset[3].col=0;
//上
//相邻的方格数
intNumNeighBlo=4;
Positionhere,nbr;
//设置当前方格,即搜索单位
here.row=start.row;
here.col=start.col;
//由于0和1用于表示方格的开放和封锁,故距离:
2-03-1
grid[start.row][start.col]=0;
//-2表示强-1表示可行-3表示不能当作路线
//队列式搜索,标记可达相邻方格
queue<
Position>
q_FindPath;
do
intnum=0;
PositionselectPostion[5];
//选择位置保存
//printf("
---------%lld\n"
num);
//随机选一个入队
---------%d\n"
rand()%(num));
//是否到达目标位置finish
//活结点队列是否为空
if(q_FindPath.empty())returnfalse;
//无解
//访问对首元素出队
here=q_FindPath.front();
q_FindPath.pop();
}while(true);
//构造最短布线路径
PathLen=grid[finish.row][finish.col];
path=newPosition[PathLen];
//路径
//从目标位置finish开始向起始位置回溯
here=finish;
for(intj=PathLen-1;
j>
=0;
j--)
path[j]=here;
//找前驱位置
for(inti=0;
i<
=NumNeighBlo;
if(grid[nbr.row][nbr.col]==j)//距离加2正好是前驱位置
here=nbr;
}
intmain()
cout<
<
"
---------分支限界法之布线问题--------"
endl;
intpath_len;
intpath_len1;
intm,n;
Position*path;
Position*path1;
Positionstart,finish;
Positionstart1,finish1;
在一个m*n的棋盘上,请分别输入m和n,代表行数和列数,然后输入回车"
cin>
>
m>
n;
//创建棋盘格
int**grid=newint*[m+2];
int**grid1=newint*[m+2];
m+2;
grid[i]=newint[n+2];
grid1[i]=newint[n+2];
//初始化棋盘格
for(inti=1;
=m;
for(intj=1;
j<
=n;
j++)
grid[i][j]=-1;
//设置方格阵列的围墙
=n+1;
i++){
grid[0][i]=grid[m+1][i]=-2;
//上下的围墙
=m+1;
grid[i][0]=grid[i][n+1]=-2;
//左右的围墙
初始化棋盘格和加围墙"
-------------------------------"
for(intj=0;
n+2;
grid[i][j]<
"
;
-------------------------------"
请输入已经占据的位置行坐标列坐标,代表此位置不能布线"
例如输入22(然后输入回车),表示坐标22不能布线;
当输入的坐标为00(然后输入回车)表示结束输入"
//添加已经布线的棋盘格
while(true)
intci,cj;
ci>
cj;
if(ci>
m||cj>
n)
输入非法"
行坐标<
m<
列坐标<
n<
当输入的坐标为0,0,结束输入"
continue;
}elseif(ci==0||cj==0){
}else{
grid[ci][cj]=-3;
//布线前的棋盘格
布线前的棋盘格"
请输入起点位置坐标"
start.row>
start.col;
请输入终点位置坐标"
finish.row>
finish.col;
DWORDstartTime,stopTime;
startTime=GetTickCount();
//程序开始时间
inttime=0;
//为假设运行次数
//初始值值拷贝
start1=start;
finish1=finish;
path_len1=path_len;
path1=NULL;
grid1[i][j]=grid[i][j];
boolresult=FindPath(start1,finish1,path_len1,path1,grid1,m,n);
while(result==0&
time<
100){
time++;
cout<
没有找到路线,第"
time<
次尝试"
result=FindPath(start1,finish1,path_len1,path1,grid1,m,n);
stopTime=GetTickCount();
//程序结束时间
if(result)
$代表围墙"
#代表已经占据的点"
*代表布线路线"
=代表还没有布线的点"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 拉斯维加斯 算法 结合 分枝 限界 解决 电路板 布线 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)