Как определить переменные, ограничения для Pandas Dataframe при использовании CVXPY для оптимизации? - PullRequest
0 голосов
/ 24 января 2019
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'] = data ['C'] * data['D'] ** 2 / data ['E'].

Ограничения, которые я хочу назначить для каждой строки данных ['D']:

data ['D'] * 0.8 <= data ['D'] <= data ['D'] * 1.2 </p>

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 и пытаюсь выяснить, как я могу создать переменные с именем var_ind с ограничениями con_ind.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Цель моего оптимизатора - вычислить новые значения для столбца D так, чтобы новые значения всегда были (D * 0,8 <= new_D (или x ниже) <= D * 1,2, давайте назовем эти границы x. Помимо это, </p>

Функция максимизации:

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

У меня есть еще одно ограничение:

cvx.sum [cvx.multiply ((данные ['F'] * данные ['E'] * данные ['C'] / данные ['D']). Tolist (), x ** 2) ] == данные ['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».

0 голосов
/ 24 января 2019

Посмотрите в документации много примеров: 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
...