Всем добрый день!
Вопрос не из легких, но вдруг кто-то из присутствующих здесь когда-либо сталкивался с этой задачей.
Необходимо реализовать следующий алгоритм на С++, уже долго над этим сижу, никак не могу придумать, как правильно это сделать. Есть такая таблица с решением задачи (прикрепила картинку).
Имеется матрица с тремя столбцами (A,B,Sij). A и В - города. Sij - показатель, который нужно рассчитывать для данного алгоритма. Первая пара А и В заносится в вектор, в данном случае маршрут 1 (столбик "маршрут", где 0 - точка, откуда выезжает машина, и куда возвращается). Есть предел в 500 км для маршрута. Для каждой следующей строчки маршрута мы проверяем два условия:
1 - оба пункта А и В вместе не задействованы в каком-либо из ранее построенных маршрутов
2 - один из пунктов является первой или последней точкой в каком-либо из ранее построенных маршрутов (например, для строки 2, пункт B (10) был первым в маршруте из предыдущей строки)
Если оба условия выполнены, ставим + в 4 и 5 столбцах и добавляем этот отрезок пути в маршрут (например, было 0-10-11-0, а после добавления отрезка 1-10 стало 0-1-10-11-0) Далее считаем общее расстояние маршрута (по матрице расстояний, которая дана), и если оно меньше 500 км, принимаем этот маршрут как новый.
Аналогично все для всех следующих строчек. Если в какой-либо строчке оба пункта еще нигде не использовались, создаем еще один маршрут, называем его 2 и последующие строчки проверяем уже как для 1 маршрута, так и для второго.
Алгоритм продолжается, пока не будут задействованы все пункты.
Я не прошу полного решения данной задачи, я надеюсь, что мне хотя бы помогут с идеей, как логично собрать в кучу столько проверок для каждой строки. Потому что я в них уже запуталась (этот алгоритм - реализация метода Кларка-Райта для решения задачи маршрутизации транспорта). Заранее спасибо!
Сборка персонального компьютера от Artline: умный выбор для современных пользователей