У меня был некоторый первый опыт создания и обхода графиков . Но теперь у меня есть проблема, которой я не сейчас, , если boost :: graph имеет некоторые алгоритмы для ее решения.Boost: Графический рекурсивный траверс и граф-копия
Вот мой график-определение:
const int _AND = 1001;
const int _OR = 1002;
const int _ITEM = 1003;
struct gEdgeProperties
{
string label;
};
struct gVertexProperties
{
string label;
int typ; // _AND, _OR, ITEM
};
typedef adjacency_list< vecS, vecS, undirectedS, gVertexProperties, gEdgeProperties>
BGraph;
Так BGraph содержит элементы и логические связи между ними. Теперь я хотел бы преобразовать этот граф в несколько графиков, , каждый из которых должен содержать NO или-отношения, но представлять все по OR-вершинам перепроверьте комбинаторные альтернативы элементов и их AND-отношений.
В качестве примера: если есть три элемента А, В, С , связанные так: А и (В или С) то результат обхода должно быть два графика, , содержащие следующие комбинации: (1) а и в (2) а и с
Моими (простая) идея теперь должны пересекать график, и каждый раз, когда обхода находит OR-вершину, чтобы скопировать весь график и следовать оттуда на каждом часть рекурсивного OR-узла:
if graph [vertex] == OR {
для (... // каждая дочерняя вершина вершины BGraph newGraph = копия (график); traverse (newGraph, childVertex); }}
Это не будет работать правильно, потому что мой рекурсивный вызов каждого ребенка пропустит структуру стека (информацию, как вернуться вверх на графике). Это означает: обход вернется правильно, , но не вверх.
Я понятия не имею, если есть более (или вообще) эффективный способ решить такую проблему с boost :: graph и встроенными алгоритмами.
Но мне кажется, что это интересная проблема, поэтому я бы хотел, чтобы обсуждал ее здесь, возможно, это приводит к более глубокому пониманию boost :: graph.
Спасибо!
Спасибо. Это очень полезно. Сначала я попытаюсь перенести ваш код на python, потому что он имеет структуры списка, как в вашем коде. Это MatLab? Спасибо за ваше решение !!! – Mike75