Цель моего оптимизатора - вычислить новые значения для столбца 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».