| |||||||||||||||
| |||||||||||||||
|
Linearizations and approximations via SOS and piecewise linear (pwl) expressions Description Various examples of using SOS (Special Ordered Sets of type 1 or 2) to represent nonlinear functions in MIP models implemented with the Xpress Solver Python API.
Source Files By clicking on a file name, a preview is opened at the bottom of this page.
soslin.py
"""
Xpress Python Example Problems
======================
file soslin.py
```````````````
Approximation of a nonlinear function by a SOS-2.
- Example discussed in mipformref whitepaper -
(c) 2024 Fair Isaac Corporation
author: B. Vieira, Sep. 2024
"""
import xpress as xp
from xpress.enums import SolStatus
I = range(4)
R = [1, 2.5, 4.5, 6.5]
FR = [1.5, 6, 3.5, 2.5]
p = xp.problem()
# Create the decision variables
x = p.addVariable(lb=R[0],ub=R[3],name="x") # x-values interval defined by the breakpoints
y = p.addVariable(name="y")
w = [p.addVariable(name="w{0}".format(i)) for i in I]
# Define the SOS-2 with weights R
p.addSOS(w, R, name="Defx", type=2)
# Weights must sum up to 1
p.addConstraint(xp.Sum(w[i] for i in I) == 1.0)
# The variable and the corresponding function value we want to approximate
p.addConstraint(x == xp.Sum(R[i]*w[i] for i in I))
p.addConstraint(y == xp.Sum(FR[i]*w[i] for i in I))
# Set a lower bound on x to make the problem more interesting
x.lb = 2
# Set objective
p.setObjective(y)
# Write out the model in case we want to look at it
p.write("soslin.lp")
# Solve the problem
p.optimize()
match p.attributes.solstatus:
case SolStatus.FEASIBLE | SolStatus.OPTIMAL:
print("MIP solution: ", p.attributes.objval)
case SolStatus.INFEASIBLE:
print("Problem is infeasible")
case SolStatus.UNBOUNDED:
print("LP unbounded")
case SolStatus.NOTFOUND:
print("Solution not found")
print(x.name,": ",p.getSolution(x))
| |||||||||||||||
| © Copyright 2025 Fair Isaac Corporation. |