我正在try 使用Gekko来优化时间(一个向量),以基于几个约束来生成时间表,即价格和事件可以发生的次数(假设我们将其限制在每x7 5次).

我在sum调用时收到以下错误:TypeError:x必须是一个Python的GEKKO参数、变量或表达式列表.

即使我删除了和,我也会得到以下错误:TypeError:@ error:Model表达式 * 函数字符串语法错误:无效元素:ame

以下变量是长度为42的向量: sp, 基地, neg_ln,

以下变量是zoom 器值(长度为1): min, 麦克斯, co_ln, 二氧化Carbon ,

我可以通过一次只查看42行中的1行来优化x1来实现这一点,但我无法找出如何在约束频率(x7)的情况下在1行内将其转换为多行.任何指导都是赞赏的.

m = GEKKO(server='XXX', remote=False)
m.options.IMODE = 2
m.options.MAX_ITER = 1000

#initialize variables
x1, x2, x3, x4, x5, x6, x7 = [m.Var() for i in range(7)]

x1.value = 1
x2.value = 1
x3.value = 1
x4.value = 0
x5.value = 0
x6.value = 0
x7.value = 1

neg_ln  =  m.Intermediate(-m.log(x1/sp))

vol1  =  m.Intermediate(co1+ base + (neg_ln*co_ln))
vol2  =  m.Intermediate(co2+ base + (neg_ln*co_ln))
vol3  =  m.Intermediate(co3+ base + (neg_ln*co_ln))
vol4  =  m.Intermediate(base + (neg_ln*co_ln))

total_vol = m.Intermediate((
(m.max2(0,base*(m.exp(vol1)-1)) * x3 +
m.max2(0,base*(m.exp(vol2)-1)) * x4 +
m.max2(0,base*(m.exp(vol3)-1)) * x5 +
m.max2(0,base*(m.exp(vol4)-1)) * x6) + base) * x7)

m.Equation(x3+x4+x5+x6 == 1) 
m.Equation(x3+x4+x5+x6 >= 0)
m.Equation(m.sum(x7)<= 5)

m.Equation(x1 >= min)
m.Equation(x1 <= max)

z1 = m.Var(lb = 3, ub = 15)
m.Equation(z1 == x1)
z2 = m.Var(lb = 3, ub = 15)
m.Equation(z2 == x2)
z3 = m.Var(lb = 0,ub = 1, integer=True)
m.Equation(z3 == x3)
z4 = m.Var(lb = 0,ub = 1, integer=True)
m.Equation(z4 == x4)
z5 = m.Var(lb = 0,ub = 1, integer=True)
m.Equation(z5 == x5)
z6 = m.Var(lb = 0,ub = 1, integer=True)
m.Equation(z6 == x6)
z7 = m.Var(lb = 0,ub = 1, integer=True)
m.Equation(z7 == x7)

m.Maximize(m.sum(simu_total_volume))

try:
m.solve(disp = True)
except:
"error"

推荐答案

try 使用列表理解来定义中间值.我插入了问题中没有定义的常量的样本随机值:

sp = np.random.rand(42)
base = np.random.rand(42)
co_ln = 2; co1 = 5; co2=6; co3=7

目前还不清楚x个值是否应该是向量.这是用IMODE=3解决的,其中时间离散化被明确定义,而IMODE=6则在时间离散化由m.time定义.下面是一个成功解决的示例问题.

import numpy as np
from gekko import GEKKO
m = GEKKO(remote=False)
sp = np.random.rand(42)
base = np.random.rand(42)

x1,x2 = m.Array(m.Var,2,lb=3,ub=15,value=1)
x3,x4,x5,x6,x7 = m.Array(m.Var,5,lb=0,ub=1,value=1,integer=True)
# change default values and upper bound
x3.value = 1; x7.value=1; x7.upper = 5
x = [x1,x2,x3,x4,x5,x6,x7]

n = 42
co_ln = 2; co1 = 5; co2=6; co3=7
neg_ln=[m.Intermediate(-m.log(x[0]/sp[i])) for i in range(n)]
vol1  =[m.Intermediate(co1+ base[i] + (neg_ln[i]*co_ln)) for i in range(n)]
vol2  =[m.Intermediate(co2+ base[i] + (neg_ln[i]*co_ln)) for i in range(n)]
vol3  =[m.Intermediate(co3+ base[i] + (neg_ln[i]*co_ln)) for i in range(n)]
vol4  =[m.Intermediate(base[i] + (neg_ln[i]*co_ln)) for i in range(n)]

total_vol = [m.Intermediate((
  (m.max2(0,base[i]*(m.exp(vol1[i])-1)) * x[2] +
   m.max2(0,base[i]*(m.exp(vol2[i])-1)) * x[3] +
   m.max2(0,base[i]*(m.exp(vol3[i])-1)) * x[4] +
   m.max2(0,base[i]*(m.exp(vol4[i])-1)) * x[5]) + base[i]) * x[6]) for i in range(n)]

m.Equation(sum(x[2:7])==1) 
m.Equation(sum(x[2:7])>=0)
m.Equation(x7<=5)

m.Maximize(m.sum(total_vol))

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

for i in range(7):
    print(f'x[{i+1}]: {x[i].value[0]}')

这将产生一个解决方案:

 Number of state variables:    892
 Number of total equations: -  718
 Number of slack variables: -  2
 ---------------------------------------
 Degrees of freedom       :    172

 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------
Iter:     1 I:  0 Tm:      0.32 NLPi:   61 Dpth:    0 Lvs:    3 Obj: -4.87E+02 Gap:       NaN
--Integer Solution:  -2.10E+01 Lowest Leaf:  -4.87E+02 Gap:   1.83E+00
Iter:     2 I:  0 Tm:      0.01 NLPi:    2 Dpth:    1 Lvs:    2 Obj: -2.10E+01 Gap:  1.83E+00
--Integer Solution:  -2.10E+01 Lowest Leaf:  -4.87E+02 Gap:   1.83E+00
Iter:     3 I:  0 Tm:      0.01 NLPi:    2 Dpth:    1 Lvs:    1 Obj: -2.10E+01 Gap:  1.83E+00
Iter:     4 I:  0 Tm:      0.01 NLPi:    2 Dpth:    1 Lvs:    0 Obj:  0.00E+00 Gap:  1.83E+00
 No additional trial points, returning the best integer solution
 Successful solution

 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :  0.36019999999999985 sec
 Objective      :  -20.951499798000548
 Successful solution
 ---------------------------------------------------


x[1]: 3.0
x[2]: 3.0
x[3]: 0.0
x[4]: 0.0
x[5]: 0.0
x[6]: 0.0
x[7]: 1.0

几个建议:

  • 不要定义要在整数约束上添加的z个变量.在声明x个变量时定义整数约束.
  • 使用m.Array()有效地创建变量array.x个值可以定义为向量m.Array(m.Var,7)或矩阵m.Array(m.Var,(7,42)).
  • 使用lbub在初始化时定义边界,或使用x[6].upper=5在初始化后定义边界.使用m.Equation(x[6]<=5)效率较低,因为不等式约束是隐式解决的.
  • 对于以后的问题,请包括一个最小和完整的问题示例,以便可以重现错误.这个问题缺少了几个价值观.

Python相关问答推荐

DataFrame groupby函数从列返回数组而不是值

将jit与numpy linSpace函数一起使用时出错

Pandas - groupby字符串字段并按时间范围 Select

无法定位元素错误404

如何在python polars中停止otherate(),当使用when()表达式时?

Python解析整数格式说明符的规则?

avxspan与pandas period_range

如何创建一个缓冲区周围的一行与manim?

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

将输入聚合到统一词典中

dask无groupby(ddf. agg([min,max])?''''

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

当条件满足时停止ODE集成?

Python pint将1/华氏度转换为1/摄氏度°°

查看pandas字符列是否在字符串列中

没有内置pip模块的Python3.11--S在做什么?

操作布尔值的Series时出现索引问题

遍历列表列表,然后创建数据帧

为什么在不先将包作为模块导入的情况下相对导入不起作用

Pandas:根据相邻行之间的差异过滤数据帧