детальный венгерский алгоритм (проблема назначения) вопрос - PullRequest
2 голосов
/ 06 августа 2011

Я реализовал венгерский алгоритм, решение проблемы назначения, как описано в этой статье , но он не работает на нескольких процентах матриц случайных затрат.

Я потратил несколько недель на его отладку (я начал, когда задал этот вопрос , хотя и не полный рабочий день). Я взял матрицы случайных затрат, для которых алгоритм не работает, и выполнил алгоритм со старой доброй ручкой и бумагой, и сравнил это с моей реализацией, чтобы увидеть, что пошло не так. Это привело меня к нескольким ошибкам, которые я сейчас исправил, но я столкнулся с примером, для которого я не могу найти правильное решение, когда решаю его вручную. Для всех, кто заинтересован: стоимость матрицы этого примера равна {{0,6,4,3},{3,2,1,2},{0,7,6,4},{3,8,5,3}}, для которой правильное решение имеет сумму 9=4+2+0+3 (в этом порядке). В этом примере, в конечном итоге, есть совпадение не на подграфе равенства, и я думаю, что это невозможно, что указывает на то, что что-то не так.

Либо я не совсем понимаю решение, которое является приемлемым вариантом, либо чрезвычайно незначительная ошибка в представленном решении, которую я подробно опишу ниже.

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

  • Входные данные задачи представляют собой взвешенный полный двудольный граф с n узлами на каждом разбиении.
  • Представленный метод указывает на n расширение путей.
  • Расширяющий путь - это альтернативный путь, начинающийся и заканчивающийся в несопоставленных узлах.
  • Чередующийся путь - это путь, чередующийся между несоответствующими ребрами в подграфе равенства.
  • Эти чередующиеся пути растут в ширину, останавливаясь только когда:
    • Найден дополнительный путь или
    • альтернативные пути не могут быть расширены дальше.
  • И важный факт для возможной ошибки: алгоритм запоминает, с какими узлами столкнулись чередующиеся пути, что влияет на алгоритм в части, не относящейся к этому вопросу.

Когда расширенный путь найден, представленный метод говорит прекратить расти чередующиеся пути. Я считаю, что это неправильно. Я думаю, что все альтернативные пути должны быть увеличены до стоимости найденного расширенного пути. Обратите внимание, что чередующиеся пути сначала растут в ширину, так что это только увеличивает пути, стоимость которых может быть связана с найденным путем. Это небольшое изменение может привести к тому, что некоторые узлы будут помечены как «посещенные альтернативным путем», которые в противном случае не были бы отмечены, что в дальнейшем повлияет на алгоритм.

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

1 Ответ

2 голосов
/ 06 августа 2011

Глядя на презентацию венгерского алгоритма в "Stanford GraphBase", вы можете отслеживать его продвижение к решению в виде добавления константы к каждой ячейке в строке матрицы затрат или каждой ячейке в столбце матрицы затрати увидите, что у вас есть решение, когда у вас есть полный набор независимых нулей в измененной матрице.

Я прочитал только один раз статью, на которую вы ссылаетесь.Это тот случай, когда поиск пути расширения позволяет вам увеличить количество независимых нулей в измененной матрице?Если это так, то поиск n расширяющих путей, как на шаге 2 на рисунке 3, найдет хорошее решение, потому что тогда вы должны иметь n независимых нулей.Если это так, то вы можете проверить свою реализацию алгоритма, проверив, что каждый найденный путь добавления добавляет независимый ноль, даже в случае, когда есть другие пути, которые он мог бы найти, но не смог найти.

...