我正在尝试遍历x!排列,而10点后我的内存不足!排列
这是代码,请帮助我清除内存
def test_your_might(NUMBER_OF_MARBLES, marbles):
angle = 360 / NUMBER_OF_MARBLES
angles = [angle * n for n in range(1, NUMBER_OF_MARBLES + 1)]
Fx = []
Fy = []
for n in range(0, NUMBER_OF_MARBLES):
angle = radians(angles[n])
Fx.append(cos(angle) * marbles[n])
Fy.append(sin(angle) * marbles[n])
return sqrt(pow(sum(Fx), 2) + pow(sum(Fy), 2))
def brute_force_solution(NUMBER_OF_MARBLES):
possibilities = permutations((_ for _ in range(1, NUMBER_OF_MARBLES + 1)))
best_solution = None
for possibility in possibilities:
solution = test_your_might(NUMBER_OF_MARBLES, possibility)
if best_solution is None or solution < best_solution[1]:
best_solution = (str(possibility), solution)
return best_solution
游戏的目的是在圆形板上平衡大理石。每个大理石的重量为n个单位。大理石1重1,2重2,依此类推。
我不认为问题出在我的test_your_might方法上,但是如果您找到一种使其更快的方法,那就太好了!
答案 0 :(得分:0)
不知道为什么内存不足。我的机器上可以放10个弹珠;除此之外,除非存在内存泄漏,否则排列数量可能会花费太长时间,您可以使用Module gc查看。
您可以使用Johnson-Trotter排列生成器算法(Python中提供)来改进功能test_your_might,该算法一次仅交换2个条目即可循环排列排列,从而减少了遍历所有大理石的循环,仅处理2个条目。