Поскольку узким местом является использование ЦП, многопоточность здесь мало чем поможет, но многопроцессорность должна.Не эксперт, но недавно экспериментировал с параллелизмом, поэтому попробую поиграть и обновлю этот ответ, если я доберусь куда-нибудь.(РЕДАКТИРОВАТЬ: я попытался несколько попыток использовать многопроцессорность, но мне удалось только увеличить время выполнения!)
Возможно, вам нужно сохранить все решения, но если нет, то одна небольшая оптимизацияс точки зрения времени, но огромного с точки зрения памяти, было бы не хранить все возможные результаты и просто хранить лучший результат, чтобы вы не создавали другой очень длинный массив без необходимости.В идеале вы могли бы рассчитать количество решений напрямую, поскольку оно зависит только от NUMBER_OF_MARBLES
, но включило его в функцию для обеспечения согласованности.
def brute_force_solution(NUMBER_OF_MARBLES):
possibilities = permutations([x for x in range(1, NUMBER_OF_MARBLES + 1)])
# count the number of solutions
number_of_solutions = 0
best_solution_so_far = None
for possibility in possibilities:
number_of_solutions += 1
possibility = list(possibility)
solution = test_your_might(NUMBER_OF_MARBLES, possibility)
# If this solution is the best so far, record the score and configuration of marbles.
if (best_solution_so_far is None) or (solution < best_solution_so_far[1]):
best_solution_so_far = (str(possibility), solution)
# Return the best solution and total number of solutions tested.
return (best_solution_so_far, number_of_solutions)
t0 = time()
one_solution = brute_force_solution(11)
t1 = time()
best_order = one_solution[0][0]
best_score = one_solution[0][1]
number_of_solutions = one_solution[1]
Потребовалось некоторое время, но оно работало с 11 шариками:
>>>Lowest score: 0.00021084993450850984
>>>Order: [10, 7, 3, 4, 11, 1, 8, 9, 5, 2, 6]
>>>It took 445.57227993011475 seconds to find the best possibility
>>>There were 39916800 possibilities
и был незначительно быстрее при запуске на 10 (и учтите, что вы не учитываете сортировку результатов в своем времени, что не нужно с этим новым методом, и добавляет еще одну секунду к вашему времени, чтобы получитьлучшее решение):
Старый
Lowest score: 1.608181078507726e-17
Order: [1, 7, 3, 10, 4, 6, 2, 8, 5, 9]
It took 43.81806421279907 seconds to find the best possibility
There were 3628800 possibilities
Новый
Lowest score: 1.608181078507726e-17
Order: [1, 7, 3, 10, 4, 6, 2, 8, 5, 9]
It took 37.06034016609192 seconds to find the best possibility
There were 3628800 possibilities