2.2 KiB
Elastic Constraints
pulp
A constraint C(x) = c (equality may be replaced by ≤ or ≥) can be elasticized to the form
C(x) ∈ D
where D denotes some interval containing the value c.
Define the constraint in two steps:
- instantiate constraint (subclass of
LpConstraint) with target c.- call its
~LpConstraint.makeElasticSubProblemmethod which returns an object of typeFixedElasticSubProblem(subclass ofLpProblem) - its objective is the minimization of the distance of C(x) from D.
constraint = LpConstraint(..., rhs = c)
elasticProblem = constraint.makeElasticSubProblem(
penalty = <penalty_value>,
proportionFreeBound = <freebound_value>,
proportionFreeBoundList = <freebound_list_value>,
)- where:
-
<penalty_value>is a real number<freebound_value>a ∈ [0,1] specifies a symmetric target interval D = (c(1−a),c(1+a)) about c<freebound_list_value> = [a,b], a list of proportions a, b ∈ [0,1] specifying an asymmetric target interval D = (c(1−a),c(1+b)) about c
The penalty applies to the constraint at points x where C(x) ∉ D. The
magnitude of <penalty_value> can be assessed by
examining the final objective function in the .lp file
written by LpProblem.writeLP.
Example:
>>> constraint_1 = LpConstraint('ex_1',sense=1,rhs=200) >>> elasticProblem_1 = constraint_1.makeElasticSubproblem(penalty=1, proportionFreeBound = 0.01) >>> constraint_2 = LpConstraint('ex_2',sense=0,rhs=500) >>> elasticProblem_2 = constraint_2.makeElasticSubproblem(penalty=1, proportionFreeBoundList = [0.02, 0.05])
- constraint_1 has a penalty-free target interval of 1% either side of the rhs value, 200
- constraint_2 has a penalty-free target interval of
- 2% on left and 5% on the right side of the rhs value, 500
Following are the methods of the return-value: