MIP Strategy Configuration
With v51.1.0 the IntegerSolver got redesigned in terms of how it multi-threads as well as how it can be configured.
With most, if not all, tests the new design performs much better – it finishes faster and use less resources while it’s running! That’s with the default settings. Perhaps the most important news is the extensive configuration possibilities introduced. Being able to control how a MIP solver works is often crucial to finding a solution. To fully exploit these configurations you need to know how a MIP solver works, and learn details on how ojAlgo is implemented, but some basic stuff is relatively easy to start experimenting with.
The example below demonstrates some of the more accessible configurations, and points you in the right direction to learn more on the details of how ojAlgo works in this respect.
Most likely the API of the configuration interfaces and classes will see changes in coming versions. This is just a beginning.
Example Code
MIPStrategyConfiguration.java
import java.io.File;
import java.util.Comparator;
import org.ojalgo.OjAlgoUtils;
import org.ojalgo.concurrent.Parallelism;
import org.ojalgo.netio.BasicLogger;
import org.ojalgo.optimisation.ExpressionsBasedModel;
import org.ojalgo.optimisation.integer.IntegerSolver;
import org.ojalgo.optimisation.integer.IntegerStrategy;
import org.ojalgo.optimisation.integer.NodeKey;
import org.ojalgo.type.context.NumberContext;
/**
* An introduction to the very basics of MIP solver strategy configuration.
*
* @see https://www.ojalgo.org/2022/03/mip-strategy-configuration
*/
public class MIPStrategyConfiguration {
/**
* To run this program you need to update this path. This particular model can be found among ojAlgo's
* test resources. Alternatively you could try some other MIP model.
*/
private static final File FILE = new File("/Users/apete/Developer/optimatika_git/ojAlgo/src/test/resources/optimisation/miplib/gr4x6.mps");
private static final Comparator<NodeKey> MIN_OBJECTIVE = Comparator.comparingDouble((final NodeKey k) -> k.objective).reversed();
public static void main(final String[] args) {
BasicLogger.debug();
BasicLogger.debug(MIPStrategyConfiguration.class);
BasicLogger.debug(OjAlgoUtils.getTitle());
BasicLogger.debug(OjAlgoUtils.getDate());
BasicLogger.debug();
ExpressionsBasedModel model1 = ExpressionsBasedModel.parse(FILE);
/*
* This is how you set the strategy for the MIP solver. In this case it's just set to the default
* strategy, which is of course unnecessary to do - that's what it's set to if you do nothing.
*/
model1.options.integer(IntegerStrategy.DEFAULT);
/*
* IntegerStrategy is an interface, and you're free to provide any implementation you like. One of the
* key things it does is to act as a factory for the model/problem specific ModelStrategy. That's
* where the more advanced configurations takes place. ModelStrategy is an abstract class that allows
* you to implement or override any/all of its functionality.
*/
/*
* You do not need to re-implement everything from scratch just to change some aspect of the strategy.
* The IntegerStrategy.DEFAULT instance is configurable.
*/
IntegerStrategy configuredStrategy = IntegerStrategy.DEFAULT.withParallelism(Parallelism.FOUR).withPriorityDefinitions(MIN_OBJECTIVE);
/*
* Use 4 worker threads and always work on the subproblem with the minimum objective function value
* (from the non-integer parent node).
*/
model1.options.integer(configuredStrategy);
/*
* To see something about how the MIP solver progresses we can turn on progress logging.
*/
model1.options.progress(IntegerSolver.class);
/*
* Then solve and print the results
*/
BasicLogger.debug();
BasicLogger.debug("First attempt with configured strategy");
BasicLogger.debug("===============================================================================");
BasicLogger.debug();
BasicLogger.debug(model1.minimise());
/*
* Actually, before spending time configuring different strategies just try the default settings and
* maybe learn something about the particular problem first.
*/
BasicLogger.debug();
BasicLogger.debug("Should perhaps have tried with the default settings first...");
BasicLogger.debug("===============================================================================");
BasicLogger.debug();
ExpressionsBasedModel model2 = ExpressionsBasedModel.parse(FILE);
model2.options.progress(IntegerSolver.class);
BasicLogger.debug(model2.minimise());
/*
* From the progress logging output you can see how the objective function value improves with each
* new integer solution found. You also see how the range of possible values - the MIP gap - shrinks.
*/
/*
* [197.2642857142857, 208.7] -> FEASIBLE 202.35 @ { 20.0, 1.27675647831893E-15, 25.0, 0.0, 0.0,,,
*/
/*
* [197.2642857142857, 208.7] is the relevant node's local MIP gap where 208.7 is the previously best
* known integer solution, and 197.2642857142857 was the best value we could possibly hope for when
* removing the integrality constraints. 202.35 is the value of the newly found integer solution.
* Looks like it's possible to use a more aggressive MIP gap tolerance - we only need to consider 3
* significant digits when comparing objective function values. (We wont miss any solutions by not
* considering more significant digits.) This may translate to less work for the solver.
*/
BasicLogger.debug();
BasicLogger.debug("The default configuration with just a small adjustment to the MIP gap tolerance");
BasicLogger.debug("===============================================================================");
BasicLogger.debug();
ExpressionsBasedModel model3 = ExpressionsBasedModel.parse(FILE);
model3.options.integer(IntegerStrategy.DEFAULT.withGapTolerance(NumberContext.of(3)));
model3.options.progress(IntegerSolver.class);
BasicLogger.debug(model3.minimise());
/*
* This is a small and simple model. The various configuration changes did effect the solution time,
* and number of nodes evaluated, but regardless it solved relatively quick. With a larger more
* difficult model having the right configuration could be what makes it possiblöe to get a solution
* at all.
*/
}
}
Console Output
class MIPStrategyConfiguration
ojAlgo
2022-03-16
First attempt with configured strategy
===============================================================================
[224.96666666666667, Infinity] -> FEASIBLE 236.3 @ { 35.0, 0.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 25.0, 10.0, 0.0, 0.0, 0.0, 15.0, 0.0, 5.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }
@ 22 (19) 15=0.6666666666666667 224.96666666666667 [0=0<1, 1=0<0, 2=0<0, 3=0<0, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=1<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[225.05, 236.3] -> FEASIBLE 240.05 @ { 35.0, 0.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 20.0, 15.0, 0.0, 0.0, 0.0, 15.0, 5.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }
@ 24 (21) 14=0.75 225.05 [0=0<1, 1=0<0, 2=0<0, 3=0<0, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=1<1, 15=0<0, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[215.41666666666666, 236.3] -> FEASIBLE 221.75 @ { 35.0, 0.0, 5.0, 0.0, 5.0, 0.0, 0.0, 0.0, 20.0, 15.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 5.0, 1.0, 0.0, 1.0, 1.1102230246251565E-16, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 }
@ 28 (18) 19=0.33333333333333326 215.41666666666666 [0=0<1, 1=0<0, 2=1<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=1<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[216.26666666666668, 221.75] -> FEASIBLE 222.60000000000002 @ { 35.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 25.0, 10.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 5.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 }
@ 26 (20) 19=0.33333333333333326 216.26666666666668 [0=0<1, 1=0<0, 2=0<0, 3=1<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=1<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[207.13333333333333, 221.75] -> FEASIBLE 217.8 @ { 35.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 15.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 0.0, 5.0, 5.0, 1.0, 1.0, 0.0, 0.0, 0.0, 5.149274756588439E-17, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 6.938893903907228E-17, 1.0, 0.0, 0.0, 0.0, 0.0, 5.551115123125783E-17, 0.0, 1.0, 0.0, 1.0, 1.0 }
@ 31 (14) 1=0.6666666666666666 207.13333333333333 [0=0<1, 1=1<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=1<1, 21=0<0, 22=0<1, 23=0<1]
[202.88333333333333, 217.8] -> FEASIBLE 213.55 @ { 35.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 10.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0, 3.3306690738754696E-16, 0.0, 1.2212453270876722E-15, 0.0, 2.220446049250313E-16, 5.0, 5.0, 5.000000000000001, 1.0, 1.0, -2.2759572004815717E-17, 0.0, 0.0, 6.745220354487106E-17, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 6.938893903907227E-18, 1.0, 0.0, 0.0, -2.7755575615628914E-17, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 }
@ 34 (12) 1=0.6666666666666667 202.88333333333333 [0=0<1, 1=1<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=1<1, 22=0<1, 23=0<1]
[198.03333333333333, 213.55] -> FEASIBLE 208.7 @ { 35.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 0.0, 5.0, 5.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 14.999999999999996, 0.0, 0.0, 1.0, 1.0, 0.0, 1.1102230246251565E-16, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.1102230246251565E-16, 0.0, 0.0, 0.9999999999999999, 0.0, 0.0 }
@ 42 (7) 1=0.6666666666666666 198.03333333333333 [0=0<1, 1=1<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=0<1, 22=0<1, 23=0<1]
[200.2142857142857, 208.7] -> FEASIBLE 206.5 @ { 15.0, 30.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 0.0, 5.0, 5.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 1.0, 1.0, 0.0, -6.938893903907228E-17, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -6.938893903907228E-17, 0.0, 0.0, 1.0, 0.0, 0.0 }
@ 120 (63) 0=0.5714285714285714 200.2142857142857 [0=1<1, 1=0<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=0<1, 13=0<0, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<0, 20=0<1, 21=0<1, 22=0<1, 23=0<1]
[201.89999999999998, 206.5] -> FEASIBLE 202.34999999999997 @ { 20.0, 0.0, 25.0, 0.0, 0.0, 0.0, 2.220446049250313E-15, 30.0, 0.0, 0.0, 0.0, 5.0, 14.999999999999996, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 1.0, 4.85722573273506E-17, 1.0, 0.0, 0.0, 1.2963000117771623E-16, -3.469446951953614E-18, 1.0, 0.0, 0.0, 0.0, 0.9999999999999999, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 }
@ 146 (136) 2=0.20000000000000007 201.89999999999998 [0=1<1, 1=0<1, 2=1<1, 3=0<0, 4=0<1, 5=0<1, 6=0<1, 7=1<1, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=1<1, 13=0<1, 14=0<1, 15=0<0, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=0<1, 22=0<1, 23=0<1]
Done 182 IntegerSolver iterations in 0.220103605s with NodeStatistics [I=9, E=1, S=81, A=1]
OPTIMAL 202.35 @ { 2E+1, 0, 25, 0, 0, 0, 0, 3E+1, 0, 0, 0, 5, 15, 0, 0, 0, 5, 0, 0, 0, 0, 15, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }
Should perhaps have tried with the default settings first...
===============================================================================
[224.96666666666667, Infinity] -> FEASIBLE 236.3 @ { 35.0, 0.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 25.0, 10.0, 0.0, 0.0, 0.0, 15.0, 0.0, 5.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }
@ 204 (201) 15=0.6666666666666667 224.96666666666667 [0=0<1, 1=0<0, 2=0<0, 3=0<0, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=1<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[225.05, 236.3] -> FEASIBLE 240.05 @ { 35.0, 0.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 20.0, 15.0, 0.0, 0.0, 0.0, 15.0, 5.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }
@ 206 (203) 14=0.75 225.05 [0=0<1, 1=0<0, 2=0<0, 3=0<0, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=1<1, 15=0<0, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[216.26666666666668, 236.3] -> FEASIBLE 222.60000000000002 @ { 35.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 25.0, 10.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 5.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 }
@ 216 (202) 19=0.33333333333333326 216.26666666666668 [0=0<1, 1=0<0, 2=0<0, 3=1<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=1<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[202.88333333333333, 222.60000000000002] -> FEASIBLE 213.54999999999998 @ { 35.0, 10.000000000000004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 10.0, 8.881784197001252E-16, 8.326672684688694E-17, 0.0, 19.999999999999996, 0.0, 0.0, 2.109423746787798E-15, 0.0, 0.0, 0.0, 0.0, 5.000000000000001, 4.999999999999997, 5.0, 0.9999999999999998, 1.0, -2.7755575615628914E-17, 0.0, 0.0, 1.4988010832439607E-16, 0.0, 0.0, 1.0, 1.0, 0.0, 1.6653345369377388E-17, 0.0, 1.0, 0.0, 0.0, 4.163336342344338E-16, 1.4637067577343014E-32, -1.3299546649155492E-17, 0.0, 0.0, 1.0, 0.9999999999999996, 1.0 }
@ 220 (194) 1=0.6666666666666666 202.88333333333333 [0=0<1, 1=1<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=1<1, 22=0<1, 23=0<1]
[198.03333333333333, 213.54999999999998] -> FEASIBLE 208.7 @ { 35.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 0.0, 5.0, 5.0, 0.0, 20.0, 0.0, -2.7755575615628914E-17, 0.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 1.0, 1.0, 0.0, -8.557969148152249E-18, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, -1.8503717077085942E-18, 0.0, 0.0, -1.0408340855860843E-17, 0.0, 0.0, 1.0, 0.0, 0.0 }
@ 238 (189) 1=0.6666666666666666 198.03333333333333 [0=0<1, 1=1<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=0<1, 22=0<1, 23=0<1]
[203.43333333333337, 208.7] -> FEASIBLE 206.5 @ { 15.0, 30.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 0.0, 5.0, 5.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.3877787807814457E-17, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.3877787807814457E-17, 0.0, 0.0, 1.0, 0.0, 0.0 }
@ 279 (250) 9=0.33333333333333354 203.43333333333337 [0=1<1, 1=0<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=0<1, 13=0<0, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<0, 20=0<1, 21=1<1, 22=0<1, 23=0<1]
[197.2642857142857, 206.5] -> FEASIBLE 202.34999999999997 @ { 20.0, 0.0, 25.0, 0.0, 0.0, 0.0, 2.220446049250313E-15, 30.0, 0.0, 0.0, 0.0, 5.0, 14.999999999999996, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 1.0, 4.85722573273506E-17, 1.0, 0.0, 0.0, 1.2963000117771623E-16, -3.469446951953614E-18, 1.0, 0.0, 0.0, 0.0, 0.9999999999999999, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 }
@ 266 (239) 0=0.5714285714285714 197.2642857142857 [0=1<1, 1=0<1, 2=1<1, 3=0<0, 4=0<1, 5=0<1, 6=0<1, 7=1<1, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=1<1, 13=0<1, 14=0<1, 15=0<0, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=0<1, 22=0<1, 23=0<1]
Done 147 IntegerSolver iterations in 0.054456187s with NodeStatistics [I=7, E=8, S=51, A=16]
OPTIMAL 202.35 @ { 2E+1, 0, 25, 0, 0, 0, 0, 3E+1, 0, 0, 0, 5, 15, 0, 0, 0, 5, 0, 0, 0, 0, 15, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }
The default configuration with just a small adjustment to the MIP gap tolerance
===============================================================================
[224.96666666666667, Infinity] -> FEASIBLE 236.3 @ { 35.0, 0.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 25.0, 10.0, 0.0, 0.0, 0.0, 15.0, 0.0, 5.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }
@ 366 (363) 15=0.6666666666666667 224.96666666666667 [0=0<1, 1=0<0, 2=0<0, 3=0<0, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=1<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[225.05, 236.3] -> FEASIBLE 240.05 @ { 35.0, 0.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 20.0, 15.0, 0.0, 0.0, 0.0, 15.0, 5.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }
@ 368 (365) 14=0.75 225.05 [0=0<1, 1=0<0, 2=0<0, 3=0<0, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=1<1, 15=0<0, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[216.26666666666668, 236.3] -> FEASIBLE 222.60000000000002 @ { 35.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 25.0, 10.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 5.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 }
@ 376 (364) 19=0.33333333333333326 216.26666666666668 [0=0<1, 1=0<0, 2=0<0, 3=1<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=1<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[215.41666666666666, 222.60000000000002] -> FEASIBLE 221.75 @ { 34.99999999999999, 0.0, 5.0, 1.7763568394002505E-15, 5.0, 0.0, 0.0, 0.0, 20.0, 14.999999999999998, 0.0, 4.440892098500627E-16, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 5.000000000000001, 1.0, 0.0, 1.0, 1.1102230246251565E-16, 1.0, 4.7184478546569146E-17, 0.0, 0.0, 1.0, 1.0, 0.0, 8.881784197001254E-17, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 }
@ 396 (362) 19=0.33333333333333326 215.41666666666666 [0=0<1, 1=0<0, 2=1<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=1<1, 9=1<1, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=1<1, 20=0<0, 21=0<0, 22=0<1, 23=0<1]
[212.94999999999996, 221.75] -> FEASIBLE 217.95 @ { 35.0, 10.000000000000005, 0.0, 0.0, 0.0, 0.0, 5.329070518200751E-15, 19.999999999999993, 15.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 15.0, 5.0, 0.0, 1.7698793819409534E-15, 0.0, 10.0, 9.59677651545105E-16, 0.0, 5.000000000000002, 1.0000000000000002, 1.0, 0.0, -9.529182998235798E-17, 0.0, 6.938893903907333E-18, 8.326672684688674E-17, 1.0, 1.0, 0.0, 0.0, 0.0, -1.816845285329549E-16, 1.1102230246251592E-17, -2.0747418514673906E-16, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0000000000000007 }
@ 438 (428) 20=0.3333333333333329 212.94999999999996 [0=0<1, 1=1<1, 2=0<0, 3=0<1, 4=0<1, 5=0<1, 6=0<1, 7=1<1, 8=1<1, 9=0<1, 10=0<1, 11=0<1, 12=0<1, 13=0<1, 14=0<1, 15=1<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=1<1, 21=0<1, 22=0<1, 23=0<1]
[198.03333333333333, 217.95] -> FEASIBLE 208.7 @ { 35.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 0.0, 5.0, 5.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 14.999999999999998, 0.0, 0.0, 1.0, 1.0, 0.0, 2.7755575615628914E-17, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 2.7755575615628914E-17, 0.0, 0.0, 0.9999999999999999, 0.0, 0.0 }
@ 384 (351) 1=0.6666666666666666 198.03333333333333 [0=0<1, 1=1<1, 2=0<1, 3=0<1, 4=0<1, 5=0<1, 6=0<0, 7=0<0, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=0<1, 13=1<1, 14=0<1, 15=0<1, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=0<1, 22=0<1, 23=0<1]
[197.2642857142857, 208.7] -> FEASIBLE 202.34999999999997 @ { 20.0, 1.27675647831893E-15, 25.0, 0.0, 0.0, 0.0, 1.7208456881689926E-15, 29.999999999999996, 0.0, 0.0, 0.0, 4.999999999999998, 15.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 1.0, 1.0177044392397267E-16, 1.0, 0.0, 0.0, 7.348011088481597E-17, 0.0, 1.0, 0.0, 0.0, 0.0, 0.9999999999999999, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 }
@ 454 (403) 0=0.5714285714285714 197.2642857142857 [0=1<1, 1=0<1, 2=1<1, 3=0<0, 4=0<1, 5=0<1, 6=0<1, 7=1<1, 8=0<1, 9=0<0, 10=0<1, 11=0<1, 12=1<1, 13=0<1, 14=0<1, 15=0<0, 16=0<1, 17=0<1, 18=0<1, 19=0<1, 20=0<1, 21=0<1, 22=0<1, 23=0<1]
Done 112 IntegerSolver iterations in 0.04494194s with NodeStatistics [I=7, E=8, S=31, A=21]
OPTIMAL 202.35 @ { 2E+1, 0, 25, 0, 0, 0, 0, 3E+1, 0, 0, 0, 5, 15, 0, 0, 0, 5, 0, 0, 0, 0, 15, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }
- ← Previous
Java Matrix Benchmark - Next →
Gomory Mixed Integer Cuts