Экономьте память, пока просматриваете большой список - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь перебрать х! перестановки и у меня заканчивается память после 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, но если вы найдете способ сделать это быстрее, это было бы здорово!

1 Ответ

0 голосов
/ 03 ноября 2018

Не уверен, почему у вас заканчивается память. На моей машине работает 10 шариков; Кроме того, количество перестановок может занять слишком много времени, если не произойдет утечка памяти, которую вы можете посмотреть с помощью модуля gc.

Вы можете улучшить функцию test_your_might, используя алгоритм генератора перестановок Джонсона-Троттера (доступный в Python), который циклически переставляет перестановки, обмениваясь только 2 записями одновременно, тем самым сокращая цикл через все шарики для обработки только 2 записей.

...