算法java实现--分支限界法--最优装载问题

最优装载问题的java实现(优先队列式分支限界法)

具体问题描述以及C/C++实现参见网址

http://blog.csdn.net/liufeng_king/article/details/8910956

import java.util.Collections;
import java.util.LinkedList;

/**
 * 最优装载问题--分支限界法
 * @author Lican
 *
 */
public class BestLoading {
	
	LinkedList<HeapNode> heap;
	
	/**
	 * 子集空间树中结点类型为BBnode
	 * @author Lican
	 *
	 */
	public static class BBnode{
		BBnode parent;//父结点
		boolean leftChild;//左儿子结点标志
		//构造方法
		public BBnode(BBnode par,boolean ch){
			parent=par;
			leftChild=ch;
		}
	}
	/**
	 * 最大优先队列中存储的活结点类型为HeapNode
	 * @author Lican
	 *
	 */
	public static class HeapNode implements Comparable{
		BBnode liveNode;
		int uweight;//活结点优先级(上界)
		int level;//活结点在子集树种所处的层序号
		//构造函数
		public HeapNode(BBnode node,int up,int lev){
			liveNode=node;
			uweight=up;
			level=lev;
		}
		@Override
		public int compareTo(Object x) {//升序排列
			int xu=((HeapNode)x).uweight;
			if(uweight<xu) return -1;
			if(uweight==xu) return 0;
			return 1;
		}
		public boolean equals(Object x){
			return uweight==((HeapNode)x).uweight;
		}
	}
	
	
	public void addLiveNode(int up,int lev,BBnode par,boolean ch){
		//将活结点加入到表示活结点优先队列的最大堆H中
		BBnode b=new BBnode(par,ch);
		HeapNode node=new HeapNode(b,up,lev);
		heap.add(node);
		Collections.sort(heap);
	}
	
	public int maxLoading(int[] w,int c,int[] bestx){
		//优先队列式分支限界法,返回最优重量,bestx返回最优解
		heap=new LinkedList<HeapNode>();
		int n=w.length-1;
		BBnode e=null;//当前扩展结点
		int i=1;//当前扩展结点所处的层
		int ew=0;//扩展结点所对应的载重量
		
		//定义剩余重量数组r
		int[] r=new int[n+1];
		for(int j=n-1;j>0;j--)
			r[j]=r[j+1]+w[j+1];
		
		//搜索子集空间树
		while(i!=n+1){
			//非叶结点
			//检查当前扩展结点的儿子结点
			if(ew+w[i]<=c){
				//左儿子结点为可行结点
				addLiveNode(ew+w[i]+r[i],i+1,e,true);
			}
			//右儿子结点总为可行结点
			addLiveNode(ew+r[i],i+1,e,false);
			
			//取下一个结点
			HeapNode node=heap.pollLast();
			i=node.level;
			e=node.liveNode;
			ew=node.uweight-r[i-1];
		}
		
		for(int j=n;j>0;j--){
			bestx[j]=(e.leftChild)?1:0;
			System.out.print(bestx[j]+" ");
			e=e.parent;
		}
		System.out.println();
		return ew;
	}
	
	public static void main(String[] args) {
		int n=4;
		int c=70;
		int w[]={0,20,10,26,15};//下标从1开始
		int[] bestx=new int[n+1];
		BestLoading b=new BestLoading();
		System.out.println("最优装载顺序为(1表示装入,0表示未装入):");
		int ew=b.maxLoading(w, c, bestx);
		System.out.println("最优装载重量为:"+ew);
	}
}
/*
输出:

最优装载顺序为(1表示装入,0表示未装入):
1 1 0 1 
最优装载重量为:61

 */
    原文作者:分支限界法
    原文地址: https://blog.csdn.net/lican19911221/article/details/26489305
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞