在python3中使用CVXPY进行整数线性编程

时间:2019-05-16 16:01:11

标签: python-3.x optimization cvxpy

我正在尝试使用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。

但是,如果我运行编写的这段代码,我将得到一个浮点值作为答案,因此我做错了我无法弄清的错误。我猜我不知道该如何以编程方式表达这个问题,以便求解器能够解决它。任何帮助将不胜感激。谢谢。

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重载了该运算符,我认为它可以执行矢量乘法。