分段函數線性化:建模和使用cplex


使用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
&lt0 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;
  • 理解
    1842787f0650da17ef4a8f00106e2511.png

使用分步函數

  • 語法: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約束進行轉換,這個留待以后研究

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM