簡體   English   中英

安全包裝 - Choco-solver

[英]Safe packing - Choco-solver

問題:

您需要在不擠壓任何東西的情況下將幾件物品裝入購物袋。 這些物品將一個放在另一個上面。 每個項目都有重量和強度,定義為可以放置在該項目上方而不會被壓扁的最大重量。 如果袋子中沒有任何物品被壓扁,則包裝訂單是安全的,也就是說,對於每件物品,如果該物品的強度至少是放在該物品上方的物品的總重量。 例如,這里有三件物品和一個包裝訂單:

在此處輸入圖像描述

這種包裝不安全。 面包被壓扁是因為它上面的重量 5 大於它的強度 4。然而,交換蘋果和面包可以得到一個安全的包裝。

目標:

我需要使用 choco solver 找到這個問題的所有解決方案,然后測試是否枚舉了這個解決方案:

N=3, WS = { (5,6), (4,4), (10,10) } 

我嘗試了什么:

首先我寫了我的 CSP model

在此處輸入圖像描述

然后我像這樣寫了我的巧克力代碼

public static void main(String[] args) {
    int[][] InitialList = {{5,6}, {4,4}, {10,10}};
    int N = InitialList.length;

    Model model = new Model("SafePacking");

    // Create IntVars of weights and strengths
    IntVar[] weights = new IntVar[N], strengths = new IntVar[N];
    for (int i = 0; i < N; i++) {
        weights[i] = model.intVar("Weight"+i, InitialList[i][0]);
        strengths[i] = model.intVar("Strength"+i, InitialList[i][1]);
    }

    // Create IntVar of positions
    IntVar[] positions = model.intVarArray("P",N, 0, N-1);
    model.allDifferent(positions).post();

    for(int i = 0; i < N; i++) {
        int sum = 0;
        for(int j = 0; j < N; j++)
            if (positions[j].getValue() < positions[i].getValue())
                sum += weights[j].getValue();
        model.arithm(model.intVar(sum), "<=", strengths[i]).post();
    }

    Solution solution = model.getSolver().findSolution();
    System.out.println(solution);

}

但我得到了這個結果:

Solution: P[0]=0, P[1]=1, P[2]=2

這是一個錯誤的解決方案。 我錯過了什么?

sum 的計算似乎假設變量具有定義的值,而它們沒有。 在未實例化的IntVar上調用getValue()將為 Choco 中的變量提供下限。

為了使您的 model 工作,您需要將sum建立為IntVar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM