2011-03-18 104 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) 
相關問題