電路板排線問題的java實現(回溯法--排列樹)
具體問題描述以及C/C++實現參見網址
http://blog.csdn.net/liufeng_king/article/details/8898372
import java.util.Scanner;
/**
* 電路板排線問題--回溯法(排列樹)
* @author Administrator
*
*/
public class Board {
public int n;//電路板數
public int m;//連接塊數
public int [] x;//當前解
public int[] bestx;//當前最優解
public int[] total;//total[j]=連接塊j的電路板數
public int[] now;//now[j]=當前解中所含連接塊j的電路板數
public int bestd;//當前最優密度
public int[][] b;//連接塊數組
public int arrange(int[][] bb){
//初始化
n=bb.length-1;
m=bb[1].length-1;
bestx=new int[n+1];
x=new int[n+1];
total=new int[m+1];
now=new int[m+1];
bestd=m+1;
b=bb;
//置x爲單位排列
//計算total[]
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
total[j]+=b[i][j];
}
x[i]=i;
}
backtrack(1,0);
return bestd;
}
/**
* 交換數組x下標爲i,j的值
* @param xx
* @param i
* @param j
*/
public void swap(int[] xx,int i,int j){
int temp=xx[i];
xx[i]=xx[j];
xx[j]=temp;
}
/**
* 回溯
* @param i 樹的第i層
* @param dd 上一層得到的最小密度
*/
public void backtrack(int i,int dd){
if(i==n){
for(int j=1;j<=n;j++){
bestx[j]=x[j];
}
bestd=dd;
}else{
for(int j=i;j<=n;j++){
//選擇x[j]爲下一塊電路板
int d=0;
for(int k=1;k<=m;k++){
now[k]+=b[x[j]][k];
if(now[k]>0&&total[k]!=now[k])
d++;
}
//更行d值
if(dd>d)
d=dd;
if(d<bestd){
swap(x,i,j);
backtrack(i+1,d);
swap(x,i,j);
}
for(int k=1;k<=m;k++){
now[k]-=b[x[j]][k];
}
}
}
}
public static void main(String[] args) {
int m=5;//連接塊數
int n=8;//電路板數
int[][] b=new int[n+1][m+1];
System.out.println("n塊電路板爲{B={1,2,3,4,5,6,7,8}");
System.out.println("m個連接爲:N1={4,5,6};N2={2,3};N3={1,3};N4={3,6};N5={7,8}");
System.out.println("請輸入二維數組b,其中b[i][j]值爲1表示電路板i在連接塊Nj中:");
Scanner sc=new Scanner(System.in);
for(int i=1;i<=n;i++){
String str=sc.nextLine();
String[] s=str.split(" ");
for(int j=1;j<=m;j++){
b[i][j]=Integer.parseInt(s[j-1]);
}
}
Board board=new Board();
int bestd=board.arrange(b);
System.out.println("最小密度爲:"+bestd);
System.out.print("最優排列爲:");
for(int j=1;j<board.bestx.length;j++){
System.out.print(board.bestx[j]+" ");
}
}
}
/*
輸入:
0 0 1 0 0
0 1 0 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 0 0
1 0 0 1 0
0 0 0 0 1
0 0 0 0 1
輸出:
最小密度爲:2
最優排列爲:1 2 3 4 5 6 7 8
*/