как сделать топологическую сортировку со списками в python - PullRequest
0 голосов
/ 10 марта 2020

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

[['CS101'], ['CS105'], ['CS106', 'CS105'], ['CS107'], ['CS130'], ['CS151', 'CS105', 'MATH101'], ['CS180'], ['CS201', 'CS151'], ['CS205', 'CS105'], ...]

Так, например, для того, чтобы взять CS101 вам не нужно проходить какой-либо другой курс, но для того, чтобы пройти CS106, вы должны уже пройти CS105. Теперь я должен выполнить топологическую сортировку, и хотя я нашел код из аналогичной проблемы, которая была предоставлена ​​здесь в Stack Overflow, он не работает. Решение было следующее (я изменил только часть my_lists для работы с моим кодом):

        import networkx as nx

        my_lists = data.prerequisites
        my_graph = nx.DiGraph()
        for path in my_lists:
            my_graph.add_nodes_from(path)
            my_graph.add_path(path)

        ts = nx.topological_sort(my_graph)
        print(ts)

, где data.prerequisites - список, созданный в другом файле python (данные .py). Проблема в том, что когда я запускаю это, это выдает мне эту ошибку:

AttributeError: у объекта 'DiGraph' нет атрибута 'add_path'

Я искал документацию networkx 2.4 и ничто не указывает на то, что они заменили add_path(). Было одно решение для этой ошибки, но оно больше не работает, так как решение было дано в 2011 году, а add_path() было полностью удалено в 2019 году. Я попытался использовать другие примеры из inte rnet, но не смог найти правильный для списков. Должен ли я попытаться найти совершенно другой подход, или есть небольшое простое решение, подобное этому? Потому что многих из них я не могу понять.

1 Ответ

1 голос
/ 10 марта 2020

См. Документацию add_path, новый способ вызова метода -

nx.add_path(my_graph, path)

, и в качестве дополнительной подсказки вам не нужно вызывать my_graph.add_nodes_from(path), так как узлы добавляются вместе с краями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...