
我试图建立这个极小极大优化函数。我不是这个代码的哪个部分写得不对。
这项功能的目的是安排电动汽车的充电开始时间,以尽量减少需求的高峰。另一方面,需求的峰值是方程的最大值,它决定了每个EV在哪个时隙中接收电荷。
def testGEKKO():
# set of all EVs
n = np.linspace(1,10,10)
# set of contract time for 10 hours
t = np.linspace(1,10,10)
arival_time = [0,2,1,5,2,3,6,0,6,4]
duration = 2
I = []
L = []
for ev in range(len(n)):
all_intervals = []
start = arival_time[ev]
while start < 10 - duration:
all_intervals.append([start, start+duration])
L.append(start)
start += 1
I.append(all_intervals)
L = list(set(L))
h = np.array([50, 50, 50, 50, 50, 50, 50, 50, 50, 50])
mdl = GEKKO(remote = False)
idx = []
H = mdl.Var(1,lb=0,integer=True)
mdl.Minimize(H)
for ev in range(len(n)):
idx.append(mdl.Array(mdl.Var, (len(I[ev])), lb = 0, ub = 1, integer = True))
for ev in range(len(n)):
mdl.Equation(np.sum(idx[ev]) == 1)
for time in L:
evs = []
all_idx_start = []
for ev in range(len(n)):
st = np.array(I[ev])[:,0]
if time in st:
evs.append(ev)
all_idx_start.append(list(np.array(I[ev])[:,0]).index(time))
equ = 0
for i in range(len(all_idx_start)):
equ += idx[evs[i]][all_idx_start[i]] * h[evs[i]]
equations.append(equ <= z)
mdl.Equation(equ <= z)
#mdl.Equations([z>=equations[0],z>=equations[1],z>=equations[2], z>=equations[3],z>=equations[4],z>=equations[5],z>=equations[6],z>=equations[7]])
#mdl.Equations([z[0]>=equations[0]])
mdl.Minimize(z)
mdl.options.MAX_ITER = 3000
#mdl.open_folder()
mdl.options.SOLVER = 1
mdl.options.IMODE = 3
mdl.solve(disp=True)
return idx我已经尝试过Gekko的建议,但它不起作用。
发布于 2022-10-28 13:05:49
gekko中的Minimax要求变量(例如x1-x3)都是Gekko类型。
min Z
s.t. x1 + x2 + x3 = 15
Z >= x1
Z >= x2
Z >= x3以下是解决方案为x1=x2=x3=5的上述问题的一个示例。
from gekko import GEKKO
m = GEKKO(remote=False)
x1,x2,x3,Z = m.Array(m.Var,4)
m.Minimize(Z)
m.Equation(x1+x2+x3==15)
m.Equations([Z>=x1,Z>=x2,Z>=x3])
m.solve()
print(x1.value[0],x2.value[0],x3.value[0],Z.value[0])对于特定的应用程序,不需要最小化变量H。最小化z是目标函数中的唯一一件事。
#(removed) mdl.Minimize(H)这是完整的代码。原始代码缺少z的定义。对于未来的问题,请张贴一个完整和最小的问题的例子。
from gekko import GEKKO
import numpy as np
# set of all EVs
n = np.linspace(1,10,10)
# set of contract time for 10 hours
t = np.linspace(1,10,10)
arival_time = [0,2,1,5,2,3,6,0,6,4]
duration = 2
I = []
L = []
for ev in range(len(n)):
all_intervals = []
start = arival_time[ev]
while start < 10 - duration:
all_intervals.append([start, start+duration])
L.append(start)
start += 1
I.append(all_intervals)
L = list(set(L))
h = np.array([50, 50, 50, 50, 50, 50, 50, 50, 50, 50])
mdl = GEKKO(remote = False)
idx = []
z = mdl.Var()
H = mdl.Var(1,lb=0,integer=True)
#mdl.Minimize(H)
for ev in range(len(n)):
idx.append(mdl.Array(mdl.Var, (len(I[ev])), lb = 0, ub = 1, integer = True))
for ev in range(len(n)):
mdl.Equation(np.sum(idx[ev]) == 1)
for time in L:
evs = []
all_idx_start = []
for ev in range(len(n)):
st = np.array(I[ev])[:,0]
if time in st:
evs.append(ev)
all_idx_start.append(list(np.array(I[ev])[:,0]).index(time))
equ = 0
for i in range(len(all_idx_start)):
equ += idx[evs[i]][all_idx_start[i]] * h[evs[i]]
print(equ)
mdl.Equation(equ <= z)
mdl.Minimize(z)
mdl.options.MAX_ITER = 3000
#mdl.open_folder()
mdl.options.SOLVER = 1
mdl.options.IMODE = 3
mdl.solve(disp=True)如果这仍然没有生成正确的答案,您可能需要增加MINLP迭代次数,然后它才能报告成功的解决方案,或者将间隙容忍降低到接近于零。
m.solver_options = ['minlp_gap_tol 1.0e-2',\
'minlp_maximum_iterations 10000',\
'minlp_max_iter_with_int_sol 1500']
m.options.solver = 1另外,查看gk0_model.apm文件,该文件位于mdl.path (运行目录)中。您可以使用mdl.open_folder()打开run目录。这显示了脚本生成的模型方程。
https://stackoverflow.com/questions/74215767
复制相似问题