【发布时间】:2021-02-11 02:34:06
【问题描述】:
根据a related question 中关于使用字典作为gekko 源输入的提示,我做了如下操作;
import pandas as pd
from gekko import GEKKO
my_vars = ['x1','x2','x3']
# stored as dictionaries
Cost = {'x1':100,'x2':125,'x3':80}
Min = {'x1':0,'x2':0,'x3':0}
Max = {'x1':70,'x2':40,'x3':15}
LP = GEKKO(remote=False)
va = LP.Array(LP.Var, (len(my_vars))) # array
vd = {} # dictionary
for i,xi in enumerate(my_vars):
vd[xi] = va[i]
vd[xi].lower = Min[xi]
vd[xi].upper = Max[xi]
# Cost function
LP.Minimize(LP.sum([Cost[xi]*vd[xi] for xi in my_vars]))
# This also works as a dictionary
LP.Equation(LP.sum([vd[xi] for xi in my_vars])==100)
LP.solve(disp=True)
for xi in my_vars:
print(xi,vd[xi].value[0])
print ('Cost: ' + str(LP.options.OBJFCNVAL))
这很成功。
但假设我将变量系数作为 LHS,将标准数据作为 RHS,采用数据框格式,
例如;
Coef = [['x1', 33, 8.8, 0.2, 0.1], ['x2', 24, 4.5, 2, 0.5], ['x3', 82, '', '', '']]
LHS = pd.DataFrame(Coef, columns=['Name', 'p1', 'p2', 'p3', 'p4'])
LHS.set_index('Name')
and
goals = [['p1', 30], ['p2', 5], ['p3', 0.7], ['p4', 0.2]]
RHS = pd.DataFrame(goals, columns=['property', 'goal'])
我想在 for 循环中使用 LHS 和 RHS 数据动态构造约束。 我做了如下,
for i in range(len(RHS)):
LP.Equation(LP.sum([LHS.iloc[list(my_vars).index(xi), i]*vd[xi] for xi in my_vars]) >= RHS.iloc[i,1])
但有错误。
APMonitor,版本 0.9.2
APMonitor 优化套件
--------- APM Model Size ------------每个时间步包含
对象:6
常量:0
变量:28
中间体:0
连接数:24
方程式:22
残差:22
@error: 模型表达式 *** 错误 函数字符串的语法:无效元素:x1位置:7 v9-(((x1)*(v1))) ?
Traceback(最近一次通话最后一次):
文件“”,第 1 行,在 LP.solve(disp=True)
文件 “/opt/anaconda3/envs/py37/lib/python3.7/site-packages/gekko/gekko.py”, 第 2130 行,在求解 引发异常(apm_error)
异常:@error:模型表达式 *** 函数语法错误 字符串:无效元素:x1
位置:7 v9-(((x1)*(v1))) ?
我的代码有什么问题?
【问题讨论】:
标签: python for-loop constraints linear-programming gekko