2013-12-15 93 views
0

我試圖創建一種解決問題的方法,其中缺少4個角的3x4表。目標是創建一個算法來填充表格,數字從1到8,其中這兩個數字都不能接近它之前數字的一個單元格(例如:2不能接近1)的一個塊,都在垂直,水平和對角線。MemoryError和生成器

由於我是新手編程,我可能會做錯誤的方式,我將生成單元格中所有可能的數字位置列表。但對於3x4-4網格,大約有8^8個可能的情況(從[1,2,3,4,5,6,7,8]到[8,7,6,5,4,3,2, 1])

我這樣做是因爲我的第一個想法是做一個函數來測試數據,如果它匹配之後的標準,不需要每次都生成數字。我正在使用pickle將數據轉儲到txt文件中。但該文件是280MB,它凍結了我的電腦幾分鐘,然後它打印內存錯誤。

對不起,如果這沒有意義,我已經開始編程一個星期前。

我當前的代碼來生成該列表是:

for a in xrange(1,9): 
    for b in xrange(1, 9): 
     for c in xrange(1, 9): 
      for d in xrange(1, 9): 
       for e in xrange(1, 9): 
        for f in xrange(1, 9): 
         for g in xrange(1, 9): 
          for h in xrange(1, 9): 
           if a != (b and c and d and e and f and g and h) and b != (
            a and c and d and e and f and g and h) and c != (
            b and a and d and e and f and g and h) and d != (
            b and c and a and e and f and g and h) and e != (
            b and c and d and a and f and g and h) and f != (
            b and c and d and e and a and g and h) and g != (
            b and c and d and e and f and a and h) and h != (b and c and d and e and f and g and a): 
            probs.append((a, b, c, d, e,f,g,h)) 
+0

您可能想要查看'itertools'來生成您的特定組合,而不是。 –

+0

您應該認真考慮['itertools.product'](http://docs.python.org/2/library/itertools.html#itertools.product) – thefourtheye

+0

您正在創建一個包含9x9x9x9x9x9x9x9元素的數組,並且這些元素是8個數字的數組。這是巨大的。 – Barmar

回答

1

由於意見建議,有做您置換更高效的內置方法,但第一大錯誤是你的唯一性檢查。

在python中,(7 and 12)簡單地計算爲12,而(7 and 12 and 9)計算爲9. 它並不意味着「將不等式應用於所有這些」。 因此,如果a!= h和b!= h並且... 相當於 這裏有相當多的組合,其中h是唯一的,其他可以是他們想要的任何組合。你將所有這些添加到probs,這是使用大量的內存。

第二個問題是,據我所知,你並沒有真正檢查挑戰的規則。你不想存儲1緊挨着2的可能性,因爲即使有唯一性檢查,你仍然有8!組合。

+0

感謝您的答覆。 我知道這一點,我的第一個想法是創建數據,然後只選擇那些符合規則的數據(或者一個),這是因爲對我而言,很難預見未來。我會看看測試,我甚至不能看到結果,因爲它給了我內存錯誤。 –

+0

如果您有任何疑問,可以通過輸入來了解python解釋器如何理解小片段。 一旦開始優化它,您需要使用一對for循環,但是暫時你可能會發現''(a不在[b,c,d,e,f,g,h])'幫助。 這將創建一個包含更新的變量值的列表,然後確認較早的值不會出現。 請注意,如果a不是b,b也不是。因此,您只需檢查b是否在[c .. h]中,因爲已被排除。 – Josiah

+0

所以,我改變了一些代碼,仍然沒有弄清楚itertools是如何工作的,只是通過將If語句從For循環結尾的一個大塊更改爲For循環中的一個。我設法將計算時間從1分鐘縮短到不到3秒! 而且我在所有For語句的末尾做了一個函數,並得到了答案! 非常感謝。 –

0

我不能提供一個直接回答你的問題,但是我最近遇到一個網頁是關於解決數獨遊戲與蟒蛇非常全面:http://norvig.com/sudoku.html 你的問題,我反正似乎有相似之處,網格,不重複單個數字的#,s#的規則,約束傳播等等......祝你好運!