Обновление от 28 декабря 2011 г. Вот запись в блоге с менее расплывчатым описанием проблемы, которую я пытался решить, моей работы над ней и моего текущего решения: Наблюдение за игрой каждой команды MLB
Я пытаюсь решить своего рода странную задачу по поиску пути. У меня есть ациклический направленный граф, и каждое ребро имеет значение расстояния. И я хочу найти кратчайший путь. Просто, верно? Ну, есть пара причин, по которым я не могу просто использовать Дейкстру или А*.
- Меня совершенно не волнует ни начальный узел моего пути, ни конечный узел. Мне просто нужен путь, включающий ровно 10 узлов. Но:
- У каждого узла есть атрибут, скажем, цвет. Каждый узел имеет один из 20 возможных цветов.
- Путь, который я пытаюсь найти, является кратчайшим путем ровно с 10 узлами, где каждый узел имеет свой цвет. Я не хочу, чтобы ни один из узлов на моем пути имел тот же цвет, что и любой другой узел.
- Было бы неплохо иметь возможность заставить мой путь иметь одно значение для одного из атрибутов (например, по крайней мере один узел должен быть синим), но это на самом деле не обязательно.
Это упрощенный пример. Мой полный набор данных на самом деле имеет три разных атрибута для каждого узла, которые должны быть уникальными, и у меня есть более 2000 узлов, каждый из которых имеет в среднем 35 исходящих ребер. Поскольку получение идеального «кратчайшего пути» может быть экспоненциальным или факториальным временем, исчерпывающий поиск на самом деле не вариант. Что мне действительно нужно, так это некое приближение "хорошего пути", отвечающее критерию №3.
Может ли кто-нибудь указать мне алгоритм, который я мог бы использовать (даже модифицированный)?
Немного статистики по моему полному набору данных:
- Всего узлов: 2430
- Всего ребер: 86524
- Узлы без входящих ребер: 19
- Узлы без исходящих ребер: 32
- Наибольшее количество исходящих ребер: 42
- Среднее количество ребер на узел: 35,6 (в каждом направлении)
- Из-за характера данных я знаю, что график ациклический
- И в полном наборе данных я ищу путь длиной 15, а не 10