Ограничения смешанного целочисленного программирования в CVXPY - PullRequest
0 голосов
/ 06 мая 2020

Где: V: 3x3 Matrix констант комплексных чисел
V: скалярная константа комплексных чисел
Проблема состоит в том, чтобы найти boolean матрицу X, которая
Свернуть Residules=cp.norm(cp.sum(cp.multiply(Vc,S))-V)

Работает следующий код:

import numpy as np

import cvxpy as cp 



V= np.random.random(3)*10 + np.random.random(3)*10 * 1j
C=3+4j
X=cp.Variable((3,3), boolean=True)

Residules=cp.norm(cp.sum(cp.multiply(Vc,S))-V)
Objective= cp.Minimize(Residules)





Const1=cp.sum(X,0)<=1

Prob1= cp.Problem(Objective)



Prob1.solve() 
X=np.array(X.value)  
print(np.round(X))
print(Prob1.value)

Результат:

[[ 1.  0.  0.]
 [ 1. -0. -0.]
 [-0.  1. -0.]]
1.39538277332097

Мой вопрос: я хочу наложить ограничение на проблему, чтобы для каждого столбца в Matrix X только один элемент может быть равен 1, а остальные должны быть нулями. Так что в каждом столбце есть максимум один элемент со значением 1. Я пробовал:

Const1=cp.sum(X,0)<=1
Prob1= cp.Problem(Objective,[Const1])
Prob1.solve() 

Произошла следующая ошибка:

File "path \ Anaconda3 \ lib \ site-packages \ cvxpy \ reductions \ complex2real \ complex2real.py ", строка 95, invert dvars [vid] = solution.dual_vars [cid]

KeyError: 11196
Любой другой способ установить это ограничение ??

1 Ответ

0 голосов
/ 08 мая 2020

Я отделил complex от real. Думаю, работает.

import numpy as np
import cvxpy as cp


Vr= np.random.random((3,3))
Vi=np.random.random((3,3))
Cr=3
Ci=4

X=cp.Variable((3,3),boolean=True)



Real=cp.sum(cp.multiply(Vr,X))-Cr
Imag=cp.sum(cp.multiply(Vi,X))-Ci


Residules=cp.norm(cp.hstack([Real, Imag]), 2)
Objective= cp.Minimize(Residules)




const1=[cp.sum(X,axis = 0)<=1]


Prob1= cp.Problem(Objective,const1)



Prob1.solve() 
X=np.array(X.value)  
print(np.round(X))
print(Prob1.value)
...