Ну, я не вижу оснований думать, что алгоритм, который вы пишете, действительно сработает, поэтому вопрос о том, как вы можете его испортить, кажется неуместным.
Вы правильно определили это как случай проблемы с назначением. Точнее говоря, это проблема «максимального двудольного соответствия», и алгоритм Эдмондса-Карпа является наиболее простым способом ее решения (https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm)
Тем не менее, это алгоритм для определения максимального потока в сети, который представляет собой большую проблему, чем простое двустороннее сопоставление, и объяснения этого алгоритма действительно намного сложнее, чем вам нужно. Понятно, что у вас были некоторые проблемы с реализацией этого из литературы, но на самом деле, когда проблема сводится к простому (невзвешенному) двустороннему сопоставлению, алгоритм легко понять:
- Сделать начальное назначение
- Попробуйте найти улучшение
- Повторяйте, пока больше не будет найдено улучшений.
Для двустороннего сопоставления «улучшение» всегда имеет одну и ту же форму, что облегчает решение этой проблемы. Чтобы найти улучшение, вы должны найти путь, который соединяет неназначенного покупателя с неназначенным заказом, следуя этим правилам:
- Путь может идти от любого покупателя к любому заказу, который он / она может выполнить, но не
- Путь может идти из любого заказа только к покупателю, выполняющему его в текущем назначении.
Для поиска кратчайшего пути используется поиск по принципу «хлеб-в-первых», который будет соответствовать улучшению, изменяющему наименьшее количество существующих назначений.
Найденный вами путь обязательно будет иметь нечетное число ребер, а ребра с четным номером будут назначениями. Чтобы реализовать улучшение, вы удалите эти назначения и замените их нечетными ребрами. Есть еще один из них, который делает его улучшением. Это выглядит так:
PREVIOUS PATH FOUND IMPROVED ASSIGNMENT
1 1 1
/ /
A A A
\ \
2 2 2
/ /
B B B
\ \
3 3 3
/ /
C C C