裝載問題-回溯法

有兩艘貨船,載重分別爲w1、w2,物品總重量不超過載重總量w1+w2,問物品是否都可以裝下。如,w1=w2=10,物品g1=g2=9,g3=2,則無法裝下;w1=w2=5,w3=10,則可以裝下。

    這是個典型的裝載問題,多箱多物可否容納。思路是儘可能將前邊的箱子裝滿,判斷剩餘物品是否可以裝入最後一個箱子。

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**

  • Created by zuohao on 2018/11/30.
    */
    public class BinPackingProblem {

    private List<Node> nodeList=new ArrayList<>();

    public static void main(String[] arg) {
    // new BinPackingProblem().greedy();
    new BinPackingProblem().backtracking();
    }

    /**

    }

    private void again(List<Goods> goodsList, Node parentNode,int i) {
    if (i>=goodsList.size()){
    nodeList.add(parentNode);
    return;
    }
    Goods goods=goodsList.get(i);
    int surplus=parentNode.getSurplusWeight()-goods.getWeight();
    if (surplus>=0){
    Node leftNode=new Node();
    leftNode.setSurplusWeight(surplus);
    parentNode.setLeftNode(leftNode);
    leftNode.getGoodsList().addAll(parentNode.getGoodsList());
    leftNode.getGoodsList().add(goods);
    again(goodsList,leftNode,i+1);
    }
    Node rightNode=new Node();
    rightNode.setSurplusWeight(parentNode.getSurplusWeight());
    parentNode.setRightNode(rightNode);
    rightNode.getGoodsList().addAll(parentNode.getGoodsList());
    again(goodsList,rightNode,i+1);
    }

    class Goods{
    private String name;
    private int weight;

    public Goods(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getWeight() {
        return weight;
    }
    
    public void setWeight(int weight) {
        this.weight = weight;
    }

    }

    class Node{
    private int surplusWeight;
    private Node leftNode;
    private Node rightNode;
    private List<Goods> goodsList=new ArrayList<>();

    public int getSurplusWeight() {
        return surplusWeight;
    }
    
    public void setSurplusWeight(int surplusWeight) {
        this.surplusWeight = surplusWeight;
    }
    
    public Node getLeftNode() {
        return leftNode;
    }
    
    public void setLeftNode(Node leftNode) {
        this.leftNode = leftNode;
    }
    
    public Node getRightNode() {
        return rightNode;
    }
    
    public void setRightNode(Node rightNode) {
        this.rightNode = rightNode;
    }
    
    public List<Goods> getGoodsList() {
        return goodsList;
    }
    
    public void setGoodsList(List<Goods> goodsList) {
        this.goodsList = goodsList;
    }

    }
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章