use of org.ojalgo.optimisation.Expression in project ojAlgo by optimatika.
the class P20150720 method buildModel2.
public static ExpressionsBasedModel buildModel2() {
// 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).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.upper(entry.getValue().doubleValue());
constraint.setLinearFactorsSimple(linked);
// 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.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) -
* (SupplyTotal/DemandTotal) * DemandCustomerX )^2
*/
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)) {
linked.forEach(v1 -> {
linked.forEach(v2 -> {
objective.set(v1, v2, -1);
});
objective.set(v1, ((2 * stockTotal) / demandTotal) * entry.getValue().doubleValue());
});
}
});
return model;
}
use of org.ojalgo.optimisation.Expression in project ojAlgo by optimatika.
the class StrategyMixer method testStratCombQuadraticExpressionModel.
/**
* This is test case using a reimplementation of the algorithm in {@link PortfolioMixer}.
*/
@Test
public void testStratCombQuadraticExpressionModel() {
final BigDecimal[] tmpTarget = new BigDecimal[] { THIRD, THIRD, THIRD };
final BigDecimal[] tmpStrat1 = new BigDecimal[] { HALF, HALF, ZERO };
final BigDecimal[] tmpStrat2 = new BigDecimal[] { HALF, ZERO, HALF };
final BigDecimal[] tmpStrat3 = new BigDecimal[] { ZERO, HALF, HALF };
final BigDecimal[][] tmpStrats = new BigDecimal[][] { tmpStrat1, tmpStrat2, tmpStrat3 };
final Variable[] tmpVars = new Variable[] { new Variable("S1"), new Variable("S2"), new Variable("S3"), Variable.makeBinary("B1"), Variable.makeBinary("B2"), Variable.makeBinary("B3") };
for (int s = 0; s < 3; s++) {
BigDecimal tmpVal = ZERO;
for (int i = 0; i < 3; i++) {
tmpVal = tmpVal.add(tmpTarget[i].multiply(tmpStrats[s][i]));
}
tmpVal = tmpVal.multiply(TWO).negate();
tmpVars[s].weight(tmpVal);
tmpVars[s].lower(ZERO);
tmpVars[s].upper(ONE);
}
final ExpressionsBasedModel tmpModel = new ExpressionsBasedModel(tmpVars);
// tmpModel.options.debug(IntegerSolver.class);
// tmpModel.options.validate = false;
final Expression tmpQuadObj = tmpModel.addExpression("Quadratic Objective Part");
tmpQuadObj.weight(ONE);
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
BigDecimal tmpVal = ZERO;
for (int i = 0; i < 3; i++) {
tmpVal = tmpVal.add(tmpStrats[row][i].multiply(tmpStrats[col][i]));
}
tmpQuadObj.set(row, col, tmpVal);
tmpQuadObj.set(3 + row, 3 + col, tmpVal.multiply(THOUSANDTH));
}
final Expression tmpActive = tmpModel.addExpression(tmpVars[row].getName() + " Active");
tmpActive.set(3 + row, ONE);
tmpActive.set(row, NEG);
tmpActive.lower(ZERO);
if (OptimisationIntegerTests.DEBUG) {
BasicLogger.debug(tmpActive.toString());
}
}
final Expression tmpHundredPercent = tmpModel.addExpression("100%");
tmpHundredPercent.level(ONE);
tmpHundredPercent.set(0, ONE);
tmpHundredPercent.set(1, ONE);
tmpHundredPercent.set(2, ONE);
if (OptimisationIntegerTests.DEBUG) {
BasicLogger.debug(tmpHundredPercent.toString());
}
final Expression tmpStrategyCount = tmpModel.addExpression("Strategy Count");
tmpStrategyCount.upper(TWO);
tmpStrategyCount.set(3, ONE);
tmpStrategyCount.set(4, ONE);
tmpStrategyCount.set(5, ONE);
if (OptimisationIntegerTests.DEBUG) {
BasicLogger.debug(tmpStrategyCount.toString());
}
tmpModel.minimise();
if (OptimisationIntegerTests.DEBUG) {
BasicLogger.debug(tmpModel.toString());
BasicLogger.debug(Arrays.toString(tmpVars));
}
int tmpUseCount = 0;
double tmpTotalWeight = 0D;
final Variable[] tmpSolution = new Variable[] { tmpVars[0], tmpVars[1], tmpVars[2] };
for (final Variable tmpWeight : tmpSolution) {
if (tmpWeight.getValue().signum() != 0) {
tmpUseCount++;
tmpTotalWeight += tmpWeight.getValue().doubleValue();
}
}
TestUtils.assertEquals(TWO.intValue(), tmpUseCount);
TestUtils.assertEquals(PrimitiveMath.ONE, tmpTotalWeight, 1E-14 / PrimitiveMath.THREE);
}
use of org.ojalgo.optimisation.Expression in project ojAlgo by optimatika.
the class TestOjAlgo method testBug1.
public static void testBug1() {
final Variable[] objective = new Variable[] { new Variable("X").weight(ONE), new Variable("Y").weight(ZERO), new Variable("Z").weight(ZERO) };
objective[1].setInteger(true);
final ExpressionsBasedModel model = new ExpressionsBasedModel(objective);
// c1: X =0
final Expression c1 = model.addExpression("c1");
c1.level(ZERO);
c1.set(0, ONE);
// c2: -X +5Y =0
final Expression c2 = model.addExpression("c2");
c2.level(ZERO);
c2.set(0, new BigDecimal(-1));
c2.set(1, ONE);
// c3: X -Z =0
final Expression c3 = model.addExpression("c3");
c3.level(ZERO);
// bugs with this constraint
c3.set(0, ONE);
c3.set(2, new BigDecimal(-1));
// but not with this one ???
// c3.setLinearFactor(0, new BigDecimal(-1));
// c3.setLinearFactor(2, ONE);
final Optimisation.Result tmpResult = model.minimise();
BasicLogger.debug(tmpResult.toString());
}
use of org.ojalgo.optimisation.Expression in project ojAlgo by optimatika.
the class UCLAee236aCase method makeOriginalRootModel.
private static ExpressionsBasedModel makeOriginalRootModel() {
final Variable[] tmpVariables = new Variable[] { new Variable("X1").lower(ZERO).weight(TWO.negate()).integer(true), new Variable("X2").lower(ZERO).weight(THREE.negate()).integer(true) };
final ExpressionsBasedModel retVal = new ExpressionsBasedModel(tmpVariables);
retVal.setMinimisation();
final Expression tmpExprC1 = retVal.addExpression("C1");
for (int i = 0; i < retVal.countVariables(); i++) {
tmpExprC1.set(i, new BigDecimal[] { TWO.multiply(NINTH), QUARTER }[i]);
}
tmpExprC1.upper(ONE);
final Expression tmpExprC2 = retVal.addExpression("C2");
for (int i = 0; i < retVal.countVariables(); i++) {
tmpExprC2.set(i, new BigDecimal[] { SEVENTH, THIRD }[i]);
}
tmpExprC2.upper(ONE);
return retVal;
}
use of org.ojalgo.optimisation.Expression in project ojAlgo by optimatika.
the class LinearDesignTestCases method testUnboundedCase.
@Test
public void testUnboundedCase() {
final Variable[] tmpVariables = new Variable[] { new Variable("X1").weight(ONE), new Variable("X2").weight(TWO), new Variable("X3").weight(THREE) };
final ExpressionsBasedModel tmpModel = new ExpressionsBasedModel(tmpVariables);
final Expression tmpExprC1 = tmpModel.addExpression("C1");
for (int i = 0; i < tmpModel.countVariables(); i++) {
tmpExprC1.set(i, ONE);
}
tmpExprC1.level(ONE);
final Optimisation.Result tmpMinResult = tmpModel.maximise();
TestUtils.assertTrue(tmpMinResult.getState().isFeasible());
TestUtils.assertFalse(tmpMinResult.getState().isOptimal());
TestUtils.assertTrue(tmpMinResult.getState().isFailure());
TestUtils.assertTrue(tmpModel.validate(tmpMinResult));
TestUtils.assertEquals(Optimisation.State.UNBOUNDED, tmpMinResult.getState());
final Optimisation.Result tmpMaxResult = tmpModel.maximise();
TestUtils.assertTrue(tmpMaxResult.getState().isFeasible());
TestUtils.assertFalse(tmpMaxResult.getState().isOptimal());
TestUtils.assertTrue(tmpMaxResult.getState().isFailure());
TestUtils.assertTrue(tmpModel.validate(tmpMaxResult));
TestUtils.assertEquals(Optimisation.State.UNBOUNDED, tmpMaxResult.getState());
}
Aggregations