Алгоритм наилучшего соответствия

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

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

Ответ 1

Я думаю, вы должны использовать генетический алгоритм, потому что:

Ответ 2

Есть несколько способов сделать это

Один из подходов - программирование ограничений. Это особый случай динамического программирования, предлагаемого feanor. Будет полезно использовать специализированную библиотеку, которая может выполнять ограничение и ветвление для вас. (Google для "gecode" или "comet-online" для поиска библиотек)

Если вы математически склонны, вы также можете использовать целочисленное программирование для решения проблемы. Основная идея здесь состоит в том, чтобы перевести вашу проблему в набор линейных неравенств. (Google для "планирования целочисленного программирования", чтобы найти множество примеров реальной жизни и google для "Abacus COIN-OR" для полезной библиотеки)

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

Ответ 3

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

У вас есть два набора узлов: события и время. Нарисуйте край от каждого события до каждого возможного времени встречи. Затем вы можете эффективно построить сопоставление (максимально возможное множество ребер между узлами), используя расширенные пути. Это работает, потому что вы всегда можете преобразовать двудольный граф в эквивалентный поток.

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

Ответ 4

Похоже, это может быть хорошим кандидатом для решения динамического программирования, в частности что-то похожее на задание интервального планирования.

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