Перебором, конечно. И как написали выше, с применением «динамического программирования», т.е. запоминать и использовать уже рассчитанные варианты и подварианты.
В реальной жизни такие задачи стараются решать зональным способом. А для Москвы и, наверное, Питера в виде секторов вокруг веток метро. Чтобы в секторе было удобно перемещаться. Сектора могут немного накладываться друг на друга. Затем для леммингов подбираете маршрут исходя из предпочтения находиться в одном секторе или максимум смежных. Ну и количество точек учитываете. Можно далее учесть и их отдалённость и последовательность обхода задать.
Просто решать перебором на полной карте — это строить ветки метро, наземного транспорта, учитывать водные преграды, сраные железнодорожные пути, пробки, стоимость проезда сложнее высчитать. В итоге вы одного курьера на 50% будете использовать, а другого на 150%.