То, что вы запрашиваете, - это, по сути, алгоритм расстояния на графике (структура данных с косой чертой), вычисляемый из набора парных расстояний. Разумная (и хорошо вычисляемая) метрика: время в пути .
Можно думать так: построить граф, в котором каждый узел является навыком, а каждое ребро представляет релевантность узлов, которые он соединяет друг с другом. Теперь представьте, что вы начинаете с какого-то узла на графике (с некоторого навыка) и случайно перепрыгиваете на другие узлы вдоль определенных ребер. Скажем, вероятность перехода от навыка A к навыку B пропорциональна релевантности этих навыков друг другу (нормализуется по релевантности этих навыков другим навыкам ...). Теперь время коммутирования представляет собой среднее количество шагов, необходимых для перехода от навыка A к навыку C.
Это имеет очень приятное свойство, заключающееся в том, что добавление большего количества путей между двумя узлами сокращает время коммутирования: если навыки A и B, B и C, C и D, а также D и A связаны, то время коммутирования между A и С будет еще короче. Более того, время коммутирования может быть легко вычислено с использованием разложения по собственным значениям вашего редко связанного графа умений (я думаю, что ссылка, которую я дал вам, показывает это, но если нет, то их много).
Если вы хотите сохранить время коммутирования между любой парой навыков, вам понадобится полностью подключенный граф или матрица NxN (N - количество навыков). Однако гораздо более приятный вариант состоит в том, чтобы, как указано выше, отбросить все соединения слабее некоторого порога, а затем сохранить разреженный граф в виде строк в базе данных.
Удачи, и я надеюсь, что это помогло!