【发布时间】:2020-09-05 21:09:54
【问题描述】:
我正在优化的问题是在传输网络中建造发电厂。为此,我将在每辆公共汽车上放置发电厂,并让优化告诉我应该建造哪些发电厂以最大限度地降低运行成本。
为了模拟植物的放置,我尝试使用一组二进制变量来标记,即如果植物被使用则为 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 )
问题出在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.
Pw = array([[[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0]],
[[10.0], [10.0], [10.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0],
[0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]], dtype=object)
# for np.sum(Pw[0,:])=0.0
print('sum of Pw[0,:]=', np.sum(Pw[0,:]))
print(m.if3(-1.*Sbase*np.sum(Pw[0,:]),1,0).value)
print(m.if3(-1.*Sbase*np.sum(Pw[0,:]),0,1).value)
# for np.sum(Pw[1,:])=30.0
print('sum of Pw[1,:]=', np.sum(Pw[1,:]))
print(m.if3(-1.*Sbase*np.sum(Pw[1,:]),1,0).value)
print(m.if3(-1.*Sbase*np.sum(Pw[1,:]),0,1).value)
结果总是一样的:0。如果我交换 x1 和 x2 或者条件 >=0 或 都没有关系
0.0
sum of Pw[0,:]= 0.0
0 #result 1
0 #result 2
sum of Pw[1,:]= 30.0
0 #result 3
0 #result 4
【问题讨论】:
标签: gekko