簡體   English   中英

使用IBM CPLEX python API的分段function,但問題無法解決

[英]Using the piecewise function of the IBM CPLEX python API, but the problem cannot be solved

我嘗試使用 MILP(混合 Integer 線性規划)來計算單位承諾問題。 (單元承諾:一個尋找發電機最佳調度的優化問題) 因為發電機功率和成本之間的關系是二次function,所以我使用分段function將功率轉換為成本。

在此處輸入圖像描述

我修改此頁面上的答案: 在此處輸入鏈接描述

簡單的程序結構如下:

from docplex.mp.model import Model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')

#after 4 buses, additional buses of a given size are cheaper
f1=mdl.piecewise(0, [(0,0),(4,2000),(10,4400)], 0.8) 
f2=mdl.piecewise(0, [(0,0),(4,1600),(10,3520)], 0.8) 
cost1= f1(nbbus40)
cost2 = f2(nbbus30)

mdl.minimize(cost1+ cost1)
mdl.solve()
mdl.report()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value) 

這使

* model buses solved with objective = 3520.000
nbBus40  =  0
nbBus30  =  10.0 

答案是完美的,但沒有辦法應用我的例子。 我用了一個分段的function來制定功率和成本的分段線性關系,得到一個新的object(cost1),然后計算出這個object的最小值。 以下是我的實際代碼(簡單):在此處輸入圖片描述(min1,miny1), (pw1_1,pw1_1y),(pw1_2,pw1_2y),(max1,maxy1)是功耗-成本曲線上的斷點

pwl_func_1phase = ucpm.piecewise(0, [(0,0),(min1,miny1), (pw1_1,pw1_1y),(pw1_2,pw1_2y),(max1,maxy1)], 0)
#df_decision_vars_spinning is a dataframe store Optimization variables
df_decision_vars_spinning.at[(units,period),'variable_cost'] = pwl_func_1phase(df_decision_vars_spinning.at[(units,period),'production'] )

total_variable_cost = ucpm.sum((df_decision_vars_spinning.variable_cost))
ucpm.minimize(total_variable_cost )

我不知道是什么原因導致這個優化問題無法解決。 這是我的完整代碼: https://colab.research.google.com/drive/1JSKfOf0Vzo3E3FywsxcDdOz4sAwCgOHd?usp=sharing

不是答案,而是為了說明我的評論。

假設我們有成本曲線

cost = α + β⋅power^2

此外,我們正在最大限度地降低成本。

我們可以使用一些線性曲線來近似。 這里我畫了幾張:

在此處輸入圖像描述

假設每條線性曲線都有以下形式

cost = a(i) + b(i)⋅power

對於i=1,...,n ( n = 線性曲線數)。

很容易看出是我們寫的:

min cost
cost ≥ a(i) + b(i)⋅power   ∀i

我們對二次成本曲線有一個很好的近似。 這正是我在評論中所說的。

這里沒有使用二進制變量。

使用無限版本的 CPLEX,您的 model 可以求解(盡管速度很慢)。 這里有兩個想法可以更好地控制solve()中發生的事情

  1. 使用 solve(log_output=True) 打印日志:你會看到差距縮小
  2. 設置 mip 間隙:將 mip 間隙設置為 5% 會在 36 秒時停止求解

    ucpm.parameters.mip.tolerances.mipgap = 0.05

    ucpm.solve(log_output=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM