我正在尝试使用CVXPY解决整数线性编程问题,但在某种语法上苦苦挣扎,无法找到一种方法来强制执行我感兴趣的变量以求取值约束的方式。要么是0,要么是1。我认为将其设置为布尔值是Variable对象中的解决方案,但是由于某种原因,我没有得到想要的东西
我安装了cvxpy库,并尝试使用一个小示例来运行它来解决它。我的问题的输入是大小为(I,J)的二进制矩阵M,其值只有(0或1), 我还要解决的变量是大小为J的布尔值(或再次为二进制向量)向量P,
目标函数是最小化我的大小为J的变量向量的值的总和(即,最小化该向量中1的数量)
使得矩阵的每一行的总和M乘以变量Vector P等于或大于1。 即,对于所有i,Mij * Pj> = 1的求和(超过j)。
目的是使向量P的总和最小化。
我编写了以下代码来做到这一点,但是我一直在努力寻找自己做错了什么。
import numpy as np
import cvxpy as cp
M = np.array([[1,0,0,0], [1,0,0,0], [0,1,1,0], [1,0,0,0], [0,0,1,1], [0,0,1,0]])
variable= cp.Variable(M.shape[1], value = 1, boolean=True)
one_vec = np.ones(M.shape[1])
obj = cp.Minimize(sum(np.dot(variable, one_vec)))
constraints = []
for i in range(len(M)):
constraints.append(np.sum(np.dot(M[i], variable)) >= 1)
problem = cp.Problem(obj, constraints=constraints)
problem.solve()
作为我代码中矩阵M给出的这个简单示例的答案,答案应该是使得变量矢量的值应为[1、0、1、0],因为矢量要乘以[1、0, 1,0]与矩阵
[[1、0、0、0]
[1、0、0、0]
[0,1,1,0]
[1、0、0、0]
[0,0,1,1]
[0,0,1,0] ]
每行的值至少为1。
但是,如果我运行编写的这段代码,我将得到一个浮点值作为答案,因此我做错了我无法弄清的错误。我猜我不知道该如何以编程方式表达这个问题,以便求解器能够解决它。任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
更新!我想我明白了
我将代码修改为此:
import numpy as np
import cvxpy as cp
M = np.array([[1,0,0,1], [1,0,0,1], [0,1,1,1], [1,0,0,1], [0,0,1,1], [0,0,1,1]])
selection = cp.Variable(M.shape[1], boolean = True)
ones_vec = np.ones(M.shape[1])
constraints = []
for i in range(len(M)):
constraints.append(M[i] * selection >= 1)
total_genomes = ones_vec * selection
problem = cp.Problem(cp.Minimize(total_genomes), constraints)
problem.solve()
,现在可以正常工作了。我使用*运算符而不是numpy点积,cvxpy重载了该运算符,我认为它可以执行矢量乘法。