algorithm - 二元向量的条件采样(?)

标签 algorithm random

我正在尝试为我的问题找到一个名称,这样我就不必在编写解决问题的算法时重新发明轮子...

我已经说了 2,000 个二进制(行)向量,我需要从中选择 500 个。在选择的样本中,我进行列总和,我希望我的样本尽可能接近列总和的预定义分布。我将使用 20 到 60 列。

一个小例子:

向量之外:

110
010
011
110
100

我需要选择 2 以获得列总和 2, 1, 0。解决方案(在这种情况下是正确的)是

110
100

到目前为止我的想法

  • 也许可以将其称为二进制多维背包,但我没有找到任何算法
  • 线性规划可以提供帮助,但我需要一些逐步的解释,因为我没有这方面的经验
  • 由于精确解并不总是可行的,模拟退火蛮力之类的方法可以很好地工作
  • 想到了一种使用约束求解器的怪异方法 - 首先严格设置约束并逐渐放松它们,直到找到某种解决方案 - 考虑到 CSP 应该比 ILP 快得多...?<

最佳答案

我的具体、实用(如果近似保证对你有效)建议是应用最大熵方法(在 Boyd 和 Vandenberghe 的书 Convex Optimization 的第 7 章中;你可能会找到几个使用您最喜欢的搜索引擎实现)以找到行索引上的最大熵概率分布,使得 (1) 没有行索引更有可能超过 1/500 (2) 所选行向量的预期值是预定义的 1/500分配。给定此分布,独立选择每一行的概率是其分布可能性的 500 倍,这将平均为您提供 500 行。如果您需要恰好 500,请重复直到恰好达到 500(由于浓度限制,不应尝试太多次)。

关于algorithm - 二元向量的条件采样(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57477865/

相关文章:

javascript - 更改 javascript 属性给出修改规则

arrays - 多数组的笛卡尔积

使用C将字符串常量转换为数值

c++ - 在不重新洗牌的情况下随机选择 std::vector 的所有元素一次的有效方法

Javascript:使用 crypto.getRandomValues 生成一个范围内的随机数

algorithm - 我应该如何过滤这些数据?

python - 合并甚至有一个共同元素的集合

python - 随机数列表生成器未按预期工作(Python)

c++ - 随机但可预测的数字生成器? [C++]

python - 从列表中删除随机项目