python - 如何在SASOPTPY中定义常量

标签 python optimization

我正在使用 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/

相关文章:

python - 用 Pandas 为所有字符串对创建距离矩阵

optimization - SAS 帮助优化有限制的线性方程

javascript - 是否可以在 JavaScript 中编写 promise?

python - 如何在 netcdf python 中传递复杂参数

mysql - 避免复制到临时表

python - 以元组形式将列表添加到字典中

python - 创建可以在 python 中获取自定义属性的对象的最简单方法

Python:有没有办法根据xml例子生成xsd文件

python - 使用 websockets 在 Python/Quart 中检测客户端断开连接

c++ - openmp并行性能