我正在优化的问题是在输电网络中建设发电厂。为此,我在每辆公交车上放置发电厂,并让优化告诉我应该建造哪些发电厂以最大限度地降低运行成本。
为了对植物的放置进行建模,我尝试使用一组二进制变量,如果植物完全被使用,则标记为 1,否则标记为 0。然后在最小化的目标函数中,我将此数组乘以一个常数:USEW。
我进行了多次尝试但没有任何效果。似乎有效的方法是直接在 Obj 中使用if2函数。 Gekko功能。然而我得到了非常奇怪的结果。我的代码有点长,所以我只会发布相关的行,希望这个想法很清楚,如果不是,请告诉我,我会发布整个内容。
bus=node=24
t=24
Sbase=100.
Gen = 12
VOLL = 10000.
VOLW = 50.
USEW = 100.
Pw = m.Array(m.Var,(bus,t), lb=0., ub=0., value=0.)
for b in range(bus):
m.Minimize( np.sum(VOLL*lsh[b,:] + VOLW*Pc[b,:])*Sbase \
+ m.if2(-1.*Sbase*m.sum(Pw[b,:]),1,0)*USEW )
Run Code Online (Sandbox Code Playgroud)
问题出在if2零件上。如果我移除它,我会得到预期的结果,但随后会失去放置哪种植物的决定。我也尝试过,if3但也没有成功。从我看来,优化器似乎正在尝试最小化,Pw[b,:]因为结果仅包含零。以某种方式绕过该if2部分并进入内部sum。
根据文档,这部分:m.if2(-1.*Sbase*m.sum(Pw[b,:]),1,0)应该返回0或,1但似乎没有这样做。我乘以-1因为Pw总是正数,我想检测何时Pw>0。
我需要有关如何为此目的正确使用条件函数的帮助。谢谢
EDIT1 考虑以下情况:
from gekko import GEKKO
m = GEKKO(remote=False)
Sbase=100. …Run Code Online (Sandbox Code Playgroud) Gekko 中是否有一个班轮来检索拉格朗日乘数(例如 GAMS 中的边际),或者如果不是其他方式的单行?
谢谢您的帮助。
gekko ×2