当前位置:编程学习 > JAVA >>

分支限界法 ,java,实现 电路板排列问题,程序总是默认排序,求解答

求高手帮忙看代码运行那里有问题
程序写完 运行结果总是默认的1、2、3、4、5、6、7、8。无法排序,急,,,
问题描述:
设x表示n块电路板的一个排列,即在机箱的第i个插槽中插入电路板x[i]  
x所确定的电路板排列密度density(x)定义为跨越相邻电路板插槽的最大连接数  
在设计机箱,插槽一侧的布线间隙由电路板排列的密度所确定  
因此电路板排列问题要求对于给定电路板连接条件(连接块),确定电路板的最佳排列,使  
其具有最小的密度  下面是代码
//测试类
public class BbBoardTest {

public static void main(String[] args) {
BbBoard bbboard=new BbBoard();
bbboard.bb();
bbboard.display();
}

}
//节点类
public class HeapNode {
int []now;
int []x;
int td;//
int s;//排列树中 的层次
public HeapNode(int []noww,int []xx,int tempd,int ss){
now=noww;
x=xx;
td=tempd;
s=ss;
             
}
}
//自己写的一个队列或者堆类,主要使用其“当前最小”方法
public class HeapHeap {

HeapNode []aa;//=new HeapNode[300];
int i;//加入新的节点的指针
int j;//选一次最小的指针
int pos ;
public HeapHeap(){
aa=new HeapNode[999900];//[Integer.MAX_VALUE];//
i=0;
pos=0;
j=0;
}
//新的节点 加入
public void add(HeapNode newNode){
aa[i]=newNode;
i++;
}
//把小的节点排列到数组的前面
public  void pushHead(){
HeapNode tempNode=aa[j];
int index=0;
for (int imi=j+1;imi<i;imi++){
if (aa[imi].td<tempNode.td)
{

index=imi;
aa[j]=aa[imi];
aa[imi]=tempNode;
}
}
}//去当前td最小的节点
public HeapNode getMin() {
return aa[j++];
}

}
//分支限界类

import java.util.Scanner;

public class BbBoard {
int n;//电路板数
int m;//连接块数
int td;//考虑某一层次(或者说第i个节点)时当前最优密度
int bestd;//当前最优解密度
int [][]a;//a[i][j]是第i个电路板和第j个连接块的关系,1是包含,0不包含
int []total;//某个连接块所包含的最大数目的电路板数
int []now;//到某一层次(或者第i个节点)第j个连接块所包含的电路板数
int []bestx;//最优解(每个位置放置的电路板情况)

//构造函数
public BbBoard(){
//这里是初始化电路板和连接块数,以及连接关系
Scanner scan =new Scanner(System.in);
System.out.println("输入电路板,插槽数:");
int nn=scan.nextInt();
System.out.println("连接块数:");
int mm=scan.nextInt();
System.out.println("分别输入电路板和连接块的,关系数:");
this.n=nn;
this.m=mm;
a=new int [n][m];
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++){
a[i][j]=scan.nextInt();
}
}
//total赋值
this.total=new int[m+1];
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
this.total[j+1]=a[i][j];
}
}//total赋值完毕
this.now=new int[m+1];
//初始化化
this.bestd=100000;//赋给一个较大的值
this.td=0;
this.bestx=new int[n+1];

}//构造函数完毕

public void bb(){
int []x=new int[n+1];
for (int i=1;i<=n;i++){
x[i]=i;
}
HeapHeap heap=new HeapHeap();
HeapNode enode=new HeapNode(now,x,0,0);


while (enode!=null&&enode.td<bestd){

//最后一个叶节点
if(enode.s==n-1){
bestd=enode.td;

for (int iii=0;iii<=n;iii++)
bestx[iii]=enode.x[iii];
}
//其他中间节点
else{//扩展儿子节点
for (int ii=enode.s+1;ii<n;ii++){
//执行该节点,计算相关验证;tempnow 和temptd都是准备扩展的节点的状态
int []tempnow=new int [m+1];
int d=0;
for (int k=0;k<m;k++){
tempnow[k+1]=enode.now[k+1];
tempnow[k+1]+=a[ii][k];
if (tempnow[k+1]>0&&total[k]!=tempnow[k+1]) 
d++;
}
int temptd=enode.td;
if (d>temptd) temptd=d;//因为总体密度取所有节点密度最大的一个,所以比较那个最大
if(temptd<bestd){
//生成新节点
int xx[]=new int[n+1];
for (int iii=0;iii<=n;iii++)
xx[iii]=x[iii];
// xx=x;
// int tempd;
// if (rmaxd>nd[x[i]]) tempd=rmaxd;
// else {
// tempd=nd[x[i+1]];
// for (int p=i+2;p<=n;p++){
// if (tempd<nd[x[p]]) 
// tempd=nd[x[p]];
// }
// }
//选择最大完成
xx[enode.s+1]=x[ii];
xx[ii]=x[enode.s+1];
HeapNode node=new HeapNode(tempnow,xx,temptd,enode.s+1);

heap.add(node);
}
}

}
enode =(HeapNode)heap.getMin();
}


}

public void display(){

for (int i=1;i<=n;i++){
System.out.print("第"+i+"个数是:"+bestx[i]+" ");
}
System.out.println("\n最优密度:"+bestd);
}
}
--------------------编程问答-------------------- lz解决了麻~ --------------------编程问答-------------------- 马虎排出来了,不过还是很晕。
引用 1 楼  的回复:
lz解决了麻~
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,