使用0-1變量將分段函數轉換為線性約束
使用cplex提供的函數
連續線性分段約束
- 語法 piecewise
piecewise{10 -> 100;20 -> 200;40}(0,0) x;
piecewise{k1 -> x1;k2 -> x2;k3 -> x3;k4}(x0,y0) x
- 解釋: x1之前斜率是k1,[x1, x2)期間斜率為k2,[x2, x3)期間值為k3,x3之后斜率為k4, (x0,y0)是分段函數中的某個點, x是變量
非連續線性分段
Values of Unit | Cost |
---|---|
<0 | 0 |
0 to 10 | 10 |
10 to 20 | 15 |
>20 | 20 |
- 語法
piecewise{0->0; 10->0; 0->10; 5->10; 0->20; 5->20; 0} (5,5) unit;
- 理解
使用分步函數
- 語法:stepFunction
F2 = stepwise{ 0->0; 100->20; 60->30; 100 };
- 解釋:分步函數,0之前值為0,[0, 20)期間值為100,[20, 30)期間值為60,之后值為100:
python中使用分段函數的例子
import cplex
c = cplex.Cplex()
indices = c.variables.add(names=['y', 'x'])
idx = c.pwl_constraints.add(vary='y', varx='x',preslope=0.5, postslope=2.0,
breakx=[0.0, 1.0, 2.0], breaky=[0.0, 1.0, 4.0],
name='pwl1')
gurobi相關
在gurobi中只找到了在目標函數中采用近似線性化的方式來表達分段函數和非線性函數的方式。在csdn看到了相同的說法。但是可以使用SOS2約束進行轉換,這個留待以后研究