Алгоритм возврата всех возможных путей в этой программе во вложенный список - PullRequest
0 голосов
/ 04 июля 2018

Итак, у меня есть игра с функцией findViableMoves(base). Если я вначале вызываю эту функцию с параметром base, я получаю вывод [move1, move2 ... moven], который обозначает все n жизнеспособных шагов, которые пользователь может выполнить, давая состояние base. (на самом деле есть 2 корневых хода)

После выполнения перемещения, скажем, move2 - база изменяется в зависимости от хода, функция вызывается снова, и теперь у нас есть выход для findViableMoves (base), равный [move21,move22 .... move2n].

Глубина первого дерева

Если вы посмотрите на эту диаграмму, это очень похожая ситуация - нет возврата назад, это просто нормальное дерево. Мне нужна программа, которая выполняет поиск в глубину (я думаю?) По всем возможным ходам при заданном начальном состоянии base, а затем возвращается затем в списке следующим образом:

[[move1,move11,move111],[move1,move11,move112],....[moven,moven1,moven11],...]

В этих списках будет больше элементов (максимум 14), но мне просто интересно, может ли кто-нибудь дать какие-нибудь подсказки о том, как я могу построить алгоритм для этого? Эффективность для меня не имеет значения, так как путей не так много, я просто хочу, чтобы это было сделано сейчас.

1 Ответ

0 голосов
/ 04 июля 2018

Я не на 100% уверен в том, что вы ищете, но если у вас есть список или похожий итератор, который меняется во время цикла, вы можете попробовать что-то вроде следующего.

Этот пример позволяет списку и условию цикла оставаться динамическими во время выполнения цикла.

import random
import sys
import time

changing_list = ['A', 27, 0.12]

def perform_operation(changing_list, counter):
    sometimes_add_another_element_threshold = 0.6
    if random.random() > sometimes_add_another_element_threshold:
        changing_list.append(random.random())
    print(changing_list[counter])

def main(z=0):
    safety_limit = 100
    counter = 0
    condition = True
    while condition and counter < safety_limit:
        perform_operation(changing_list, counter)
        counter += 1
        condition = counter<len(changing_list)

    print("loop finished")


if __name__ == '__main__':
    start_time = time.time()
    main(int(sys.argv[1])) if len(sys.argv)>1 else main()
    print(time.time() - start_time)

, который обеспечивает вывод переменной длины, который выглядит примерно так:

A
27
0.12
0.21045788812161237
0.20230442292518247
loop finished
0.0058634281158447266
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...