我正在研究一个问题,一个解决方案需要每个14x10矩阵的输入,这可能由1和0组成......我如何生成这些以便我可以将每个可能的14x10矩阵输入到另一个功能?谢谢!
3月21日补充:看起来我没有恰当地说出我的帖子。抱歉。我想要做的是针对几种情况优化10种不同生产单元的输出(给定不同的速度和停机时间)。我的目标是放置一系列停机时间,以最大限度地减少日常生产中的差异。给出了每个单元允许的停机时间和频率。我目前正在尝试评估一个为期三周的周期,这意味着每三周就会将每个生产单元拆除一段时间。我要求计算机根据线条每3周只下降一次的约束来确定单位的下订单,并且每日生产的差异是最小的。我的第一种方法是使用Excel(我试图在上面描述)并且它不起作用(在那里并不令人惊讶)......其中1-运行,0-关闭以及何时将它们相加以计算生产。从设定的最大日产量中减去计算的产量。然后,将这些差异从Mon-Tues,Tues-Wed等进行比较,持续三周的时间范围,并使用求解器最小化。我的下一个方法是编写一个Matlab代码,其中输入是容差(每天允许设置变化)。有没有一个程序已经做到这一点或一个方法来做到这一点最简单?这似乎很简单,但我仍然在考虑不同的方法来解决这个问题。任何见解都会非常感激。
答案 0 :(得分:6)
生成14*10
的每个可能的1和0矩阵将生成2**140
个矩阵。我不相信你会有足够的寿命。我不知道,如果太阳在你完成之前仍然会发光。这就是为什么不可能生成所有这些矩阵的原因。你必须寻找其他解决方案,这看起来像是一股蛮力。
答案 1 :(得分:6)
这绝对不可能!可能的基质数量为2 140 ,约为1.4e42。但是,请考虑以下内容......
你的方法应该如此:
随机开始计算矩阵,如下所示:
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
答案 2 :(得分:6)
实际实现在很大程度上取决于您希望如何表示矩阵...但假设矩阵可以用14 * 10 = 140元素列表表示:
from itertools import product
for matrix in product([0, 1], repeat=140):
# ... do stuff with the matrix ...
当然,正如其他海报所指出的那样,这可能不是你想做的......但如果它真的是你想要做的,那就是最好的代码(根据你的要求)去做。
答案 3 :(得分:4)
你确定你想要每个可能的14x10矩阵吗?每个矩阵中有140个元素,每个元素可以打开或关闭。因此,有2^140
个可能的矩阵。我建议你重新考虑一下你真正想要的东西。
编辑:我注意到你在评论中提到你试图最小化某些东西。有一个名为optimization的完整数学领域致力于做这类事情。这个领域存在的原因是因为很多时候不可能在一段合理的时间内详尽地检查每个解决方案。
答案 4 :(得分:3)
试试这个:
import numpy
for i in xrange(int(1e9)): a = numpy.random.random_integers(0,1,(14,10))
(这比你需要的要多得多)应该足以让你相信这是不可行的。它还向您展示了如何计算一个或几个这样的随机矩阵,即使高达一百万也相当快。)
编辑:更改为xrange以“提高速度和内存要求”:)
答案 5 :(得分: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))
答案 6 :(得分: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)
您可以多次执行此操作,以查看结果在模拟中的变化情况。当然,您也可以修改代码以确保样本集中没有重复,同样取决于您要完成的任务。
答案 7 :(得分:0)
你是说你有一个包含140个单元格的表,每个值可以是1或0,你想生成所有可能的输出吗?如果是这样,你将有2 ^ 140种可能的组合......这是一个相当大的数字。
答案 8 :(得分:0)
我建议考虑采用一种方案来对所有可能组合的重要子集进行采样,而不是采用强力方法,而不仅仅是建议这是不可行的。正如您的回复建议,您正在做最小化。有这样的数值技术,如模拟退火,蒙特卡罗采样以及传统的最小化算法。您可能想要查看一个是否适合您的情况。
答案 9 :(得分: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个月继续增加一倍,并且您目前可以每秒进行十亿次组合(乐观,但为了争论)并且从今天开始,您的计算将在4月左右完成2937 2137。
答案 10 :(得分:0)
这是一个有效的方法来开始使用Matlab:
首先生成1024个可能的长度为10的行,其中只包含0和1:
dec2bin(0:2^10-1)
现在您拥有所有可能的行,您可以根据需要从中进行采样。例如,通过几次调用以下行:
randperm(1024,14)