Gekko:gekko 不接受 MINLP 选项
Gekko : MINLP options not accepted by gekko
我正在尝试使用 gekko 解决 MINLP 问题。
我的代码如下:
m = GEKKO(remote = False)
m.options.SOLVER = 3
m.solver_options = ['minlp_maximum_iterations 500', \
# minlp iterations with integer solution
'minlp_max_iter_with_int_sol 10', \
# treat minlp as nlp
'minlp_as_nlp 0', \
# nlp sub-problem max iterations
'nlp_maximum_iterations 50', \
# 1 = depth first, 2 = breadth first
'minlp_branch_method 1', \
# maximum deviation from whole number
'minlp_integer_tol 0.05', \
# covergence tolerance
'minlp_gap_tol 0.01']
rows = nb_phases + 3*b_max*(nb_phases+1)
x = np.empty(rows,dtype=object)
for i in range(3*nb_phases*b_max+nb_phases+1):
x[i] = m.Var(value = xinit[i], lb = LB[i], ub = UB[i], integer = False)
for i in range(3*nb_phases*b_max+nb_phases+1, (3*nb_phases+3)*b_max+nb_phases):
x[i] = m.Var(value = xinit[i], lb = LB[i], ub = UB[i], integer = True)
# Constraints
m.axb(A,B,x,etype = '<=',sparse=False)
m.axb(A_eq,B_eq,x,etype = '=',sparse=False)
# Objective Function
f = objective_fun(x, t, ob, jofbuses, q, qc, s, oa, k, l, T, G_next, C, Y, G_previous)
m.Obj(f)
#Solver
m.solve(disp = False)
我得到以下异常:
异常消息:读取选项:“minlp_maximum_iterations”。这不是一个有效的选项。检查可用选项列表。
我对所有其他选项都得到了相同的例外。
我尝试将求解器更改为 m.options.solver = 1 但随后出现错误:
错误:异常:访问冲突
Traceback:不可用,使用 -ftrace=frame 或 -ftrace=full 编译
错误:'results.json' 未找到。
我在上面的代码中调用的'objective_fun'函数如下:
def objective_fun(x, t, ob, jofbuses, q, qc, s, oa, k, l, T, G_next, C, Y, G_previous):
nb_phases = len(G_next)
b_max = len(t)
no_lanegroups = len(q)
obj = 0
G = x[0:nb_phases]
for j in range(no_lanegroups):
delay_a = 0.5*q[j]/(1-q[j]/s[j]) * (pow((sum(G_previous[l[j]:nb_phases]) + sum(G[0:k[j]-1]) + sum(Y[l[j]-1:nb_phases]) + sum(Y[0:k[j]-1])),2) + pow(sum(G[l[j]:nb_phases]) + sum(G_next[0:k[j]-1]) + sum(Y[l[j]-1:nb_phases]) + sum(Y[0:k[j]-1]),2))
obj = obj + oa*delay_a
for b in range(b_max):
delay_b1 = x[(3*nb_phases+1)*b_max + nb_phases + b]*(q[jofbuses[b]-1]/s[jofbuses[b]-1] * (t[b] - (T-1)*C + sum(G_previous[l[jofbuses[b]-1]:nb_phases]) + sum(Y[l[jofbuses[b]-1] -1:nb_phases])) + (T-1)*C - t[b] + sum(Y[0:k[jofbuses[b]-1]-1]))
delay_b2 = x[(3*nb_phases+2)*b_max + nb_phases + b-1]*(q[jofbuses[b]-1]/s[jofbuses[b]-1] * (t[b] - (T-1)*C - sum(Y[0:l[jofbuses[b]-1]-1])) + T*C + sum(G_next[0:k[jofbuses[b]-1]-1]) + sum(Y[0:k[jofbuses[b]-1]-1]) - t[b])
delay_b3 = sum(x[nb_phases*b_max + nb_phases*b:nb_phases*b_max + nb_phases*b+k[jofbuses[b]-1]-1]) - q[jofbuses[b]-1]/s[jofbuses[b]-1]*sum(x[2*nb_phases*b_max + nb_phases*b:2*nb_phases*b_max + nb_phases*b +l[jofbuses[b]-1]])
delay_b = delay_b1+delay_b2 +delay_b3
obj = obj + delay_b*ob[b]
return obj
此外,如果我不指定选项,我可以 运行 代码并找到成功的解决方案。然而,x 数组的某些元素应该是整数,但我得到的解决方案不符合这种情况。
你能帮我弄清楚如何解决这些问题吗?
非常感谢!
选项 minlp_maximum_iterations
不是 available options for the IPOPT solver 之一。您正确地发现切换到 m.options.SOLVER=1
(APOPT 求解器)可以解决此错误。
求解器未找到解决方案。我推荐一种初始化策略,首先使用没有选项的 IPOPT 来解决。接下来,再次使用 APOPT 选项求解,以查看 IPOPT 非整数解是否有助于作为寻找最优整数解的起点。
我正在尝试使用 gekko 解决 MINLP 问题。 我的代码如下:
m = GEKKO(remote = False)
m.options.SOLVER = 3
m.solver_options = ['minlp_maximum_iterations 500', \
# minlp iterations with integer solution
'minlp_max_iter_with_int_sol 10', \
# treat minlp as nlp
'minlp_as_nlp 0', \
# nlp sub-problem max iterations
'nlp_maximum_iterations 50', \
# 1 = depth first, 2 = breadth first
'minlp_branch_method 1', \
# maximum deviation from whole number
'minlp_integer_tol 0.05', \
# covergence tolerance
'minlp_gap_tol 0.01']
rows = nb_phases + 3*b_max*(nb_phases+1)
x = np.empty(rows,dtype=object)
for i in range(3*nb_phases*b_max+nb_phases+1):
x[i] = m.Var(value = xinit[i], lb = LB[i], ub = UB[i], integer = False)
for i in range(3*nb_phases*b_max+nb_phases+1, (3*nb_phases+3)*b_max+nb_phases):
x[i] = m.Var(value = xinit[i], lb = LB[i], ub = UB[i], integer = True)
# Constraints
m.axb(A,B,x,etype = '<=',sparse=False)
m.axb(A_eq,B_eq,x,etype = '=',sparse=False)
# Objective Function
f = objective_fun(x, t, ob, jofbuses, q, qc, s, oa, k, l, T, G_next, C, Y, G_previous)
m.Obj(f)
#Solver
m.solve(disp = False)
我得到以下异常:
异常消息:读取选项:“minlp_maximum_iterations”。这不是一个有效的选项。检查可用选项列表。
我对所有其他选项都得到了相同的例外。
我尝试将求解器更改为 m.options.solver = 1 但随后出现错误:
错误:异常:访问冲突 Traceback:不可用,使用 -ftrace=frame 或 -ftrace=full 编译 错误:'results.json' 未找到。
我在上面的代码中调用的'objective_fun'函数如下:
def objective_fun(x, t, ob, jofbuses, q, qc, s, oa, k, l, T, G_next, C, Y, G_previous):
nb_phases = len(G_next)
b_max = len(t)
no_lanegroups = len(q)
obj = 0
G = x[0:nb_phases]
for j in range(no_lanegroups):
delay_a = 0.5*q[j]/(1-q[j]/s[j]) * (pow((sum(G_previous[l[j]:nb_phases]) + sum(G[0:k[j]-1]) + sum(Y[l[j]-1:nb_phases]) + sum(Y[0:k[j]-1])),2) + pow(sum(G[l[j]:nb_phases]) + sum(G_next[0:k[j]-1]) + sum(Y[l[j]-1:nb_phases]) + sum(Y[0:k[j]-1]),2))
obj = obj + oa*delay_a
for b in range(b_max):
delay_b1 = x[(3*nb_phases+1)*b_max + nb_phases + b]*(q[jofbuses[b]-1]/s[jofbuses[b]-1] * (t[b] - (T-1)*C + sum(G_previous[l[jofbuses[b]-1]:nb_phases]) + sum(Y[l[jofbuses[b]-1] -1:nb_phases])) + (T-1)*C - t[b] + sum(Y[0:k[jofbuses[b]-1]-1]))
delay_b2 = x[(3*nb_phases+2)*b_max + nb_phases + b-1]*(q[jofbuses[b]-1]/s[jofbuses[b]-1] * (t[b] - (T-1)*C - sum(Y[0:l[jofbuses[b]-1]-1])) + T*C + sum(G_next[0:k[jofbuses[b]-1]-1]) + sum(Y[0:k[jofbuses[b]-1]-1]) - t[b])
delay_b3 = sum(x[nb_phases*b_max + nb_phases*b:nb_phases*b_max + nb_phases*b+k[jofbuses[b]-1]-1]) - q[jofbuses[b]-1]/s[jofbuses[b]-1]*sum(x[2*nb_phases*b_max + nb_phases*b:2*nb_phases*b_max + nb_phases*b +l[jofbuses[b]-1]])
delay_b = delay_b1+delay_b2 +delay_b3
obj = obj + delay_b*ob[b]
return obj
此外,如果我不指定选项,我可以 运行 代码并找到成功的解决方案。然而,x 数组的某些元素应该是整数,但我得到的解决方案不符合这种情况。
你能帮我弄清楚如何解决这些问题吗? 非常感谢!
选项 minlp_maximum_iterations
不是 available options for the IPOPT solver 之一。您正确地发现切换到 m.options.SOLVER=1
(APOPT 求解器)可以解决此错误。
求解器未找到解决方案。我推荐一种初始化策略,首先使用没有选项的 IPOPT 来解决。接下来,再次使用 APOPT 选项求解,以查看 IPOPT 非整数解是否有助于作为寻找最优整数解的起点。