#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-мерные переменные).
Я не совсем уверен, почему вы используете здесь квадратичную цель. Может быть, вы можете подумать о линейном.