如何在SASOPTPY中定义常量

时间:2018-12-15 18:05:52

标签: python optimization

我正在使用sasoptpy在python3.6中进行优化。我的目标函数看起来像z =(a p + q b)* c。其中所有这些变量都是数据框的列。 a,p,q,b是我的变量,c是常数。 我以以下方式va=m.add_variable(a, name='va',lb=LB2,ub=UB2)定义a,b,p,q。但不确定如何定义常数c。最初,我尝试了c=data['z']并将其用于目标函数 m.set_objective((a*p+q*b)*c)却收到错误消息

WARNING: An invalid type is passed to create an Expression:
KeyError: 'CONST'        

我也尝试了c=data['z'].values,但还是同样的错误。您能帮我解决问题

1 个答案:

答案 0 :(得分:0)

我在SAS社区论坛上回答了类似的问题,但让我在这里提出答案。

sasoptpy表达式中的常量应该是Python变量,或者是sasoptpy的抽象数据类型之一。由于您将c称为常量,因此我相信它在您的数据框中应该有一个值。

假设您具有以下结构:

df = pd.DataFrame([[4, 5, 6]], columns=['a', 'b', 'c'])

您可以将{em> constant c的值访问为df.at[0, 'c']

请参阅下面的完整示例:

import pandas as pd

# Define dataframe
df = pd.DataFrame([[4, 5, 6]], columns=['a', 'b', 'c'])

# Define model
m = so.Model(name='model1', session=None)

# Get columns
a = df['a']
b = df['b']
c = df.at[0, 'c']

# Define variables
va = m.add_variables(a.index.tolist(), name='va')
vb = m.add_variables(b.index.tolist(), name='vb')

# Set objective
obj = m.set_objective((va.mult(a) + vb.mult(b)) * c, name='obj')

# Print the objective function
print(m.get_objective())

这给

24 * va[0] + 30 * vb[0]

如果您的数据框对象由多行(观察)组成,则列c的每一行应具有不同的值。如果是这样,您需要一个用于目标的求和函数。

考虑一下:

m.set_objective(
  so.quick_sum((va[i] * a[i] + vb[i] * b[i]) * c[i] for i in df.index), name='obj')