User guide · 2.0 development
Mixed-Integer Problems¶
SHOT is designed for mixed-integer nonlinear programming (MINLP). This small linear mixed-integer model introduces integer variables before we add nonlinear expressions:
\[\begin{split}
\begin{aligned}
\text{maximize} \quad & 3x + 2y \\
\text{subject to} \quad & 2x + y \leq 10 \\
& x, y \in \mathbb{Z}_+
\end{aligned}
\end{split}\]
# Create a MIP problem
solver = SHOTpy.Solver()
problem = SHOTpy.Problem(solver)
# Add integer variables
x = problem.addVariable("x", SHOTpy.VariableType.Integer, 0.0, 100.0)
y = problem.addVariable("y", SHOTpy.VariableType.Integer, 0.0, 100.0)
# Objective: maximize 3x + 2y
problem.setObjective(3 * x + 2 * y, SHOTpy.ObjectiveDirection.Maximize)
# Constraint: 2x + y <= 10
problem.addConstraint(2 * x + y <= 10, "budget")
# Solve
problem.finalize()
assert solver.setProblem(problem)
assert solver.solveProblem()
assert solver.getModelReturnStatus() == SHOTpy.ModelReturnStatus.OptimalGlobal
sol = solver.getPrimalSolution()
print(f"Optimal objective value: {sol.objValue:.4f}")
print(f"Optimal solution: x = {sol.point[0]}, y = {sol.point[1]}")
# The optimum is x = 0, y = 10
assert abs(sol.objValue - 20.0) < 1e-3