我正在使用 sasoptpy 在 python3.6 中进行优化。我的目标函数看起来像 z=(ap+qb)*c。其中所有这些变量都是数据框的列。
a、p、q、b 是我的变量,c 是常量。
我按照以下方式定义 a,b,p,q va=m.add_variable(a, name='va',lb=LB2,ub=UB2)
。但不知道如何定义常数 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
但又出现同样的错误。你能帮我解决这个问题
最佳答案
我在 SAS 社区论坛上回答了类似的问题,但让我在这里发表我的答案。
sasoptpy 表达式中的常量应该是 Python 变量,或者 sasoptpy 的抽象数据类型之一。既然您提到 c
是一个常量,我相信它应该在您的数据框中具有一个值。
假设您的结构如下:
df = pd.DataFrame([[4, 5, 6]], columns=['a', 'b', 'c'])
您可以将常数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')
关于python - 如何在SASOPTPY中定义常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53795877/