首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >极小极大优化- Gekko

极小极大优化- Gekko
EN

Stack Overflow用户
提问于 2022-10-27 01:22:05
回答 1查看 35关注 0票数 2

我试图建立这个极小极大优化函数。我不是这个代码的哪个部分写得不对。

这项功能的目的是安排电动汽车的充电开始时间,以尽量减少需求的高峰。另一方面,需求的峰值是方程的最大值,它决定了每个EV在哪个时隙中接收电荷。

代码语言:javascript
复制
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的建议,但它不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-28 13:05:49

gekko中的Minimax要求变量(例如x1-x3)都是Gekko类型。

代码语言:javascript
复制
 min Z
 s.t. x1 + x2 + x3 = 15
      Z >= x1
      Z >= x2
      Z >= x3

以下是解决方案为x1=x2=x3=5的上述问题的一个示例。

代码语言:javascript
复制
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是目标函数中的唯一一件事。

代码语言:javascript
复制
#(removed) mdl.Minimize(H)

这是完整的代码。原始代码缺少z的定义。对于未来的问题,请张贴一个完整和最小的问题的例子。

代码语言:javascript
复制
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迭代次数,然后它才能报告成功的解决方案,或者将间隙容忍降低到接近于零。

代码语言:javascript
复制
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目录。这显示了脚本生成的模型方程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74215767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档