MemoryError和生成器

时间:2013-12-15 09:05:22

标签: python out-of-memory generator

我正在尝试创建一种解决问题的方法,其中有一个3x4表,缺少4个角。目标是创建一个算法,用1到8的数字填充该表,其中这些数字都不能是靠近它前一个数字的单元格的1个块(例如:2不能接近1),两者都是垂直的,水平和对角线。

由于我是编程的新手,我可能做错了,我正在生成一个列表,列出了单元格中所有可能的数字位置。但是对于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))

2 个答案:

答案 0 :(得分:1)

正如评论所暗示的,有更有效的内置方法来进行排列,但第一个大错误是你的唯一性检查。

在python中,(7 and 12)只评估为12,而(7 and 12 and 9)评估为9。 它并不意味着“将不平等应用于所有这些”。 因此,你得到相当于 如果a!= h和b!= h并且...... 有很多组合,其中h是唯一的,其他组合可以是他们想要的任何东西。你将所有这些添加到probs中,并且使用了大量的内存。

第二个问题是,据我所知,你实际上并没有检查挑战的规则。你不想存储1在2旁边的可能性,因为即使排除了唯一性检查,你仍然有8个!组合

答案 1 :(得分:0)

我无法直接回答你的问题,但我最近偶然发现了一个非常全面的使用python解决sudokus的网页:http://norvig.com/sudoku.html 你的问题,对我来说似乎有相似之处,网格,不重复的单个数字#,#position,Constraint Propagation等规则......祝你好运!