Я играю с повышающим A * алгоритм, начали с примером, приведенным на: http://www.boost.org/doc/libs/1_37_0/libs/graph/example/astar-cities.cppboost A * посетитель с пользовательским ограничением веса края?
Я вижу, что вы можете изменить его эвристику и его посетитель, чтобы иметь какое-то пользовательские настройки, так что я не совсем понимаю Концепция еще для такой вещи, как следующая, в качестве примера обучения, я бы хотел, чтобы алгоритм НЕ выбирал крайний город-город, если время в пути (вес края) больше, чем X, например 100 минут. (только если это возможно, если не найдено другого пути, то этот город должен быть заблокирован, а не путь)
Я пробовал собственный эвристический класс, который возвращает больше времени, чем реальность, чтобы «обмануть» его, чтобы не выбирать этот город, однако проблема в том, что с помощью этого трюка штрафный город отбрасывается, даже для дальнейших взаимодействий. (Следующий пример объясняет это: B-> D отбрасывается как лучший путь найден, но город D не отбрасываются (вы видите это выбрали в следующей итерации)
Так что упростило задачу Furter:
enum nodes {
A, B, C, D, E, N
};
const char *name[] = {
"A", "B", "C", "D", "E", "F"
};
edge edge_array[] = {
edge(A,B), edge(B,C),
edge(C,D), edge(D,E),
edge(B,D) // B to D is the problem here, it should be excluded
};
cost weights[] = { // estimated travel time (mins)
// 107, 174, 283, 71, 436
35, 58, 94, 23, 145
};
в этом примере (принимая код от оригинала в качестве основы), я получаю маршрут:
Начало вершины: A
Гол вершину: E
Кратчайший путь от А до Е: А -> В -> D -> Е
Общее время в пути: 204,5
Проблема заключается в В -> D путь, который является таким большим расстоянием (допустим, например, порог 100, что было бы предпочтительнее: A -> B -> C -> D -> E. Таким образом, расстояние между 2 городами не превышает 100 (конечно, только если возможно, если нет другого пути, любой из них должен быть выбран)
Я решил его неоптимальным способом: пользовательская функция после добавления кромки, которая (или установка веса вручную) return travelTime > 100 ? travelTime * 2 : travelTime
, которая может быть ахи эвед для тестирования с:
cost weights[] = { // estimated travel time (mins)
// 107, 174, 283, 71, 436
(35 > 100) ? 35*2 : 35, (58 > 100) ? 58*2 : 58, (94>100) ? 94*2 : 94, 23, (145 > 100) ? 145*2 : 145
}; // The comparisons are not needed, just there to better explain what the custom add_edge function will do.
С помощью этого метода, я получаю нужный A -> B -> C -> D -> E
, но таким образом, это просто хак/обходной путь проблема и изменяет входные данные внутри, что я думаю, что это не самое лучшее решение.
Есть ли лучший способ достичь этого без необходимости вручную изменять расстояния/время в пути?
Чтобы иметь право на вознаграждение за головами , ответ я oking for, переопределяет одну из функций boost, либо посетителя, либо эвристику, которая будет отмечать некоторые края так дорого, чтобы они не были выбраны (ТОЛЬКО края! Я не хочу отмечать город (Vertex) дорогим, потому что город B может быть дорогим от A, но может не быть от C, поэтому он должен соответствовать критериям соответствия – StormByte
. Один из способов сделать это - иметь многомерные веса для каждого ребра и изменить функцию эвристики, чтобы принять это во внимание. – Joao