Search in sources :

Example 31 with Expression

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;
}
Also used : LinkedHashMap(java.util.LinkedHashMap) List(java.util.List) Result(org.ojalgo.optimisation.Optimisation.Result) Expression(org.ojalgo.optimisation.Expression) Map(java.util.Map) BasicLogger(org.ojalgo.netio.BasicLogger) BigDenseStore(org.ojalgo.matrix.store.BigDenseStore) Variable(org.ojalgo.optimisation.Variable) HashMap(java.util.HashMap) ExpressionsBasedModel(org.ojalgo.optimisation.ExpressionsBasedModel) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) Variable(org.ojalgo.optimisation.Variable) LinkedHashMap(java.util.LinkedHashMap) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ExpressionsBasedModel(org.ojalgo.optimisation.ExpressionsBasedModel) LinkedHashMap(java.util.LinkedHashMap) Expression(org.ojalgo.optimisation.Expression)

Example 32 with Expression

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);
}
Also used : Variable(org.ojalgo.optimisation.Variable) Expression(org.ojalgo.optimisation.Expression) ExpressionsBasedModel(org.ojalgo.optimisation.ExpressionsBasedModel) BigDecimal(java.math.BigDecimal) Test(org.junit.jupiter.api.Test)

Example 33 with Expression

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());
}
Also used : Variable(org.ojalgo.optimisation.Variable) Expression(org.ojalgo.optimisation.Expression) Optimisation(org.ojalgo.optimisation.Optimisation) ExpressionsBasedModel(org.ojalgo.optimisation.ExpressionsBasedModel) BigDecimal(java.math.BigDecimal)

Example 34 with Expression

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;
}
Also used : Variable(org.ojalgo.optimisation.Variable) Expression(org.ojalgo.optimisation.Expression) ExpressionsBasedModel(org.ojalgo.optimisation.ExpressionsBasedModel) BigDecimal(java.math.BigDecimal)

Example 35 with Expression

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());
}
Also used : Variable(org.ojalgo.optimisation.Variable) Expression(org.ojalgo.optimisation.Expression) Result(org.ojalgo.optimisation.Optimisation.Result) Optimisation(org.ojalgo.optimisation.Optimisation) ExpressionsBasedModel(org.ojalgo.optimisation.ExpressionsBasedModel) Test(org.junit.jupiter.api.Test)

Aggregations

Expression (org.ojalgo.optimisation.Expression)49 ExpressionsBasedModel (org.ojalgo.optimisation.ExpressionsBasedModel)45 Variable (org.ojalgo.optimisation.Variable)44 Result (org.ojalgo.optimisation.Optimisation.Result)27 Test (org.junit.jupiter.api.Test)23 BigDecimal (java.math.BigDecimal)18 Optimisation (org.ojalgo.optimisation.Optimisation)18 ArrayList (java.util.ArrayList)9 BasicMatrix (org.ojalgo.matrix.BasicMatrix)9 NumberContext (org.ojalgo.type.context.NumberContext)9 List (java.util.List)5 Map (java.util.Map)5 Collectors (java.util.stream.Collectors)5 HashMap (java.util.HashMap)4 LinkedHashMap (java.util.LinkedHashMap)4 BasicLogger (org.ojalgo.netio.BasicLogger)4 IntIndex (org.ojalgo.access.Structure1D.IntIndex)3 BigArray (org.ojalgo.array.BigArray)3 BigDenseStore (org.ojalgo.matrix.store.BigDenseStore)3 File (java.io.File)1