use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class ConvexProblems method testP20111129.
/**
* ojAlgo could not solve this, but LOQO (and others) could. I re-implemented the problem code just to
* verify there was no problem there. http://bugzilla.optimatika.se/show_bug.cgi?id=11
*/
@Test
public void testP20111129() {
final Variable x1 = new Variable("X1");
final Variable x2 = new Variable("X2").lower(BigMath.HUNDRED.negate()).upper(BigMath.HUNDRED);
final Variable x3 = new Variable("X3").lower(BigMath.ZERO);
final Variable x4 = new Variable("X4").lower(BigMath.ZERO);
final Variable[] tmpVariables = new Variable[] { x1, x2, x3, x4 };
final ExpressionsBasedModel tmpModel = new ExpressionsBasedModel(tmpVariables);
final Expression tmpObjExpr = tmpModel.addExpression("Objective");
tmpModel.setMinimisation();
tmpObjExpr.set(2, 2, BigMath.HALF);
tmpObjExpr.set(3, 3, BigMath.TWO);
tmpObjExpr.set(2, 3, BigMath.TWO.negate());
tmpObjExpr.set(0, BigMath.THREE);
tmpObjExpr.set(1, BigMath.TWO.negate());
tmpObjExpr.set(2, BigMath.ONE);
tmpObjExpr.set(3, BigMath.FOUR.negate());
tmpObjExpr.weight(BigMath.ONE);
Expression tmpConstrExpr;
tmpConstrExpr = tmpModel.addExpression("C1").lower(BigMath.FOUR);
tmpConstrExpr.set(0, BigMath.ONE);
tmpConstrExpr.set(1, BigMath.ONE);
tmpConstrExpr.set(2, BigMath.FOUR.negate());
tmpConstrExpr.set(3, BigMath.TWO);
tmpConstrExpr = tmpModel.addExpression("C2").upper(BigMath.SIX);
tmpConstrExpr.set(0, BigMath.THREE.negate());
tmpConstrExpr.set(1, BigMath.ONE);
tmpConstrExpr.set(2, BigMath.TWO.negate());
tmpConstrExpr = tmpModel.addExpression("C3").level(BigMath.NEG);
tmpConstrExpr.set(1, BigMath.ONE);
tmpConstrExpr.set(3, BigMath.NEG);
tmpConstrExpr = tmpModel.addExpression("C4").level(BigMath.ZERO);
tmpConstrExpr.set(0, BigMath.ONE);
tmpConstrExpr.set(1, BigMath.ONE);
tmpConstrExpr.set(2, BigMath.NEG);
// tmpModel.options.debug(ConvexSolver.class);
final Result tmpResult = tmpModel.minimise();
final double tmpObjFuncVal = tmpResult.getValue();
TestUtils.assertEquals(-5.281249989, tmpObjFuncVal, new NumberContext(7, 6));
final double[] tmpExpected = new double[] { -1.1875, 1.5625, 0.375, 2.5625 };
for (int i = 0; i < tmpExpected.length; i++) {
TestUtils.assertEquals(tmpExpected[i], tmpVariables[i].getValue().doubleValue(), new NumberContext(5, 4));
}
OptimisationConvexTests.assertDirectAndIterativeEquals(tmpModel, null);
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class FinancePortfolioProblem method testP20170508.
/**
* There were several problems (symptoms) related to this case. This test primarily tests that the
* returned solution is actually valid. There was a problem (among others) that a subproblem from the
* Markowitz model class (set up this way) did not produce a valid/feasible solution.
*/
@Test
public void testP20170508() {
final BigDecimal raf = BigDecimal.valueOf(177.82794100389228);
final ExpressionsBasedModel model = FinancePortfolioProblem.buildModel(P20170508.COVARIANCES, P20170508.RETURNS, raf);
// model.options.debug(Optimisation.Solver.class);
// model.options.validate = false;
final BigDecimal w0 = BigDecimal.valueOf(0.9639383);
final BigDecimal w1 = BigDecimal.valueOf(0.036061702);
model.getVariable(0).setValue(w0);
model.getVariable(1).setValue(w1);
final Result result = model.minimise();
if (DEBUG) {
BasicLogger.debug(result);
}
TestUtils.assertStateNotLessThanOptimal(result);
TestUtils.assertTrue(model.validate());
TestUtils.assertTrue(model.validate(result));
OptimisationConvexTests.assertDirectAndIterativeEquals(model);
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class P20150720 method buildModel3.
/**
* Sent in 2015-09-03
*/
public static ExpressionsBasedModel buildModel3() {
/*
* 5 Products with associated Qty.
*/
final Map<String, Integer> constraintsProduct = new HashMap<>();
constraintsProduct.put("PRODUCT_1", 296_000);
constraintsProduct.put("PRODUCT_2", 888_000);
constraintsProduct.put("PRODUCT_3", 636_000);
constraintsProduct.put("PRODUCT_4", 220_000);
constraintsProduct.put("PRODUCT_5", 0);
final double stockTotal = constraintsProduct.values().stream().mapToDouble(e -> e.doubleValue()).sum();
// BasicLogger.debug("STOCK_TOTAL " + stockTotal);
/*
* Demand of each Customers
*/
final Map<String, Integer> constraintsCustomer = new LinkedHashMap<>();
constraintsCustomer.put("CUSTOMER_A_1", 72_000);
constraintsCustomer.put("CUSTOMER_A_2", 44_000);
constraintsCustomer.put("CUSTOMER_A_3", 12_000);
constraintsCustomer.put("CUSTOMER_A_4", 36_000);
constraintsCustomer.put("CUSTOMER_A_5", 0);
constraintsCustomer.put("CUSTOMER_A_6", 36_000);
constraintsCustomer.put("CUSTOMER_A_7", 12_000);
constraintsCustomer.put("CUSTOMER_A_8", 0);
constraintsCustomer.put("CUSTOMER_A_9", 0);
constraintsCustomer.put("CUSTOMER_A_10", 12_000);
constraintsCustomer.put("CUSTOMER_A_11", 12_000);
constraintsCustomer.put("CUSTOMER_A_12", 0);
constraintsCustomer.put("CUSTOMER_A_13", 0);
constraintsCustomer.put("CUSTOMER_A_14", 0);
constraintsCustomer.put("CUSTOMER_B_1", 24_000);
constraintsCustomer.put("CUSTOMER_B_2", 12_000);
constraintsCustomer.put("CUSTOMER_B_3", 300);
constraintsCustomer.put("CUSTOMER_C_1", 24_000);
constraintsCustomer.put("CUSTOMER_D_1", 20_000);
constraintsCustomer.put("CUSTOMER_E_1", 12_000);
constraintsCustomer.put("CUSTOMER_F_1", 12_000);
constraintsCustomer.put("CUSTOMER_G_1", 72_000);
constraintsCustomer.put("CUSTOMER_H_1", 28_000);
constraintsCustomer.put("CUSTOMER_I_1", 24_000);
constraintsCustomer.put("CUSTOMER_J_1", 16_000);
constraintsCustomer.put("CUSTOMER_K_1", 24_000);
constraintsCustomer.put("CUSTOMER_L_1", 56_000);
final double demandTotal = constraintsCustomer.values().stream().mapToDouble(e -> e.doubleValue()).sum();
// BasicLogger.debug("DEMAND_TOTAL " + demandTotal);
/*
* User constraint. In this case, user want to allocate 236_000 Qty on Customer_A_*
*/
final double userConstraintQty = 236_000;
final List<String> userConstraint = new ArrayList<>();
userConstraint.add("CUSTOMER_A_1|PRODUCT_2");
userConstraint.add("CUSTOMER_A_2|PRODUCT_2");
userConstraint.add("CUSTOMER_A_3|PRODUCT_2");
userConstraint.add("CUSTOMER_A_4|PRODUCT_2");
userConstraint.add("CUSTOMER_A_5|PRODUCT_2");
userConstraint.add("CUSTOMER_A_6|PRODUCT_2");
userConstraint.add("CUSTOMER_A_7|PRODUCT_2");
userConstraint.add("CUSTOMER_A_8|PRODUCT_2");
userConstraint.add("CUSTOMER_A_9|PRODUCT_2");
userConstraint.add("CUSTOMER_A_10|PRODUCT_2");
userConstraint.add("CUSTOMER_A_11|PRODUCT_2");
userConstraint.add("CUSTOMER_A_12|PRODUCT_2");
userConstraint.add("CUSTOMER_A_13|PRODUCT_2");
userConstraint.add("CUSTOMER_A_14|PRODUCT_2");
// List of Variable Names
final List<String> variablesName = new ArrayList<>();
variablesName.add("CUSTOMER_A_1|PRODUCT_2");
variablesName.add("CUSTOMER_A_2|PRODUCT_2");
variablesName.add("CUSTOMER_A_3|PRODUCT_2");
variablesName.add("CUSTOMER_A_4|PRODUCT_2");
variablesName.add("CUSTOMER_A_5|PRODUCT_2");
variablesName.add("CUSTOMER_A_6|PRODUCT_2");
variablesName.add("CUSTOMER_A_7|PRODUCT_2");
variablesName.add("CUSTOMER_A_8|PRODUCT_2");
variablesName.add("CUSTOMER_A_9|PRODUCT_2");
variablesName.add("CUSTOMER_A_10|PRODUCT_2");
variablesName.add("CUSTOMER_A_11|PRODUCT_2");
variablesName.add("CUSTOMER_A_12|PRODUCT_2");
variablesName.add("CUSTOMER_A_13|PRODUCT_2");
variablesName.add("CUSTOMER_A_14|PRODUCT_2");
variablesName.add("CUSTOMER_B_1|PRODUCT_2");
variablesName.add("CUSTOMER_B_1|PRODUCT_3");
variablesName.add("CUSTOMER_B_2|PRODUCT_2");
variablesName.add("CUSTOMER_B_2|PRODUCT_3");
variablesName.add("CUSTOMER_B_3|PRODUCT_2");
variablesName.add("CUSTOMER_B_3|PRODUCT_3");
variablesName.add("CUSTOMER_C_1|PRODUCT_2");
variablesName.add("CUSTOMER_C_1|PRODUCT_3");
variablesName.add("CUSTOMER_D_1|PRODUCT_4");
variablesName.add("CUSTOMER_D_1|PRODUCT_5");
variablesName.add("CUSTOMER_D_1|PRODUCT_2");
variablesName.add("CUSTOMER_D_1|PRODUCT_3");
variablesName.add("CUSTOMER_E_1|PRODUCT_1");
variablesName.add("CUSTOMER_F_1|PRODUCT_4");
variablesName.add("CUSTOMER_F_1|PRODUCT_5");
variablesName.add("CUSTOMER_F_1|PRODUCT_2");
variablesName.add("CUSTOMER_F_1|PRODUCT_3");
variablesName.add("CUSTOMER_G_1|PRODUCT_4");
variablesName.add("CUSTOMER_G_1|PRODUCT_5");
variablesName.add("CUSTOMER_G_1|PRODUCT_2");
variablesName.add("CUSTOMER_G_1|PRODUCT_3");
variablesName.add("CUSTOMER_H_1|PRODUCT_4");
variablesName.add("CUSTOMER_H_1|PRODUCT_5");
variablesName.add("CUSTOMER_H_1|PRODUCT_2");
variablesName.add("CUSTOMER_H_1|PRODUCT_3");
variablesName.add("CUSTOMER_I_1|PRODUCT_4");
variablesName.add("CUSTOMER_I_1|PRODUCT_5");
variablesName.add("CUSTOMER_I_1|PRODUCT_2");
variablesName.add("CUSTOMER_I_1|PRODUCT_3");
variablesName.add("CUSTOMER_J_1|PRODUCT_4");
variablesName.add("CUSTOMER_J_1|PRODUCT_5");
variablesName.add("CUSTOMER_J_1|PRODUCT_2");
variablesName.add("CUSTOMER_J_1|PRODUCT_3");
variablesName.add("CUSTOMER_K_1|PRODUCT_4");
variablesName.add("CUSTOMER_K_1|PRODUCT_5");
variablesName.add("CUSTOMER_K_1|PRODUCT_2");
variablesName.add("CUSTOMER_K_1|PRODUCT_3");
variablesName.add("CUSTOMER_L_1|PRODUCT_1");
/*
*
*/
final ExpressionsBasedModel model = new ExpressionsBasedModel();
final List<Variable> variables = new ArrayList<>();
/*
* Create All Variables:
*/
// BasicLogger.debug("---- Variable creation ------");
variablesName.forEach(name -> {
final Variable var = Variable.make(name).lower(0.0).weight(1.0);
model.addVariable(var);
variables.add(var);
// BasicLogger.debug(var);
});
// BasicLogger.debug("---- Constraints customers ------");
// Apply Customers constraints.
// CUSTOMER_A of Demand constraint because managed by user constraints.
constraintsCustomer.entrySet().stream().filter(e -> !e.getKey().startsWith("CUSTOMER_A")).forEach(entry -> {
final List<Variable> linked = variables.stream().filter(v -> v.getName().startsWith(entry.getKey())).collect(Collectors.toList());
final Expression constraint = model.addExpression("CONSTRAINTS_" + entry.getKey());
constraint.upper(entry.getValue().doubleValue());
constraint.setLinearFactorsSimple(linked);
// BasicLogger.debug(constraint);
});
// BasicLogger.debug("---- User Constraints Customers ------");
// Apply Product Type constraints.
final List<Variable> userLinked = variables.stream().filter(v -> userConstraint.contains(v.getName())).collect(Collectors.toList());
final Expression constraintUser = model.addExpression("CONSTRAINTS_USER_CUSTOMER_A");
constraintUser.level(userConstraintQty);
constraintUser.setLinearFactorsSimple(userLinked);
// BasicLogger.debug(constraintUser);
// BasicLogger.debug("---- Constraints Product ------");
// Apply Product Type constraints.
constraintsProduct.entrySet().forEach(entry -> {
final List<Variable> linked = variables.stream().filter(v -> v.getName().endsWith(entry.getKey())).collect(Collectors.toList());
final Expression constraint = model.addExpression("CONSTRAINTS_" + entry.getKey());
constraint.upper(entry.getValue().doubleValue());
constraint.setLinearFactorsSimple(linked);
// BasicLogger.debug(constraint);
});
/*
* Objective expression. - Maximize the Sum of all variables - Minimize the Sum of square error vs
* proportionality.
*/
// BasicLogger.debug("---- Objective ------");
final Expression objective = model.addExpression("OBJECTIVE").weight(-1.0);
// - Maximize the Sum of all variables
// objective.setLinearFactorsSimple(variables);
// BasicLogger.debug("---- Error formula ------");
/*
* Example: x1, x2, x3 linked variables for Customer X Error = ( (x1+x2+x3) / Target - 1 )^2 * ratio
*/
constraintsCustomer.entrySet().forEach(entry -> {
final List<Variable> linked = variables.stream().filter(v -> v.getName().startsWith(entry.getKey())).collect(Collectors.toList());
if (!linked.isEmpty() && (entry.getValue().doubleValue() > 0)) {
final double demand = entry.getValue();
final double ratio = demand / demandTotal;
final double target = stockTotal * ratio;
linked.forEach(v1 -> {
linked.forEach(v2 -> {
objective.set(v1, v2, ratio / (target * target));
});
objective.set(v1, (-2.0 * ratio) / target);
});
}
});
return model;
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class P20150720 method main.
/**
* @param args the command line arguments Objective: allocate the maximum qty, and try to keep
* proportionality between customer.
*/
public static void main(final String[] args) {
final ExpressionsBasedModel model = P20150720.buildModel3();
// - Maximise -(Sum of Square error)
model.relax(true);
// model.options.debug(ConvexSolver.class);
final Result result = model.maximise();
BasicLogger.debug(result);
// BasicLogger.debug(model);
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class P20150720 method buildModel1.
public static ExpressionsBasedModel buildModel1() {
// List of Variable Names
final List<String> variablesName = new ArrayList<>();
variablesName.add("CUSTOMER_1|PRODUCT_TYPE_1");
variablesName.add("CUSTOMER_2|PRODUCT_TYPE_1");
variablesName.add("CUSTOMER_3|PRODUCT_TYPE_1");
variablesName.add("CUSTOMER_3|PRODUCT_TYPE_2");
variablesName.add("CUSTOMER_3|PRODUCT_TYPE_3");
variablesName.add("CUSTOMER_3|PRODUCT_TYPE_4");
variablesName.add("CUSTOMER_3|PRODUCT_TYPE_5");
variablesName.add("CUSTOMER_4|PRODUCT_TYPE_1");
variablesName.add("CUSTOMER_4|PRODUCT_TYPE_2");
variablesName.add("CUSTOMER_5|PRODUCT_TYPE_2");
variablesName.add("CUSTOMER_5|PRODUCT_TYPE_3");
variablesName.add("CUSTOMER_5|PRODUCT_TYPE_4");
variablesName.add("CUSTOMER_6|PRODUCT_TYPE_2");
variablesName.add("CUSTOMER_6|PRODUCT_TYPE_3");
variablesName.add("CUSTOMER_6|PRODUCT_TYPE_4");
variablesName.add("CUSTOMER_6|PRODUCT_TYPE_5");
/*
* Constraints for each Customer = Demand of each Customer Sum of all variable linked to the customer
* <= Demand.
*/
final Map<String, Integer> constraintsCustomer = new LinkedHashMap<>();
constraintsCustomer.put("CUSTOMER_1", 40_000);
constraintsCustomer.put("CUSTOMER_2", 25_000);
constraintsCustomer.put("CUSTOMER_3", 15_000);
constraintsCustomer.put("CUSTOMER_4", 5_000);
constraintsCustomer.put("CUSTOMER_5", 2_000);
final double demandTotal = constraintsCustomer.values().stream().mapToDouble(e -> e.doubleValue()).sum();
/*
* Constraits for each product type = Stock per product type. Sum of all variable linked to this
* product type <=
*/
final Map<String, Integer> constraintsProduct = new HashMap<>();
constraintsProduct.put("PRODUCT_TYPE_1", 50_000);
constraintsProduct.put("PRODUCT_TYPE_2", 0);
constraintsProduct.put("PRODUCT_TYPE_3", 0);
constraintsProduct.put("PRODUCT_TYPE_4", 0);
constraintsProduct.put("PRODUCT_TYPE_5", 0);
final double stockTotal = constraintsProduct.values().stream().mapToDouble(e -> e.doubleValue()).sum();
/*
*
*/
final ExpressionsBasedModel model = new ExpressionsBasedModel();
final List<Variable> variables = new ArrayList<>();
// Create All Variables:
// BasicLogger.debug("---- Variable creation ------");
variablesName.forEach(name -> {
final Variable var = Variable.make(name).integer(true).lower(0.0);
model.addVariable(var);
variables.add(var);
// BasicLogger.debug(var);
});
// BasicLogger.debug("---- Constraints customers ------");
// Apply Customers constraints.
constraintsCustomer.entrySet().forEach(entry -> {
final List<Variable> linked = variables.stream().filter(v -> v.getName().startsWith(entry.getKey())).collect(Collectors.toList());
final Expression constraint = model.addExpression("CONSTRAINTS_" + entry.getKey());
constraint.lower(0.0).upper(entry.getValue().doubleValue());
constraint.setLinearFactorsSimple(linked);
linked.forEach(v -> v.upper(entry.getValue().doubleValue()));
// BasicLogger.debug(constraint);
});
// BasicLogger.debug("---- Constraints Product ------");
// Apply Product Type constraints.
constraintsProduct.entrySet().forEach(entry -> {
final List<Variable> linked = variables.stream().filter(v -> v.getName().endsWith(entry.getKey())).collect(Collectors.toList());
final Expression constraint = model.addExpression("CONSTRAINTS_" + entry.getKey());
constraint.lower(0.0).upper(entry.getValue().doubleValue());
constraint.setLinearFactorsSimple(linked);
// BasicLogger.debug(constraint);
});
/*
* Objective expression. - Maximize the Sum of all variables - Minimize the Sum of square error vs
* proportionality.
*/
// BasicLogger.debug("---- Objective ------");
final Expression objective = model.addExpression("OBJECTIVE").weight(1.0);
// - Maximize the Sum of all variables
objective.setLinearFactorsSimple(variables);
final List<Variable> errors = new ArrayList<>();
// BasicLogger.debug("---- Error formula ------");
constraintsCustomer.entrySet().forEach(entry -> {
final List<Variable> linked = variables.stream().filter(v -> v.getName().startsWith(entry.getKey())).collect(Collectors.toList());
if (!linked.isEmpty() && (entry.getValue().doubleValue() > 0)) {
final Variable error = Variable.make("ERROR:" + entry.getKey());
model.addVariable(error);
errors.add(error);
final Expression errorExp = model.addExpression("ERROR_EXP:" + entry.getKey()).level(stockTotal / demandTotal);
linked.forEach(v -> errorExp.set(v, 1.0 / entry.getValue().doubleValue()));
errorExp.set(error, -1.0);
// - Squared of error.
objective.set(error, error, -1.0);
}
});
return model;
}
Aggregations