我可以使用cvxpy将integer-2D-array拆分为两个数组吗?

我可以使用cvxpy将integer-2D-array拆分为两个数组吗?,cvxpy,Cvxpy,我有一个问题,我想知道是否可以使用cvxpy解决: 问题: 我有一个二维整数数组,我想把它拆分成两个数组,这样源数组的每一行要么在第一个数组中,要么在第二个数组中 这些数组的要求是,对于每一列,数组#1中的整数之和将尽可能接近数组#2中整数之和的两倍 示例: 考虑输入数组: [ [1, 2, 3, 4], [4, 6, 2, 5], [3, 9, 1, 2], [8, 1, 0, 9], [8, 4, 0, 5], [9, 8, 0, 4] ] 其列的和是[33,30,6,29],因此理想情况

我有一个问题,我想知道是否可以使用cvxpy解决:

问题: 我有一个二维整数数组,我想把它拆分成两个数组,这样源数组的每一行要么在第一个数组中,要么在第二个数组中

这些数组的要求是,对于每一列,数组#1中的整数之和将尽可能接近数组#2中整数之和的两倍

示例: 考虑输入数组:

[
[1, 2, 3, 4],
[4, 6, 2, 5],
[3, 9, 1, 2],
[8, 1, 0, 9],
[8, 4, 0, 5],
[9, 8, 0, 4]
]
其列的和是
[33,30,6,29]
,因此理想情况下,我们正在寻找两个列和为:

  • 数组#1:
    [22,20,4,19]
  • 数组#2:
    [11,10,2,10]
当然,这并不总是可能的,但我正在寻找这个问题的最佳解决方案

此特定示例的可能解决方案可能是:

  • 数组#1:
带列和:
[22,20,5,18]

  • 数组#2:
带列和:
[11,10,1,11]


有什么建议吗?

您可以使用布尔向量变量来选择行。唯一要决定的是对错误的惩罚程度。在这个例子中,我只使用了差分向量的范数

import cvxpy as cp
import numpy as np
data = np.array([
  [1, 2, 3, 4],
  [4, 6, 2, 5],
  [3, 9, 1, 2],
  [8, 1, 0, 9],
  [8, 4, 0, 5],
  [9, 8, 0, 4]
])
x = cp.Variable(data.shape[0], boolean=True)
prob = cp.Problem(cp.Minimize(cp.norm((x - 2 * (1 - x)) * data)))
prob.solve()
A = np.round(x.value) @ data
B = np.round(1 - x.value) @ data
A
B
是行的总和

(array([21., 20.,  4., 19.]), array([12., 10.,  2., 10.]))

非常感谢你的回答。有没有可能向一个不会“说”特定数学语言的人解释你的解决方案?我知道,
data
保存了我的初始数组,
x
是一个布尔数组,它的值将表示所选行,但我不明白的是:1)cp.norm((x-2*(1-x))*data的含义是什么。我在cvxpy.norm上查找了文档,但没有找到任何内容2)问题解决后,
x.value
中的实际值的含义是什么
m=x*数据
对第一组向量求和<代码>n=(1-x)*数据对第二组向量求和。我想要m=2*n,但这可能不可能,所以我计算
m-2*n
。然后取范数,即向量平方和的平方比。越接近于零,解决方案就越“好”。2.x、 value是为第一组向量选择值的布尔数组。然后,要获得第二组,您只需执行
1-x.value
:)我希望这会有所帮助。
import cvxpy as cp
import numpy as np
data = np.array([
  [1, 2, 3, 4],
  [4, 6, 2, 5],
  [3, 9, 1, 2],
  [8, 1, 0, 9],
  [8, 4, 0, 5],
  [9, 8, 0, 4]
])
x = cp.Variable(data.shape[0], boolean=True)
prob = cp.Problem(cp.Minimize(cp.norm((x - 2 * (1 - x)) * data)))
prob.solve()
A = np.round(x.value) @ data
B = np.round(1 - x.value) @ data
(array([21., 20.,  4., 19.]), array([12., 10.,  2., 10.]))