use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class IntegerProblems method testP20130225.
/**
* The IP solver returns infeasible solutions, but the problem seems to actually be with the LP solver.
* Don't know what the actual solution is. Just check that the solver terminates normally and that the
* solution is in fact feasible/valid.
*/
@Test
@Tag("slow")
public void testP20130225() {
final ExpressionsBasedModel tmpIntegerModel = P20130225.makeModel();
final ExpressionsBasedModel tmpRelaxedModel = tmpIntegerModel.relax(false);
final Optimisation.Result tmpRelaxedResult = tmpRelaxedModel.minimise();
TestUtils.assertEquals("Solution To Relaxed Problem Not Optimal!", Optimisation.State.OPTIMAL, tmpRelaxedResult.getState());
TestUtils.assertTrue("Solution To Relaxed Problem Not Valid!", tmpRelaxedModel.validate(tmpRelaxedResult));
final Optimisation.Result tmpIntegerResult = tmpIntegerModel.minimise();
TestUtils.assertEquals("Integer Solution Not Optimal!", Optimisation.State.OPTIMAL, tmpIntegerResult.getState());
TestUtils.assertTrue("Integer Solution Not Valid!", tmpIntegerModel.validate(tmpIntegerResult));
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class IntegerProblems method testP20130409b.
/**
* Test case sent in by the user / problem reporter
* <a href="http://bugzilla.optimatika.se/show_bug.cgi?id=178">BugZilla</a>
*/
@Test
public void testP20130409b() {
final Variable x1 = Variable.make("x1");
final Variable x2013 = Variable.make("x2013");
final Variable x2014 = Variable.make("x2014");
final Variable x2015 = Variable.make("x2015");
x2013.setInteger(true);
x2014.setInteger(true);
x2015.setInteger(true);
final ExpressionsBasedModel tmpModel = new ExpressionsBasedModel();
tmpModel.addVariable(x1);
tmpModel.addVariable(x2013);
tmpModel.addVariable(x2014);
tmpModel.addVariable(x2015);
final Expression obj = tmpModel.addExpression("obj");
obj.set(x1, 1);
obj.weight(BigDecimal.valueOf(1));
final Expression c1 = tmpModel.addExpression("c1");
c1.set(x1, 1);
c1.lower(BigDecimal.valueOf(0));
final Expression c2 = tmpModel.addExpression("c2");
c2.set(x2014, -5000);
c2.set(x2013, 5100);
c2.set(x1, -1);
c2.upper(BigDecimal.valueOf(0));
final Expression c3 = tmpModel.addExpression("c3");
c3.set(x2014, -5000);
c3.set(x2013, 5100);
c3.set(x1, 1);
c3.lower(BigDecimal.valueOf(0));
final Expression c4 = tmpModel.addExpression("c4");
c4.set(x2014, 150);
c4.set(x2013, 5100);
c4.set(x2015, -5000);
c4.set(x1, -1);
c4.upper(BigDecimal.valueOf(0));
final Expression c5 = tmpModel.addExpression("c5");
c5.set(x2014, 150);
c5.set(x2013, 5100);
c5.set(x2015, -5000);
c5.set(x1, 1);
c5.lower(BigDecimal.valueOf(0));
final Expression c6 = tmpModel.addExpression("c6");
c6.set(x2015, 5000);
c6.set(x2014, 5000);
c6.set(x2013, 5000);
c6.level(BigDecimal.valueOf(19105000));
final BigArray tmpExpSol = BigArray.wrap(new BigDecimal[] { BigDecimal.valueOf(4849.999999997941), BigDecimal.valueOf(1245), BigDecimal.valueOf(1269), BigDecimal.valueOf(1307) });
TestUtils.assertTrue("Expected Solution Not Valid", tmpModel.validate(tmpExpSol));
// tmpModel.options.debug(IntegerSolver.class);
// tmpModel.options.problem = NumberContext.getGeneral(8);
final Result tmpResult = tmpModel.minimise();
// BasicLogger.debug(tmpResult.toString());
TestUtils.assertEquals("Solution Not Correct", tmpExpSol, tmpResult, new NumberContext(8, 8));
TestUtils.assertTrue("Solver State Not Optimal", tmpResult.getState().isOptimal());
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class IntegerProblems method testP20140819.
/**
* <a href="http://bugzilla.optimatika.se/show_bug.cgi?id=211">BugZilla-211</a>
*/
@Test
public void testP20140819() {
final ExpressionsBasedModel tmpModel = new ExpressionsBasedModel();
final double[] tmpWeights = new double[] { 2691.5357279536333, 2600.760150603986, 2605.8958795795374, 2606.7208332501104, 2715.0757845953835, 2602.194912040238, 2606.0069468717575, 2609.0385816244316, 2750.0520522057927, 2602.048261785581, 2600.507229973181, 2602.046307869504, 2721.343937605796, 2601.7367414553805, 2600.595318433882, 2599.405979211142 };
for (int v = 0; v < tmpWeights.length; v++) {
tmpModel.addVariable(Variable.make("x" + v).integer(true).lower(0).upper(414).weight(tmpWeights[v]));
}
// 117 <= 30 30 30 30 0 4 0 0 0 4 0 0 0 4 0 0 <= 14868
// 36 <= 0 4 0 0 40 40 40 40 0 0 4 0 0 0 4 0 <= 170569
// 341 <= 0 0 8 0 0 0 8 0 68 68 68 68 0 0 0 5 <= 140833
// 413 <= 0 0 0 8 0 0 0 9 0 0 0 6 59 59 59 59 <= 48321
final int[] tmpLower = new int[] { 117, 36, 341, 413 };
final int[] tmpUpper = new int[] { 14868, 170569, 140833, 48321 };
final int[][] tmpFactors = new int[4][];
tmpFactors[0] = new int[] { 30, 30, 30, 30, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0 };
tmpFactors[1] = new int[] { 0, 4, 0, 0, 40, 40, 40, 40, 0, 0, 4, 0, 0, 0, 4, 0 };
tmpFactors[2] = new int[] { 0, 0, 8, 0, 0, 0, 8, 0, 68, 68, 68, 68, 0, 0, 0, 5 };
tmpFactors[3] = new int[] { 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 6, 59, 59, 59, 59 };
for (int c = 0; c < tmpFactors.length; c++) {
final Expression tmpExpr = tmpModel.addExpression("C" + c);
tmpExpr.lower(tmpLower[c]).upper(tmpUpper[c]);
for (int v = 0; v < tmpFactors[c].length; v++) {
tmpExpr.set(v, tmpFactors[c][v]);
}
}
// tmpModel.options.debug(IntegerSolver.class);
final Result tmpResult = tmpModel.minimise();
if (OptimisationIntegerTests.DEBUG) {
BasicLogger.debug(tmpResult);
BasicLogger.debug(tmpModel);
}
TestUtils.assertStateNotLessThanOptimal(tmpResult);
TestUtils.assertTrue(tmpModel.validate(tmpResult));
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class IntegerProblems method testP20150127full.
@Test
public void testP20150127full() {
final ExpressionsBasedModel tmpModel = P20150127a.getModel();
final Optimisation.Result tmpResult = tmpModel.minimise();
// Model should be solvable (e.g. x=201, y=-10)?!
TestUtils.assertStateNotLessThanFeasible(tmpResult);
final BigDecimal tmpSolX = tmpResult.get(0);
final BigDecimal tmpSolY = tmpResult.get(1);
final int tmpIntX = tmpSolX.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
final int tmpIntY = tmpSolY.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
if (OptimisationIntegerTests.DEBUG) {
BasicLogger.debug("x = " + tmpSolX + " ~ " + tmpIntX);
BasicLogger.debug("y = " + tmpSolY + " ~ " + tmpIntY);
}
TestUtils.assertTrue("Solution not valid!", tmpModel.validate(tmpResult));
// Verify solution
for (final int[] tmpCoeff : P20150127a.getCoefficients()) {
final int tmpValue = (tmpCoeff[0] * tmpIntX) + (tmpCoeff[1] * tmpIntY);
final BigDecimal tmpExact = tmpSolX.multiply(BigDecimal.valueOf(tmpCoeff[0])).add(tmpSolY.multiply(BigDecimal.valueOf(tmpCoeff[1])));
if (tmpValue >= 0) {
TestUtils.fail(tmpCoeff[0] + "*x + " + tmpCoeff[1] + "*y = " + tmpValue + " must be negative (exact: " + tmpExact + ")");
}
}
}
use of org.ojalgo.optimisation.ExpressionsBasedModel in project ojAlgo by optimatika.
the class KnapsackTest method testVaryingMaxWeight0.
@Test
public void testVaryingMaxWeight0() {
ExpressionsBasedModel model = new KnapsackProblemBuilder(3d).addItem(20, 2).addItem(30, 4).build();
// model.options.debug(IntegerSolver.class);
model.maximise();
// Expected: just first item
this.assertOne(model.getVariables().get(0));
this.assertZero(model.getVariables().get(1));
}
Aggregations