首页 > 解决方案 > 使用 CVXPY 进行优化时如何定义变量、约束 Pandas Dataframe?

问题描述

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

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

在此处输入图像描述

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

我的目标函数是二次的,因为我的决策变量 data['D'] 函数是这样的:

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

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

数据['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 的变量。

标签: pandasmathematical-optimizationpulpcvxoptcvxpy

解决方案


查看许多示例的文档: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

推荐阅读