Использование Ojalgo 55.2.0 Я сталкиваюсь с некоторыми проблемами при определении ограничений только с квадратичной частью, подобной коду ниже < /p>
public class PureQuadTest {
public static void main(String[] args) {
System.out.println("Hello World!");
final ExpressionsBasedModel model = new ExpressionsBasedModel();
final var vars = List.of(
Map.entry("A", 0.05),
Map.entry("B", 0.05),
Map.entry("C", 0.25),
Map.entry("D", 0.1),
Map.entry("E", 0.05));
final Map variables = new HashMap();
for (final var v : vars) {
final var idAndWeight = model.addVariable(v.getKey());
variables.put(v.getKey(), idAndWeight);
idAndWeight.lower(v.getValue());
}
// Sum to 1 constraint
final Expression sumExpr = model.addExpression("sum").level(1.0);
for (Variable v : variables.values()) {
sumExpr.set(v, 1.0);
}
// Objective function: maximize the sum of all variables
final Expression objExpr = model.addExpression("obj").weight(1.0);
for (Variable v : variables.values()) {
objExpr.set(v, 1.0);
}
double[][] matrix = {
{ 0.00250000, 0.00022000, 0.00010000, 0.00044000, 0.00200000 },
{ 0.00022000, 0.00048400, 0.00004400, 0.00096800, 0.00088000 },
{ 0.00010000, 0.00004400, 0.00010000, 0.00008800, 0.00200000 },
{ 0.00044000, 0.00096800, 0.00008800, 0.00193600, 0.00176000 },
{ 0.00200000, 0.00088000, 0.00200000, 0.00176000, 0.04000000 }
};
// create a quadratic only constraint
var constraintQ = model.addExpression("quadonly").weight(1.0);
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
var v1 = variables.get(vars.get(i).getKey());
var v2 = variables.get(vars.get(j).getKey());
var coeff = matrix[j];
constraintQ.set(v1, v2, coeff);
}
}
constraintQ.upper(0.0004);
var res = model.maximise();
System.out.println(res.getState());
}
}
< /code>
Вывод этого «осуществляется» даже жестко, что он должен быть невозможным.
Я проследил причину к квадратичному ограничению, отмеченному «избыточным». Я проверил код и во время выполнения ExpressionBasedModel: сканирование метод tmpexpr.getlinearkeyset () Возвращает пустой набор, поскольку мое ограничение не имеет линейных терминов.
Это приводит к тому, что Che presolver presolvers.zero_one_two.simplify the Marks as Credundant. ExpressionBasedModel, более поздняя вызываемая методическая контроль метода (в классах Preslever) также считает ограничение как другое и отмечает его как избыточное, рассматривая только линейные термины. < /P>
Я что -то упускаю? Это ожидаемое поведение?>
Подробнее здесь: https://stackoverflow.com/questions/797 ... ratic-part