我正在使用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
,但还是同样的错误。您能帮我解决问题
答案 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')