2011-03-18 122 views
1

我正在处理一个问题,一个解决方案需要输入每个14x10矩阵,可能由1和0组成......我如何生成这些以便我可以将每个可能的14x10矩阵输入到另一个函数中?谢谢!如何生成包含1和0的14x10矩阵的所有可能组合

添加3月21日:它看起来像我没有适当地说我的帖子。抱歉。我想要做的是在几种情况下优化10个不同生产单位的产量(给定不同的速度和停机时间)。我的目标是放置大量停机时间,以最大限度地减少日常生产中的差异。给出每个单位允许的停机时间和频率。我目前正试图评估一个三周的周期,意思是每三个星期每个生产单位被关闭一段给定的时间。我要求计算机根据线路每3周仅下降一次,日常生产差异尽可能小的限制来确定单元的下单顺序。我的第一个方法是使用Excel(正如我试图描述的那样),它不起作用(在那里没有惊喜)......其中1-运行,0-关闭,以及当它们被累加以计算产量时。计算的产量从设定的最大日产量中减去。然后,将这些差异从周一到周二,周二到周三等进行比较,为期三周的时间框架,并使用求解器进行最小化。我的下一个方法是编写一个Matlab代码,其中输入是一个宽容(每日设置允许的变化)。有没有一个程序已经做到了这一点,或者一个方法来做到这一点最简单?这似乎很简单,但我仍然在思考通过不同的方式去做这件事。任何有识之士将不胜感激。

+5

当然,您意识到有2 ** 140个这样的矩阵(大约1.4e42)? – 2011-03-18 19:58:13

+0

生成2^140矩阵是不可能的,它需要比宇宙的年龄还要多。 – 2011-03-18 20:00:00

+0

什么是上下文?也许有一种方法可以计算(单个)随机二进制矩阵吗? – Benjamin 2011-03-18 20:00:12

回答

6

生成14*10的每个可能的1和0的矩阵将生成2**140矩阵。我不相信你会有足够的生命。我不知道,如果在完成之前太阳依然会发光。这就是为什么不可能生成所有这些矩阵。你必须寻找其他解决方案,这看起来像一个蛮力。

+1

这是一条评论,而不是答案。 – 2011-03-18 20:54:11

+1

这是真的,我编辑了我的答案。 – gruszczy 2011-03-18 21:05:44

4

你是肯定你想要每一个可能的14x10矩阵?每个矩阵中有140个元素,每个元素可以打开或关闭。因此有可能的矩阵2^140。我建议你重新考虑你真正想要的。

编辑:我注意到你在评论中提到你正试图最小化一些东西。有一个完整的数学领域,称为optimization致力于做这种类型的事情。这个领域存在的原因是因为通常不可能以类似于合理的时间量的任何方式详尽地检查每个解决方案。

0

你是说你有一个有140个单元格的表格,每个值可以是1或0,你想生成每个可能的输出?如果是这样,你会有2^140个可能的组合......这是一个相当大的数字。

+0

是的......我试图最小化一些需要将10x14表格中的每个单元格更改为1或0的东西。 – Tiffany 2011-03-18 20:01:12

+0

@Tiffany:“将10x14表格中的每个单元格更改为1或0”是不一样的生成每个可能的10x14矩阵的东西。你真的需要解释更多关于你的问题。 – 2011-03-18 20:04:02

+0

你原来的问题是什么?是否有一些现实世界的问题需要解决? – 2011-03-18 20:29:13

5

这是绝对不可能的!可能的矩阵数量为2 ,大约为1.4e42。但是,请考虑以下内容...

  • 如果要随机生成两个14×10的矩阵,它们相同的几率在1.4e42中为1。
  • 如果您要生成10亿个独特的14×10矩阵,那么您生成的下一个矩阵的可能性与其中一个矩阵的可能性仍然很小:1.4e33中的1。
  • default random number stream in MATLAB使用的算法的周期为2 -1。因此,随机数发生器在任何时候都不应该开始重复自己。

你的方法应该是这样的:

  • 发现没有人想要再次使用电脑。
  • 给它尽可能多的存储空间来保存结果。
  • 安装MATLAB并启动它。
  • 开始计算矩阵随意,像这样:

    while true 
        newMatrix = randi([0 1],14,10); 
        %# Process the matrix and output your results to disk 
    end 
    
  • 走开

既然有这么多的组合,你不必与任何自先前的矩阵比较newMatrix重复之前可能发生的时间长度是天文数字。由于其他原因,您的处理更可能首先停止,例如(按照可能发生的顺序):

  • 您的磁盘空间不足以存储结果。
  • 发生停电。
  • 您的计算机遭受致命硬件故障。
  • 你过世了。
  • 地球过世了。
  • 宇宙死亡缓慢heat death

注:虽然我注入了一些幽默到上面的回答,我想我已经说明了一个有用的选择。如果你只是想抽取一个小的子集的可能组合(甚至10亿由于组合的数量可能被认为“小”),那么你不必经过额外的时间和记忆 - 需要保存已经处理过的所有矩阵并将新的矩阵与它进行比较以确保不会重复矩阵。由于重复组合的几率是如此之低,你可以安全地做到这一点:

for iLoop = 1:whateverBigNumberYouWant 
    newMatrix = randi([0 1],14,10); %# Generate a new matrix 
    %# Process the matrix and save your results 
end 
+1

有没有快速死亡这样的事情? :) – 2011-03-19 01:17:17

6

实际的实现在很大程度上取决于你要如何表示矩阵......不过,假设矩阵可以通过一个14×10表示= 140元素列表:

from itertools import product 
for matrix in product([0, 1], repeat=140): 
    # ... do stuff with the matrix ... 

当然,正如其他海报指出,这可能不是你想要做什么......但如果真的是你想要做什么,这是最好的代码(假设你的要求) 去做吧。

+0

@David:???,你是什么意思? – eat 2011-03-18 20:08:06

+0

对不起,我不确定什么不清楚。一种用于表示矩阵的方法是列表(例如,矩阵中的元素“(x,y)”对应于列表中的元素“x * width + y”),并且所呈现的代码将生成每140个元素列表所以每个14x10矩阵)其中每个元素是“0”或“1”。 – 2011-03-18 20:18:21

+2

仍然完全不现实,但我很高兴有人终于发布了答案。 – 2011-03-18 20:22:16

0

我不会建议这是不可行的,我会建议考虑一个方案,对所有可能的组合的重要子集进行抽样,而不是应用暴力方法。正如你的回复之一,你正在做最小化。有数字技术可以做到这一点,例如模拟退火,蒙特卡罗采样以及传统的最小化算法。你可能想看看是否适合你的情况。

+0

我'同意'你的回答,但显然OP应该提供更多的细节,否则OP的问题只不过是个玩笑而已。谢谢 – eat 2011-03-18 20:16:34

3

尝试这样的:

import numpy 
for i in xrange(int(1e9)): a = numpy.random.random_integers(0,1,(14,10)) 

(这是很多很多,比你需要什么小得多)应该足以说服你,这是不可行的。它还会告诉你如何计算一个或几个这样的随机矩阵,甚至高达一百万的速度非常快)。

编辑:改为XRANGE以“提高速度和内存要求” :)

+0

这里最好使用'xrange(int(1e9))';在Py2中,'range(int(1e9))'将预先分配一个数十亿个元素的列表,这将是不必要的 2011-03-18 20:23:26

1

您不必遍历此:

def everyPossibleMatrix(x,y): 
    N=x*y 
    for i in range(2**N): 
     b="{:0{}b}".format(i,N) 
     yield '\n'.join(b[j*x:(j+1)*x] for j in range(y)) 
+0

所以...两个循环如何不迭代? – 2011-03-18 20:22:42

+0

+1对于使用新的'string.format'选项非常棒......但是在Py2中 ,范围将预先分配给定大小的列表,这将快速耗尽您的内存。 'xrange'会更好,因为它会返回一个迭代器。当然,在Py3中这不是一个问题... 2011-03-18 20:31:48

0

我其实更悲观,首先,但考虑:

from math import log, e 

def timeInYears(totalOpsNeeded=2**140, currentOpsPerSecond=10**9, doublingPeriodInYears=1.5): 
    secondsPerYear = 365.25 * 24 * 60 * 60 
    doublingPeriodInSeconds = doublingPeriodInYears * secondsPerYear 
    k = log(2,e)/doublingPeriodInSeconds # time-proportionality constant 
    timeInSeconds = log(1 + k*totalOpsNeeded/currentOpsPerSecond, e)/k 
    return timeInSeconds/secondsPerYear 

如果我们假设计算机处理能力的不断每18个月翻一番,你可以做目前每秒(乐观十亿组合,但清酒Ø f参数),并且从今天开始,计算将在2137年4月29日左右完成。

+0

当然,现在你必须弄清楚如何存储它。它应该大约需要24个十亿字节来存放所有的矩阵:) – 2011-03-18 22:19:01

1

根据您希望使用生成的矩阵完成的任务,最好生成一个随机样本并运行一些模拟。例如:

matrix_samples = [] 
# generate 10 matrices 
for i in range(10): 
    sample = numpy.random.binomial(1, .5, 14*10) 
    sample.shape = (14, 10) 
    matrix_samples.append(sample) 

您可以多次执行此操作以查看不同模拟结果之间的差异。当然,您也可以修改代码以确保样本集中不存在重复,这取决于您要完成的任务。

0

这里是做上手Matlab的一种有效的方法:

首先产生长度为10的所有1024个可能的行只包含零和一:

dec2bin(0:2^10-1) 

现在你把所有可能的行,和你可以根据需要从它们中抽样。例如通过几次调用以下行:

randperm(1024,14) 
相关问题