Проблема оптимизации CVXPY. DCPError: проблема не соответствует правилам DCP

#python #matrix #optimization #cvxpy

#python #матрица #оптимизация #cvxpy

Вопрос:

введите описание изображения здесь У нас очень хорошо установлены ограничения, и теперь мы рассматриваем целевую функцию проблемы предпочтения партнера прямо сейчас. Мы можем построить симметричную матрицу 20×20 от работника к работнику, каждый элемент которой представляет собой совокупный результат между двумя работниками. однако матрица не является положительно полуопределенной, и мы не можем продвигаться дальше. Мы используем cvxpy пакет python. Пожалуйста, помогите!

Фрагмент кода для уточнения:

 part_pref = pd.read_excel('Preferred Partners Updated.xlsx')
part_pref_np = np.array(part_pref)[:,1:21] # 20x20 symmetric matrix with partner preference

y = cp.Variable((20, 4), integer = True)

objective = cp.Maximize(-cp.sum(y.T @ part_pref_np @ y))

constraints = [y >= 0,
               y <= 1,
               cp.sum(y, axis = 1) == 1,
               cp.sum(y, axis = 0) >= b,
               cp.sum(y, axis = 0) <= c,
               (skill_np-d).T @ y >= e,
               cp.multiply((skill_np[:,2]-4),y[:,0]) >= 0,  
               cp.multiply((skill_np[:,0]-4),y[:,3]) >= 0,
               f @ x[:,0] >=1]
    
problem = cp.Problem(objective, constraints)
problem.solve()

 

выдает ошибку

DCPError: проблема не соответствует правилам DCP.

Ответ №1:

Я подозреваю, что проблема в

 cp.Maximize(-cp.sum(y.T @ part_pref_np @ y))
 

Можете ли вы попробовать с

 cp.Maximize(0)
 

и посмотрите, что произойдет. Я ожидаю, что это даст осуществимое решение.

CVXPY допускает только выпуклые квадратичные цели, и я думаю, что ваша цель не является выпуклой (зависит от данных, поэтому я не могу это проверить). Если это так, вы можете линеаризовать цель, поскольку переменные решения являются переменными 0-1. Однако сделать это в CVXPY не так просто, поскольку y уже является 2-мерной переменной (CVXPY поддерживает только 0, 1 и 2-мерные переменные).

Я не совсем уверен, почему вы используете здесь квадратичную цель. Может быть, вы можете подумать о линейном.