如何生成只包含1和0的14x10矩阵的所有可能组合
我正在解决一个问题,其中一个解决方案需要生成所有可能的由1和0组成的14x10矩阵...我该如何生成这些矩阵,以便可以将每个可能的14x10矩阵输入到另一个函数中呢?谢谢!
补充说明:看起来我没有把我的问题表述清楚,抱歉。我想做的是优化10个不同生产单元的输出(考虑到不同的速度和停机时间)以应对几种情况。我的目标是安排停机时间块,以最小化每天的生产差异。每个单元的停机时间和频率是固定的。我目前正在评估一个为期三周的周期,这意味着每三周每个生产单元会停机一定的小时数。我希望计算机根据限制条件来确定停机的顺序,条件是每三周只停机一次,并且每天的生产差异尽可能小。我最初的想法是使用Excel(如上所述),但没有成功(这也不奇怪)...在这里,1代表运行,0代表关闭,当这些值相加时可以计算出生产量。计算出的生产量会从设定的最大日生产量中减去。然后,这些差异会在周一到周二、周二到周三等的三周时间框架内进行比较,并使用求解器进行最小化。我的下一个想法是写一个Matlab代码,输入是一个容差(允许的日常变化范围)。有没有现成的程序可以做到这一点,或者有什么简单的方法?看起来似乎很简单,但我仍在考虑不同的解决方案。任何建议都将非常感谢。
11 个回答
生成一个 14*10
的所有可能的 1 和 0 的矩阵,会产生 2**140
个矩阵。我觉得你可能没有足够的时间来完成这个任务。我不知道在你完成之前,太阳是否还会照耀。这就是为什么生成所有这些矩阵是不可能的。你需要寻找其他的解决方案,这看起来像是蛮力破解。
实际的实现方式很大程度上取决于你想怎么表示矩阵……不过假设这个矩阵可以用一个包含140个元素的列表来表示,也就是14行10列:
from itertools import product
for matrix in product([0, 1], repeat=140):
# ... do stuff with the matrix ...
当然,正如其他人提到的,这可能不是你真正想要的……但是如果这确实是你想要的,那这段代码(根据你的需求)就是最好的选择。
这真是太不可思议了!可能的矩阵数量是2140,大约是1.4e42。不过,考虑以下几点……
- 如果你随机生成两个14行10列的矩阵,它们相同的几率是1比1.4e42。
- 如果你生成10亿个独特的14行10列的矩阵,那么下一个生成的矩阵和其中一个相同的几率依然非常小:1比1.4e33。
- MATLAB中的默认随机数流使用的是一种叫做梅森旋转算法,它的周期是219936-1。因此,这个随机数生成器在这个时代内不会开始重复。
所以你可以这样做:
- 找一台没人想再用的电脑。
- 给它尽可能多的存储空间来保存你的结果。
- 在上面安装MATLAB,然后启动它。
开始随机计算矩阵,像这样:
while true newMatrix = randi([0 1],14,10); %# Process the matrix and output your results to disk end
- 然后走开。
由于组合实在太多了,你不需要把newMatrix
和之前的任何矩阵进行比较,因为重复出现的时间间隔是天文数字般的长。你的处理更可能因为其他原因先停止,比如(按可能性排序):
- 你没有足够的磁盘空间来存储结果。
- 停电了。
- 你的电脑出现致命的硬件故障。
- 你去世了。
- 地球消亡了。
- 宇宙慢慢经历热寂灭亡。
注意:虽然我在上面的回答中加入了一些幽默,但我认为我展示了一种有用的替代方案。如果你只是想从可能的组合中抽样一个小的子集(即使是10亿个也可以被认为是“少”的,因为组合数量实在太庞大),那么你不需要花额外的时间和内存去保存所有已经处理过的矩阵,并将新的矩阵与它们进行比较,以确保不重复。由于重复组合的几率非常低,你可以安全地这样做:
for iLoop = 1:whateverBigNumberYouWant
newMatrix = randi([0 1],14,10); %# Generate a new matrix
%# Process the matrix and save your results
end