0
私は、ChocoソルバーIntVar変数の配列、例えばX1、X2、...、Xnを持っています。私はルールを強制する制約を定義する必要があります - minとmax変数の間の距離(絶対差)値は固定値、例えば100 = max(X1、.. Xn) - min(X1、 ..、Xn)| < 100。Choco Solver配列内の最小変数と最大変数の間の距離を定義するICF制約
誰かが助けることができますか?
私は、ChocoソルバーIntVar変数の配列、例えばX1、X2、...、Xnを持っています。私はルールを強制する制約を定義する必要があります - minとmax変数の間の距離(絶対差)値は固定値、例えば100 = max(X1、.. Xn) - min(X1、 ..、Xn)| < 100。Choco Solver配列内の最小変数と最大変数の間の距離を定義するICF制約
誰かが助けることができますか?
正確に行う方法はIntConstraintFactory.distance()
です。 docsを参照してください。
そして、ここでは、あなたが求めているものを行い、実際のコードです:
Solver solver = new Solver();
int n = 10;
IntVar[] x = VariableFactory.boundedArray("x", n, 0, 500, solver);
IntVar min = VariableFactory.bounded("min", 0, 500, solver);
IntVar max = VariableFactory.bounded("max", 0, 500, solver);
solver.post(IntConstraintFactory.minimum(min, x));
solver.post(IntConstraintFactory.maximum(max, x));
solver.post(IntConstraintFactory.distance(min, max, "<", 100));
if (solver.findSolution()) {
int solutions = 5;
int nSol = 0;
do {
System.out.print("x: ");
for (int i = 0; i < n; i++)
System.out.print(x[i].getValue() + " ");
System.out.println("\nmin = " + min.getValue() + ", max = " + max.getValue() + ", |min - max| = " + Math.abs(min.getValue() - max.getValue()) + "\n");
nSol++;
if (solutions > 0 && nSol >= solutions)
break;
} while (solver.nextSolution());
System.out.println(nSol + " solutions found.");
} else {
System.out.println("No solution found.");
}
ありがとうございます!私はチョコソルバーが初めてです。まだ文書と例を理解しようとしています。 –
私はちょっと新しくて、チョコを理解するために本当に苦労しました。私にとって便利だったもう一つの例があります:https://github.com/hakank/hakank/tree/master/choco3 – dabadaba