使用CVXPY进行优化时,如何定义变量并限制到Pandas Dataframe?

时间:2019-01-23 21:42:03

标签: pandas mathematical-optimization pulp cvxopt cvxpy

import pandas as pd
import numpy as np
import re
import cvxpy as cvx

data = pd.read_excel('Optimality_V3.xlsx', encoding='latin-1')

enter image description here

如您所见,我刚刚导入了一个csv文件作为数据框。现在,我想使用CVXPY库求解最大混合函数,以识别行数据['D']的最佳值,从而使数据['B']的值之和最大。

我的目标函数是我的决策变量数据['D']的二次函数,其函数如下:

data ['B'] =数据['C'] *数据['D'] ** 2 / /数据['E']。

我想分配给数据的每一行的约束['D']:

data ['D'] * 0.8 <=数据['D'] <=数据['D'] * 1.2

decision_variables = []
variable_constraints = []

for rownum, row in data.iterrows():
    var_ind = str('x' + str(rownum))
    var_ind = cvx.Variable()
    con_ind = var_ind * 0.8 <= var_ind <= var_ind * 1.2 
    decision_variables.append(str(var_ind))
    variable_constraints.append(str(con_ind))

上面的代码是我这样做的尝试。我是CVXPY的新手,并试图弄清楚如何使用约束con_ind创建名为var_ind的变量。

2 个答案:

答案 0 :(得分:1)

有关许多示例,请参见文档:https://www.cvxpy.org/index.html

data = pd.DataFrame(data={
    'A': [1, 2, 3, 4, 5],
    'B': [0, 50, 40, 80, 20],
    'C': [1200, 600, 900, 6500, 200],
    'D': [0.4, 1.2, 0.8, 1.6, 1.1],
    'E': [0.4, 0.5, 0.6, 0.4, 0.5],
    'F': [0.8, 0.4, 1.2, 1.6, 1],
})

x = cvx.Variable(data.index.size)

constraints = [
    x * 0.8 <= x,
    x <= x * 1.2
]
objective = cvx.Minimize(
    cvx.sum(
        cvx.multiply((data['C']/data['E']).tolist(), x**2)
    )
)
prob = cvx.Problem(objective, constraints)
prob.solve()
print x.value

答案 1 :(得分:0)

我的优化器的目标是为D列计算新值,以使新值始终为(D * 0.8 <= new_D(或x以下)<= D * 1.2,我们称这些x为界限。这些,

最大化功能是:

cvx.sum [cvx.multiply((data ['C'] * data ['F'] / data ['D'])。tolist(),x)]

我还有一个约束:

cvx.sum [cvx.multiply((data ['F'] * data ['E'] * data ['C'] / data ['D'])。tolist(),x ** 2) ] == data ['C']。sum()

import pandas as pd
import numpy as np
import re
import cvxpy as cvx

data = pd.DataFrame(data={
    'A': [1, 2, 3, 4, 5],
    'B': [100, 50, 40, 80, 20],
    'C': [1200, 600, 900, 6500, 200],
    'D': [0.4, 1.2, 0.8, 1.6, 1.1],
    'E': [0.4, 0.5, 0.6, 0.4, 0.5],
    'F': [0.8, 0.4, 1.2, 1.6, 1],
})

x = cvx.Variable(data.index.size)

现在,我要添加第三个附加的二次约束,该约束表示C列的总和始终为常数。

constraints = [
    x * 0.8 <= x,
    x <= x * 1.2,
    cvx.sum(
        cvx.multiply((data['F']*data['E']*data['C']/data['D']).tolist(), x**2)
    ) == data['C'].sum()
]

如您所见,最小化函数非常简单并且是线性的。我如何将其转换为最大化函数?

objective = cvx.Minimmize(
    cvx.sum(
        cvx.multiply((data['C']*data['F']/data['D']).tolist(), x)
    )
)

prob = cvx.Problem(objective, constraints)
prob.solve()
print(x.value)

我正在阅读CVXPY文档,它对我有很大帮助!但是我看不到任何具有第三个约束的示例,这些约束设计与我的类似,并且出现错误“ DCPError:问题未遵循DCP规则。”