Вам просто нужно решить типичную задачу согласования максимального веса .
Создайте узлы для каждой позиции, они будут первой частью графика. Создайте узлы для каждого человека, они будут второй частью графика. Добавьте ребра из каждой позиции [A, B] ко всем людям, имеющим оба навыка A и B.
Определите вес ребра от позиции к человеку как нечто такое же большое, как человек, и местоположения позиций близки к друг с другом - например, 1 / distance(person, position)
или some_constant - distance(person, position)
.
Тогда вы можете использовать любой алгоритм, который решает упомянутую проблему, и вы получите соответствие.