From 5c3d2c95b07714d4162eb87d4da31eac69e0254f Mon Sep 17 00:00:00 2001 From: Mizux Seiha Date: Thu, 2 Dec 2021 09:39:12 +0100 Subject: [PATCH] Fix MultipleKnapsackSat --- ortools/sat/samples/MultipleKnapsackSat.cs | 14 ++++++++------ ortools/sat/samples/MultipleKnapsackSat.java | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/ortools/sat/samples/MultipleKnapsackSat.cs b/ortools/sat/samples/MultipleKnapsackSat.cs index 32796b7003..c54b5f35ab 100644 --- a/ortools/sat/samples/MultipleKnapsackSat.cs +++ b/ortools/sat/samples/MultipleKnapsackSat.cs @@ -69,27 +69,29 @@ public class MultipleKnapsackSat // The amount packed in each bin cannot exceed its capacity. foreach (int b in allBins) { - LinearExpr[] binWeights = new LinearExpr[NumItems]; + IntVar[] vars = new IntVar[NumItems]; foreach (int i in allItems) { - binWeights[i] = LinearExpr.Term(x[i, b], /*coeff=*/Weights[i]); + vars[i] = x[i, b]; } - model.Add(LinearExpr.Sum(binWeights) <= 1); + model.Add(LinearExpr.ScalProd(vars, Weights) <= BinCapacities[b]); } // [END constraints] // Objective. // [START objective] - LinearExpr[] objective = new LinearExpr[NumItems * NumBins]; + IntVar[] objectiveVars = new IntVar[NumItems * NumBins]; + int[] objectiveValues = new int[NumItems * NumBins]; foreach (int i in allItems) { foreach (int b in allBins) { int k = i * NumBins + b; - objective[k] = LinearExpr.Term(x[i, b], /*coeff=*/Values[i]); + objectiveVars[k] = x[i, b]; + objectiveValues[k] = Values[i]; } } - model.Maximize(LinearExpr.Sum(objective)); + model.Maximize(LinearExpr.ScalProd(objectiveVars, objectiveValues)); // [END objective] // Solve diff --git a/ortools/sat/samples/MultipleKnapsackSat.java b/ortools/sat/samples/MultipleKnapsackSat.java index cd4e6f3689..b98636f98b 100644 --- a/ortools/sat/samples/MultipleKnapsackSat.java +++ b/ortools/sat/samples/MultipleKnapsackSat.java @@ -67,25 +67,27 @@ public class MultipleKnapsackSat { // The amount packed in each bin cannot exceed its capacity. for (int b : allBins) { - IntVar[] binWeights = new IntVar[numItems]; + IntVar[] vars = new IntVar[numItems]; for (int i : allItems) { - binWeights[i] = LinearExpr.term(x[i][b], weights[i]); + vars[i] = x[i][b]; } - model.addLessOrEqual(LinearExpr.sum(binWeights), 1); + model.addLessOrEqual(LinearExpr.scalProd(vars, weights), binCapacities[b]); } // [END constraints] // Objective. // [START objective] // Maximize total value of packed items. - IntVar[] objective = new IntVar[numItems * numBins]; + IntVar[] objectiveVars = new IntVar[numItems * numBins]; + int[] objectiveValues = new int[numItems * numBins]; for (int i : allItems) { for (int b : allBins) { int k = i * numBins + b; - objective[k] = LinearExpr.term(x[i][b], values[i]); + objectiveVars[k] = x[i][b]; + objectiveValues[k] = values[i]; } } - model.maximize(LinearExpr.sum(objective)); + model.maximize(LinearExpr.scalProd(objectiveVars, objectiveValues)); // [END objective] // [START solve]