【问题标题】:"Equation without an equality (=) or inequality (>,<)" error due to user-defined functions in GEKKO由于 GEKKO 中的用户定义函数导致“没有等式 (=) 或不等式 (>,<) 的方程”错误
【发布时间】:2021-12-06 01:28:51
【问题描述】:

我尝试通过 GEKKO 使用数据目录开发离散优化代码。请参阅下面的代码:每当我在约束函数 (con) 中添加带有 pandas 数据帧 (df) 的部分时,我都会收到错误 “没有等式 (=) 或不等式 (>,.

您能帮我解决这个问题吗?提前致谢。

# libraries in use
from gekko import GEKKO
import pandas as pd

# building GEKKO model
m = GEKKO() 

integer=[1,2]

x=[m.sos1(integer) for i in range(len(integer))]  
# x = m.Array(m.Var,2)

# example dataframe
data=[[1,5],[2,10]]
df = pd.DataFrame(data, columns = ['integer', 'catalogue'])

def obj(x,a):
    
    return a*x[0]**2-4*x[1]*x[0]**2+x[1]**2+x[0]**2-x[0]+1

def con(x,a,df):
    
    r = [] 
    for xi in x: 
        print('xi=',xi)
        r.append(df.loc[df['integer'] == xi]['catalogue'].values.item())
    
    return a*r[0]*r[1]**2

# initial guess
ig=[1,2]

i = 0
for xi in x:
    x[i] = ig[i]
    xi.lower = 1
    xi.upper = 5
    i += 1

a=4

m.Equation(con(x,a,df)<=2)

m.Minimize(obj(x,a))
m.options.SOLVER = 1 # APOPT solver
m.solve()

【问题讨论】:

  • 你能解释一下代码在做什么吗? x 是什么?它没有在你的代码中定义。

标签: python pandas dataframe optimization gekko


【解决方案1】:

运行代码并使用m.open_folder() 打开运行文件夹会显示gk_model0.apm 文件,APMonitor 使用该文件将问题编译为字节码以供解决。

Model
Variables
    int_v1 = 0.01, <= 1, >= 0
    int_v2 = 0.01, <= 1, >= 0
    v3 = 0, <= 5, >= 1
    int_v4 = 0.01, <= 1, >= 0
    int_v5 = 0.01, <= 1, >= 0
    v6 = 0, <= 5, >= 1
End Variables
Intermediates
    i0=((0+((1)*(int_v1)))+((2)*(int_v2)))
    i1=((0+((1)*(int_v4)))+((2)*(int_v5)))
End Intermediates
Equations
    ((0+int_v1)+int_v2)=1
    v3=i0
    ((0+int_v4)+int_v5)=1
    v6=i1
    False
    minimize 1
End Equations

End Model

最后一个约束和目标函数的定义方式有问题。

    False
    minimize 1

另外一些建议是使用整数变量而不是m.sos1() 函数。 m.sos1() 函数在变量是离散但不是整数时使用。替换:

integer=[1,2]
x=[m.sos1(integer) for i in range(len(integer))]  

为了更有效的实施,请使用以下内容:

x = m.Array(m.Var,2,lb=1,ub=2,integer=True)

x[i] = ig[i] 将变量 x 的类型从 Gekko 类型更改为整数。请改用x[i].value = ig[i] 来更新初始猜测。根据上面的陈述,x 的上限应该是2,而不是5?可以使用lb=1,ub=2 在变量初始化时设置下限和上限。

函数objcon 仅在问题初始化时评估一次,因此目录查找不会随着x 的值的变化而更新。查找值的另一种方法是将 x 乘以 5 以获得查找值。 &lt;2 的约束给出了一个不可行的解决方案,因此我将其更改为 &lt;1000 以使其可行。这是您的原始问题的修改版本,已成功解决。

from gekko import GEKKO
import pandas as pd
m = GEKKO() 
x = m.Array(m.Var,2,lb=1,ub=2,integer=True)
def obj(x,a):    
    return a*x[0]**2-4*x[1]*x[0]**2+x[1]**2+x[0]**2-x[0]+1
def con(x,a):
    r = [] 
    for xi in x: 
        r.append(xi*5)
    return a*r[0]*r[1]**2
# initial guess
ig=[1,2]
for i,xi in enumerate(x):
    xi.value = ig[i]
a=4
m.Equation(con(x,a)<=1000)
m.Minimize(obj(x,a))
m.options.SOLVER = 1 # APOPT solver
m.solve()
   Objects      :            0
   Constants    :            0
   Variables    :            3
   Intermediates:            0
   Connections  :            0
   Equations    :            2
   Residuals    :            2
 
 Number of state variables:              3
 Number of total equations: -            1
 Number of slack variables: -            1
 ---------------------------------------
 Degrees of freedom       :              1
 
 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------
Iter:     1 I:  0 Tm:      0.00 NLPi:    8 Dpth:    0 Lvs:    3 Obj:  1.22E+00 Gap:       NaN
--Integer Solution:   2.00E+00 Lowest Leaf:   1.22E+00 Gap:   4.81E-01
Iter:     2 I:  0 Tm:      0.00 NLPi:    2 Dpth:    1 Lvs:    2 Obj:  2.00E+00 Gap:  4.81E-01
Iter:     3 I: -1 Tm:      0.00 NLPi:    1 Dpth:    1 Lvs:    1 Obj:  1.22E+00 Gap:  4.81E-01
--Integer Solution:   2.00E+00 Lowest Leaf:   2.00E+00 Gap:   0.00E+00
Iter:     4 I:  0 Tm:      0.00 NLPi:    3 Dpth:    1 Lvs:    1 Obj:  2.00E+00 Gap:  0.00E+00
 Successful solution
 
 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :   1.360000000568107E-002 sec
 Objective      :    2.00000000000000     
 Successful solution
 ---------------------------------------------------

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 2020-09-26
    • 2021-02-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多