Note
Go to the end to download the full example code.
Optimization using bonmin¶
In this example we are going to explore mixed-integer non linear problems optimization using the bonmin interface. %%
import openturns as ot
ot.Log.Show(ot.Log.NONE)
List available algorithms
for algo in ot.Bonmin.GetAlgorithmNames():
print(algo)
B-BB
B-OA
B-QG
B-Hyb
B-Ecp
B-iFP
Details and references on bonmin algorithms are available here .
Setting up and solving a simple problem¶
The following example will demonstrate the use of bonmin “BB” algorithm to solve the following problem:
such that:
The theoretical minimum is reached for . At this point, the objective function value is
N.B.: equality and inequality constraints are required to be stated as and , respectively. Thus the inequalities above will have to be restated to match this requirement:
Definition of objective function
objectiveFunction = ot.SymbolicFunction(["x0", "x1", "x2", "x3"], ["-x0 -x1 -x2"])
# Definition of variables bounds
bounds = ot.Interval([0.0] * 4, [1, 1e6, 1e6, 5])
# Definition of constraints
# Constraints are defined as g(x) = 0 and h(x) >= 0
# No equality constraint -> nothing to do
# Inequality constraints:
h = ot.SymbolicFunction(
["x0", "x1", "x2", "x3"],
["-(x1-0.5)^2 - (x2-0.5)^2 + 0.25", "x1 - x0", "-x0 - x2 - x3 + 2"],
)
# Definition of variables types
CONTINUOUS = ot.OptimizationProblemImplementation.CONTINUOUS
BINARY = ot.OptimizationProblemImplementation.BINARY
INTEGER = ot.OptimizationProblemImplementation.INTEGER
variablesType = [BINARY, CONTINUOUS, CONTINUOUS, INTEGER]
# Setting up Bonmin problem
problem = ot.OptimizationProblem(objectiveFunction)
problem.setBounds(bounds)
problem.setVariablesType(variablesType)
problem.setInequalityConstraint(h)
bonminAlgorithm = ot.Bonmin(problem, "B-BB")
bonminAlgorithm.setMaximumCallsNumber(10000)
bonminAlgorithm.setMaximumIterationNumber(1000)
bonminAlgorithm.setStartingPoint([0.0] * 4)
Running the solver
bonminAlgorithm.run()
# Retrieving the results
result = bonminAlgorithm.getResult()
print(" -- Optimal point = " + str(result.getOptimalPoint()))
print(" -- Optimal value = " + str(result.getOptimalValue()))
print(" -- Evaluation number = " + str(result.getInputSample().getSize()))
-- Optimal point = [1,1,0.500256,0]
-- Optimal value = [-2.50026]
-- Evaluation number = 282