简体   繁体   English

我如何用 Gekko 制定我的优化问题?

[英]How I can formulat my optimization problem with Gekko?

I want to formulate the objective function (minimization problem): sum[sum[Ri*{Pi² + (Qi - Qcj*Xij)²}for j in range(Nc)] for i in range(N) ] with P and Q are the constants, Qc is a list of proposed solution and X is our decision variable (binary variable).我想制定目标 function(最小化问题): sum[sum[Ri*{Pi² + (Qi - Qcj*Xij)²}for j in range(Nc)] for i in range(N) ] with P and Q是常量,Qc 是建议解决方案的列表,X 是我们的决策变量(二元变量)。 I'm trying to get the vector X which minimizes the objective function. here is my attempt:我正在尝试获取最小化目标 function 的向量 X。这是我的尝试:

from gekko import GEKKO
import numpy as np
P=[13.10511598922975,11.2611396806742,10.103920431906348,8.199519500182628,6.411296067052755,4.753519719147589,3.8977762462825973,2.6593092284662734,1.6399999999854893]
Q=[5.06643685386732,4.4344047044589585,3.8082608015186405,3.2626022579039584,1.2568869621197523,0.6152693459109657,0.46237064874523776,0.35226399840832523,0.20000000001140983]
R=[0.1233, 0.014, 0.7463, 0.6984, 1.9831, 0.9053, 2.0552, 4.7953, 5.3434]
V=[22836.729489371053,22709.575259336147,22158.265414123245,21804.24667418727,21094.79492436245,20864.735217709967,20445.87379603059,19749.824571485897,19262.430633445863]
Kc=[0.5, 0.35, 0.253, 0.22, 0.276, 0.183, 0.228,0.17,0.207,0.201,0.193,0.187,0.211,0.176,0.179,0.170,0.189,0.187,0.183,0.180,0.195,0.174,0.188,0.170,0.183,0.182,0.179]
Qc=[150, 300, 450, 600,750, 900,1050, 1200,1350,1500,1650,1800,1950,2100,2250,2400,2550,2700,2850,3000,3150,3300,3450,3600,3750,3900,4050]
Ke=168
T=24*356
N=len(Q)
Nc=len(Qc)
m = GEKKO(remote=False)
X = m.Array(m.Var,(N,Nc),integer=True,lb=0,ub=1,value=0)
#convirtir P et Q en KW
for i in range(N):
    Q[i]=Q[i]*1000
    P[i]=P[i]*1000
    #constrainte ## one per line
for i in range(N):
    m.Equation(m.sum([X[i][j]for j in range(Nc)])<=1)    
b=m.sum([m.sum([R[i]*((P[i]**2)+((Q[i])-Qc[j]*X[i][j])**2) for j in range(Nc)]) for i in range(N)])
m.Minimize(b)

I tried 3 methods: method 1:我尝试了 3 种方法: 方法 1:

m.options.SOLVER = 1
m.solve()

method 2:方法二:

bv = np.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,0,0,0,0,0,0,0,1],
 [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
 [0, 0, 0, 0, 0, 0, 1, 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,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, 1, 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, 1, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])
for i in range(N):
    for j in range(Nc):
        X[i,j].value = bv[i,j]
m.options.SOLVER = 1
m.solve()

method 3:方法三:

m.options.SOLVER = 3
m.solve(debug=0, disp=True)
m.options.SOLVER = 1
m.solve(debug=0, disp=True)

here is my attempt: I tried 3 methods: method 1: method 2 method 3:这是我的尝试:我尝试了 3 种方法:方法 1:方法 2 方法 3:

The 3 methods don't give me the optimal solution.这 3 种方法没有给我最佳解决方案。

Use the solver options to get a better solution by not terminating when the gap_tol is met at 1e-3 (default).gap_tol1e-3 (默认)满足时不终止,使用求解器选项获得更好的解决方案。 The gap_tol is an early termination criterion that helps obtain MINLP solutions faster, but with a less optimal solution. gap_tol是一种提前终止标准,有助于更快地获得 MINLP 解决方案,但解决方案不是最优的。 Setting gap_tol to zero and minlp_max_iter_with_int_sol to a large number will iterate through all remaining potential solutions.gap_tol设置为零并将minlp_max_iter_with_int_sol设置为较大的数字将遍历所有剩余的潜在解决方案。 The computational time increases so I recommend a smaller gap_tol such as 1e-5 and minlp_max_iter_with_int_sol 2000 .计算时间会增加,因此我建议使用较小的gap_tol ,例如1e-5minlp_max_iter_with_int_sol 2000

m.solver_options = ['minlp_gap_tol 1e-5',\
                    'minlp_maximum_iterations 10000',\
                    'minlp_max_iter_with_int_sol 2000']
m.options.SOLVER=1
m.solve(disp=True)

This gives a solution with an objective of 9.535e9.这给出了目标为 9.535e9 的解决方案。

 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :    170.673799999990      sec
 Objective      :    9535331689.96189     
 Successful solution
 ---------------------------------------------------

The objective with the initial guess fixed is 9.541e9 .固定初始猜测的目标是9.541e9

bv = np.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,0,0,0,0,0,0,0,1],
 [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
 [0, 0, 0, 0, 0, 0, 1, 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,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, 1, 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, 1, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])
for i in range(N):
    for j in range(Nc):
        X[i,j].value = bv[i,j]
        m.Equation(X[i,j]==bv[i,j])
 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :   2.180000001681037E-002 sec
 Objective      :    9540896947.56266     
 Successful solution
 ---------------------------------------------------

A couple other suggestions that didn't help the solution accuracy, but may be things to consider in the future:其他一些对解决方案准确性没有帮助的建议,但可能是将来要考虑的事情:

  1. The speed of solution can be improved with this alternative for expressing the objective function.使用此替代方案可以提高解决方案的速度,以表达目标 function。
b=[sum([R[i]*((P[i]**2)+((Q[i])-Qc[j]*X[i][j])**2)
                for j in range(Nc)]) for i in range(N)]
[m.Minimize(bi) for bi in b]
  1. The objective function is quite high >1e9 at the solution.解决方案的目标 function 相当高>1e9 You could consider increasing the solver tolerance and keeping the problem in MW versus kW by removing these lines.您可以考虑增加求解器的容差,并通过删除这些线将问题保持在 MW 与 kW 之间。
#convirtir P et Q en KW
#for i in range(N):
#    Q[i]=Q[i]*1000
#    P[i]=P[i]*1000

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM