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