Алгоритм обхода ребер графа, некоторые ребра обязательны, некоторые необязательны

У меня есть неориентированный граф со всеми вершинами четной степени. В этом графе есть множество ребер, которые нужно покрыть ровно один раз, и множество ребер, которые не следует покрывать вообще, если только в этом нет крайней необходимости. Мне нужно найти набор из одного или нескольких путей через граф, чтобы все необходимые ребра были покрыты ровно один раз, а количество пройденных нежелательных ребер было минимальным. Ни одно требуемое ребро не может быть пройдено более чем одним путем, но нежелательные ребра могут быть пройдены любым количеством путей. Это не совсем эйлеров путь, потому что есть необязательные ребра.

Длина каждого отдельного пути ограничена максимальным количеством необходимых ребер, которые он может покрыть, хотя путь может покрывать любое количество нежелательных ребер.

Начальные и конечные точки не обязательно должны совпадать, но существует набор возможных начальных точек.

Некоторые из нежелательных ребер совпадают с требуемыми ребрами, то есть пара вершин может иметь между собой как требуемое ребро, так и нежелательное ребро (хотя между данной парой вершин никогда не будет более одного ребра каждого типа). вершины).

С какого алгоритма лучше начать? По сути, я ищу алгоритм, который может найти путь, который пересекает требуемые ребра ровно один раз и избегает нежелательных ребер, когда это возможно (но может проходить их более одного раза, если это необходимо). Я могу опираться на это, чтобы сделать все остальное.


person Jason C    schedule 21.03.2012    source источник
comment
Прочтите Кормен, Лейзерсон, Ривест - Введение в алгоритмы для подробного ознакомления с графовыми алгоритмами.   -  person linello    schedule 21.03.2012
comment
Спасибо за рекомендацию; Я нашел копию в местном книжном магазине.   -  person Jason C    schedule 21.03.2012


Ответы (3)


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

Известно, что граф содержит эйлеров путь тогда и только тогда, когда он СВЯЗЕН и имеет все вершины (кроме 2) ЧЕТНОЙ СТЕПЕНИ. Это можно обеспечить, выполнив следующие действия:

  • Начните с непосредственного включения всех нужных ребер в конечный подграф. Теперь у вас есть граф с одним или несколькими связанными компонентами.

ДЕЛО 1 :

  • Если количество компонентов в этом подграфе равно единице (т. е. все ребра соединены друг с другом), нам нужно только убедиться, что все вершины (кроме 2) имеют четную степень. Поскольку в вашем исходном графе все вершины четной степени, это возможно сделать, но мы также хотим позаботиться о том, чтобы количество ребер, которые мы добавляем для достижения этого, было минимальным (поскольку остается добавить только нежелательные ребра).

  • Один хороший эвристический способ сделать это, начать с каждой из вершин нечетной степени и выполнять BFS (поиск в ширину), пока не достигнете другой вершины с нечетной степенью. Сделайте это для всех вершин нечетной степени, выберите 2 вершины, которые выбирают максимальный нежелательный путь между ними, чтобы добиться этого, и удалите этот путь. Теперь граф будет иметь эйлеров путь

(Обратите внимание, что такое спаривание нечетных вершин всегда возможно, так как ни один граф не может иметь нечетное количество вершин нечетной степени)

СЛУЧАЙ 2:

  • Подграф, состоящий только из искомых ребер, имеет более одной компоненты. Для обеспечения связности делаем следующее - Берем компонент с минимальным количеством вершин. Сделайте BFS из каждой вершины и выберите путь минимальной длины, который соединяет этот компонент с ЛЮБЫМ ДРУГИМ компонентом.

  • Повторяйте эту процедуру до тех пор, пока все компоненты не сольются в один компонент. Теперь для равномерности следуйте процедуре, описанной ранее для СЛУЧАЯ 1.

person arya    schedule 21.03.2012
comment
Спасибо. Я упустил один момент в своей первоначальной задаче; некоторые из нежелательных ребер совпадают с требуемыми ребрами, то есть пара вершин может иметь между собой как требуемое ребро, так и нежелательное ребро. Мне все еще нужно время, чтобы подумать над вашим ответом, но мне интересно, повлияет ли это на что-нибудь. Причина, по которой я пропустил это, заключается в том, что я обобщал проблему, но теперь я не уверен, обобщил ли я ее неправильно или это все та же проблема. - person Jason C; 21.03.2012
comment
Вы имеете в виду, что одно ребро может быть как обязательным, так и нежелательным? Или что пара конечных точек может иметь 2 ребра между собой - одно обязательное, другое нежелательное? Если это первый случай, это не имеет значения, потому что даже если это ребро нежелательно, вы должны включить его в свой подграф, поскольку оно необходимо. Даже если это второй случай, он не представляет проблемы, поскольку вы берете только необходимое преимущество. Нежелательное ребро может быть проигнорировано, если речь идет о связности графа, и может быть включено, если требуется, при попытке достичь условия четности. - person arya; 22.03.2012

Я думаю, что это можно свести к проблеме коммивояжера. Создайте преобразованный граф, где узлы представляют обязательные ребра, а веса ребер представляют количество необязательных ребер, которые необходимо пройти, чтобы перейти от одного обязательного ребра к другому.

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

Будут некоторые сложности, потому что пути, которые вы можете выбрать после обязательного преимущества, зависят от направления, в котором вы его выбрали. Вы можете решить эту проблему, превратив каждое обязательное ребро в два узла, по одному для каждого направления. Тогда TSP должен будет посетить ровно один узел из каждой пары.

e.g.

A===C
|  /
| /             (edges A<->B and B<->C are compulsory, A<=>C is optional)
|/
B

Преобразованный граф:
Узлы = { AB, BA, BC, CB }
Ребра = { AB -> BC (стоимость 0), BA -> CB (стоимость 1), CB -> BA (стоимость 0), БК -> АБ (стоимость 1) }

person tom    schedule 21.03.2012

Это NP-сложно: экземпляр задачи о гамильтоновом пути можно преобразовать в экземпляр вашей задачи. Следовательно, если вы знаете, как решить свою задачу, вы знаете, как решить задачу о гамильтоновых путях.

Для преобразования возьмем ориентированный граф и удвоим каждую вершину, скажем, на красную и синюю вершины. Для каждой бывшей вершины сделайте так, чтобы все входящие ребра шли в красную вершину, а все исходящие ребра выходили из синей вершины. Создайте одно новое ребро от красной до синей вершины. Очевидно, что если вы можете решить проблему гамильтонова цикла для этого графа, вы можете сделать это и для исходного графа.

Теперь пометьте все новые ребра обязательными, а все старые ребра необязательными. Отметьте одну красную вершину как возможную точку входа. Если у вашей проблемы есть решение, то оно состоит из одного пути, который является гамильтоновым путем для исходного графа.

person n. 1.8e9-where's-my-share m.    schedule 21.03.2012