`

分支限界法

阅读更多

分支限界法之布线问题

 

一、要求:

    1、输入电路板区域n*m以及布线的起始位置和结束位置;

    2、输出布线方案;

    3、可以使用c或者vc实现

    二、问题分析及实验原理:

    在n*m的方格阵列中存在封锁区域(布线时必须绕开的区域),找到起始位置到目标位置的最短路径。从目标位置开始向起始位置回溯,逐步构造最优解。每次向标记距离比当前方格标记距离少1的相邻方格移动,直到到达起始方格为止。

    三、算法程序源代码:

    #include <iostream>

    #include<stdio.h>

    using namespace std;

    typedef struct

    {

    int row ;

    int col ;

    }Position;

    typedef struct

    {

    //struct Position;

    int row[10000] ;

    int col[10000] ;

    int end;

    int begin ;

    }Queue;

    int grid[100][100];

    Position start, finish;

    int PathLen = 0;

    Position * path;

    int n , m , a , b , x ;

    bool FindPath(Position start,Position finish)

    {//计算从起点位置start到目标位置finish的最短布线路径,找到最短布线路//径则返回true,否则返回false

    if((start.row==finish.row) && (start.col==finish.col))

    {

    PathLen=0;

    return true;

    } //start=finish

    //设置方格阵列“围墙”

    int i ;

    for( i=0; i<= m+1; i++)

    grid[0][i]=grid[n+1][i]=1; //顶部和底部

    for( i=0; i<= n+1; i++)

    grid[i][0]=grid[i][m+1]=1; //左翼和右翼

    int j ;

    //初始化相对位移

    Position offset[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;//上

    int NumOfNbrs=4;//相邻方格数

    Position here,nbr;

    here.row=start.row;

    here.col=start.col;

    grid[start.row][start.col]=2;

    //标记可达方格位置

    //LinkedQueue<Position> Q;

    Queue Q ;

    Q.end = 0 ;

    Q.begin = 0 ;

    do {//标记相邻可达方格

    for( i=0; i<NumOfNbrs; i++)

    {

    nbr.row=here.row + offset[i].row;

    nbr.col=here.col+offset[i].col;

    if(grid[nbr.row][nbr.col]==0)

    {

    //该方格未被标记

    grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;

    if((nbr.row==finish.row) &&(nbr.col==finish.col))

    break; //完成布线

    //Q.Add(nbr);

    Q.col[Q.end] = nbr.col;

    Q.row[Q.end] = nbr.row;

    Q.end++;

    }

    }

    //是否到达目标位置finish?

    if((nbr.row==finish.row)&&(nbr.col==finish.col)) break;//完成布线

    //活结点队列是否非空?

    if(Q.begin==Q.end) return false;//无解

    else

    {

    here.row=Q.row[Q.begin];

    here.col=Q.col[Q.begin];

    Q.begin++;//取下一个扩展结点

    }

    }while(true);

    //构造最短布线路径

    PathLen=grid[finish.row][finish.col]-2;

    path=new Position[PathLen];

    //从目标位置finish开始向起始位置回溯

    here=finish;

    for( j = PathLen-1; j>=0; j--){

    path[j]=here;

    //找前驱位置

    for( i=0; i<NumOfNbrs; i++){

    nbr.row=here.row+offset[i].row;

    nbr.col=here.col+offset[i].col;

    if(grid[nbr.row][nbr.col]==j+2) break;

    }

    here=nbr;//向前移动

    }

    return true;

    }

    int main()

    {

    int j ;

    printf("输入电路板区域n*m和封锁的格数x:\n");

    cin>>n>>m>>x;

    printf("输入封锁的坐标:\n");

    for( a = 0 ; a < n+2 ; a ++ )

    for( b = 0 ; b < m +2 ; b ++ )

    grid[a][b] = 0 ;

    for( x = x ; x >= 1 ; x -- )

    {

    cin >> a >> b ;

    grid[a][b]= 1;

    }

    printf("输入起始位置和结束位置:\n");

    cin>>start.row>>start.col>>finish.row>>finish.col;

    if(FindPath(start,finish))

    {

    printf("输出路径长度及途中坐标:");

    cout<<PathLen<<endl;

    cout<<start.row<<" "<< start.col<<endl;

    for( j = 0 ; j < PathLen ; j++ )

    cout<<path[j].row<<" "<<path[j].col<<endl;

    }

    else cout<<"No Solution!"<<endl;

    delete []path;

    return 0 ;

    }

 

来自:http://c.chinaitlab.com/example/794375.html

分享到:
评论

相关推荐

    分支限界法的基本思想

    分支限界法是一种高效的问题解决方法,主要用于求解最优化问题,例如在有限的解空间中寻找最优解。它与回溯法有所不同,回溯法旨在寻找所有可能的解,而分支限界法则专注于找到一个满足条件的最优解或者一个解。 在...

    分支限界法分支限界法分支限界法

    分支限界法分支限界法分支限界法分支限界法分支限界法分支限界法分支限界法

    分支限界法实现0-1背包

    ### 分支限界法实现0-1背包问题 #### 一、基础知识介绍 **0-1背包问题**是一种经典的组合优化问题,在计算机科学与运筹学领域有着广泛的应用。问题可以表述为:给定一系列物品,每个物品都有一个重量和一个价值;...

    分支限界法求解单源最短路径.zip

    分支限界法是一种在搜索树中寻找最优解的算法,常用于解决最优化问题,如旅行商问题、0-1背包问题等。在本案例中,我们关注的是如何利用分支限界法求解单源最短路径问题。单源最短路径问题是从一个指定的起点到图中...

    分支限界法实现布线问题

    分支限界法是一种在计算机科学中用于求解最优化问题的有效搜索策略,它与回溯法密切相关,但通常更高效,因为它系统性地排除那些不能成为最优解的分支。在这个场景中,我们讨论的是如何利用分支限界法来解决布线问题...

    n皇后问题(队列分支限界法)

    在描述中提到的"队列分支限界法"是一种特殊的搜索策略,它结合了广度优先搜索(BFS)的队列结构和分支限界法的剪枝机制。相比于传统的回溯算法,分支限界法通常能更有效地找到最优解或所有解。 在C++编程环境下实现...

    单源最短路径--分支限界法

    "单源最短路径--分支限界法" 单源最短路径是图论中的一种常见问题,它是指从一个源顶点到所有其他顶点的最短路径长度。这里的长度是指路上各边权之和。本文将介绍一种解决单源最短路径问题的方法,即分支限界法。 ...

    分支限界法之最小重量机器设计问题.zip

    分支限界法是一种在搜索树中寻找最优解的全局优化算法,它与回溯法相似,但更注重效率,通过剪枝操作减少不必要的计算。在这个最小重量机器设计问题中,我们可能面临一个组合优化问题,比如如何从一组具有不同重量和...

    分支限界法求01背包c语言

    分支限界法(Branch and Bound)是一种用于解决这类优化问题的有效方法,它结合了深度优先搜索(DFS)的分支策略和动态规划的剪枝思想。在分支限界法中,通常使用优先队列(如二叉堆)来维护待探索的节点,按照某种...

    算法设计与分析 分支限界法基本思想及应用

    本文档主要讲解了分支限界法的基本思想,与回溯法的区别。然后分析了分支限界法解决0-1背包问题及旅行售货员问题

    布线算法分支限界法

    【布线算法分支限界法】是一种在计算机科学中用于求解优化问题的搜索策略,特别是在面对组合优化问题时非常有效。布线问题通常是指在二维平面上将多个点通过最短路径连接起来,形成一个网络,而目标是使得总的线路...

    分支限界法解决N皇后问题

    使用分支限界法解决N皇后问题。因为是广度优先,而且占用比较多的额外空间,所以并不是解N皇后问题的很好的算法,主要是理解分支限界法的使用。

    分支限界法-单源最短路径

    ### 分支限界法概述 #### 一、分支限界法定义及原理 **分支限界法**是一种在状态空间树上寻找问题最优解的方法。它通过构建一棵状态空间树来解决问题,这棵树包含了所有可能的解。这种方法的核心在于如何有效地...

    分支限界法解决装载问题

    分支限界法通过构建一棵解空间树来探索所有可能的解决方案,并在搜索过程中使用限界函数来剪枝,避免无效的分支,从而提高效率。 1. **解空间树**:解空间树是所有可能解的集合,每个节点代表问题的一个状态,边则...

    分支限界法之旅行售货员问题

    分支限界法是一种在计算机科学中用于解决优化问题的有效算法,尤其在图论和组合优化领域有着广泛应用。它与回溯法类似,都是通过搜索问题的解空间来找到最优解,但分支限界法通常更加高效,因为它使用了剪枝策略来...

    分支限界法解决作业分配问题

    分支限界法是一种在搜索树中寻找最优解的全局优化算法,它与回溯法相似,但更加系统化。在解决作业分配问题时,分支限界法能够有效地找到最佳的作业分配策略,使得资源得到最优利用,降低总体成本或提高整体效率。 ...

    分支限界法求解单源最短路径

    在这个场景中,我们使用了分支限界法来解决这个问题。分支限界法是一种搜索算法,通常用于优化问题,它通过系统地扩展一棵树或图的分支来寻找最优解,同时限制不那么有希望的分支,以减少计算量。 分支限界法通常...

    分支限界法介绍 讲解

    分支限界法是一种用于求解优化问题的有效算法,它基于广度优先搜索策略来遍历问题的解空间树。在解决一系列复杂问题时,如单源最短路径问题、装载问题、0-1背包问题、最大团问题、旅行售货员问题等,分支限界法能...

    动态规划法、贪心算法、回溯法、分支限界法解决0-1背包

    这个问题可以使用多种算法来解决,包括动态规划法、贪心算法、回溯法和分支限界法。下面分别详细介绍这四种方法。 1. **动态规划法**: 动态规划法是解决0-1背包问题的常用方法。基本思想是通过构建一个二维数组`c...

Global site tag (gtag.js) - Google Analytics