Немного похоже на то, что делали.
Создаем справочник транспортных средств, с указанием для каждой модели вместимости паллет-упаковок-штук/килограмм/кубических метров/клиентов. Каждому типу присваиваем индекс значения стоимости одного КМ или часа, в зависимости от принятых у Вас правил. В дальнейшем все вновь нанимаемые машины ассоциируем СТРОГО с этим справочником.
Создаем справочник клиентов, с указанием для каждого района, улицы, номера дома. Возможно в дальнейшем "играться" с указанием особых условий по длительности обслуживания каждого клиента, временных окон приема и тд. и т.п.
Получаем пул заявок от клиентов. Для контроля невовремя вывезенных заказов можно присваивать индексы срочности, по которым заявки будут упорядочиваться. Например, "1" - для заявок сегодняшнего дня, "0" - для вчершаних (невывезенных).
Сортируем все заявки клиентов по району клиента, внутри района по индексу срочности, внтури индекса срочности по улице, внутри улицы по номеру дома. Такое упорядочивание не учитывает карту, сложности одностороннего движения. Плюс всем точкам типа "рынок, 5-ый ряд, красная крыша" нужно присвоить подходящий адрес на этой улице. Точкам на одном рынке можно присваивать квартиры (их порядок - порядок обхода рынка. но в этом случае надо в справочник добавлять квартиры и в сортировку).
Вводим в систему расстояние от склада до каждого из районов. Считаем, что район настолько мал, что адреса внутри него расположены рядом друг с другом. Также можно ввести практику сосежних районов опять же через индексы.
Теперь система должна найти самую большую заявку одного района и разместить ее в самую вместительную машину. Если осталось место - ищет заявки с соседнего района. При этом при размещении проверяются факторы превышения паллет/кг/м3/клиентов. Если подходящей машины нет - отсекает часть района по алгоритму (например, делит на две части, отсекая во вторую такое количество строк, чтобы оставшаяся первая часть поместилась в машину).
После того как заявки условно распределены (необходимо определить - работаем с бесконечным числом машин, т.е. ищем машину сами, либо "активируем" готовые на завтра машины индексами).
Для каждой машины считаем затраты - двойное расстояние до района (туда-обратно) + пробег по району (эмпирически, средняя скорость дистрибуционного автомобиля 12-14км/ч). Получаем эквивалент денежных затрат для каждой машины и для каждого набора распределения. Оптимальным считается такое распределение, у которого СУММА по всем машинам - минимальная. Также можно "навешивать" алгоритм двух ходок и так далее....
Может сумбурно написал (не успеваю

) - но мысль постарался выразить... если вопросы есть - буду стараться ответить...