Python 存储器和发生器

Python 存储器和发生器,python,out-of-memory,generator,Python,Out Of Memory,Generator,我试图创造一种方法来解决一个3x4桌子缺少4个角的问题。目标是创建一个算法,用1~8之间的数字填充该表,其中这些数字都不能靠近其先前数字的单元格1个块,例如:2不能接近1,无论是在垂直、水平还是对角方向 由于我是编程新手,我可能做得不对,我正在生成一个列表,列出所有可能的数字在单元格中的位置。但对于3x4-4网格,从[1,2,3,4,5,6,7,8]到[8,7,6,5,4,3,2,1]大约有8^8种可能的情况 我这样做是因为我的第一个想法是制作一个函数来测试数据是否符合标准,而不需要每次都生成数

我试图创造一种方法来解决一个3x4桌子缺少4个角的问题。目标是创建一个算法,用1~8之间的数字填充该表,其中这些数字都不能靠近其先前数字的单元格1个块,例如:2不能接近1,无论是在垂直、水平还是对角方向

由于我是编程新手,我可能做得不对,我正在生成一个列表,列出所有可能的数字在单元格中的位置。但对于3x4-4网格,从[1,2,3,4,5,6,7,8]到[8,7,6,5,4,3,2,1]大约有8^8种可能的情况

我这样做是因为我的第一个想法是制作一个函数来测试数据是否符合标准,而不需要每次都生成数字。我正在使用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))

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

在python中,7和12的计算结果为12,而7、12和9的计算结果为9。 这并不意味着将不平等性应用于所有这些。 因此,你得到了相当于 如果是h和b!=h和。。。 有相当多的组合,其中h是唯一的,其他组合可以是他们想要的任何组合。您将所有这些添加到probs中,这将占用大量内存


第二个问题是,据我所知,你实际上没有检查挑战的规则。您不希望将可能性存储在1正好挨着2的位置,因为即使完成了唯一性检查,您仍然有8个!组合。

我无法直接回答您的问题,但最近我偶然发现了一个关于使用python解决数独问题的非常全面的网页:
对我来说,你的问题似乎有相似之处、网格、不重复的一位数、位置规则、约束传播等等。。。祝你好运

你可能想看看ItraveToT来生成你的特定组合,你应该认真考虑你用9x9x9x9x9x9xx9元素创建一个数组,这些元素是8个数字的数组。太大了。我来看看itertools。从未使用过此模块。itertools.permutations将为您提供比Product更多的功能。感谢您的回复。我意识到了这一点,我的第一个想法是创建数据,然后只选择一个或一个符合规则的,这是因为对我来说,很难预见未来。我来看看这个测试,我甚至看不到结果,因为它给了我内存错误,如果你有任何疑问的话,你只需输入一下,就可以知道python解释器是如何理解小狙击手的。一旦你开始优化它,你将需要使用一对for循环,但是现在你可能会发现测试a在[b,c,d,e,f,g,h]中没有帮助。这将创建一个包含后面变量的值的列表,然后确认前面的值不会出现。注意,如果a不是b,b也不是a。因此,您只需检查b是否在[c..h]中,因为a已经被排除。因此,我对代码做了一些更改,仍然没有弄清楚itertools是如何工作的,只需将If语句从For循环末尾的一个大块更改为每个For循环中的一个。我设法将计算时间从1分钟减少到不到3秒!我在所有语句的末尾做了一个函数,得到了答案!非常感谢。