единственной вещью, на которой я когда-либо использовал внутреннее ключевое слово, является проверяющий лицензию код в моем продукте;-)
Насколько я понимаю, это похоже на кластеризацию K-средств, и то, что вы ищете, обычно известно как «Медоиды».
См. Здесь: http: // en .wikipedia.org / wiki / Medoids или здесь: http://en.wikipedia.org/wiki/K-medoids
Возможно, у меня вот-вот начнется дрожь, которая возникает как раз перед тем, как проявить полную глупость. Но разве это не поддается грубой силе? В Python:
distances = [
[ 0 , 2 , 1 , 3 , 2 , 3 , 3 , 2 , 3 , 4 , ],
[ 2 , 0 , 1 , 3 , 2 , 3 , 3 , 2 , 3 , 4 , ],
[ 1 , 1 , 0 , 2 , 0 , 1 , 2 , 1 , 2 , 3 , ],
[ 3 , 3 , 2 , 0 , 1 , 2 , 3 , 2 , 3 , 4 , ],
[ 2 , 2 , 1 , 1 , 0 , 1 , 2 , 1 , 2 , 3 , ],
[ 3 , 3 , 2 , 2 , 1 , 0 , 3 , 2 , 3 , 4 , ],
[ 3 , 3 , 2 , 3 , 2 , 3 , 0 , 1 , 2 , 3 , ],
[ 2 , 2 , 1 , 2 , 1 , 2 , 1 , 0 , 1 , 2 , ],
[ 3 , 3 , 2 , 3 , 2 , 3 , 2 , 1 , 0 , 1 , ],
[ 4 , 4 , 3 , 4 , 3 , 4 , 3 , 2 , 1 , 0 , ],
]
currentMinimum = 99999
for point in range ( 10 ) :
distance_sum = 0
for second_point in range ( 10 ) :
if point == second_point : continue
distance_sum += distances [ point ] [ second_point ]
print '>>>>>', point, distance_sum
if distance_sum < currentMinimum :
currentMinimum = distance_sum
centre = point
print centre
a)
б) пока не знаю ..
может быть, для каждого p найти более близкую машину.
с помощью этой логики построить граф.
чем как-нибудь (я еще не знаю) разделить граф
То, что вы пытаетесь сделать, или, по крайней мере, (б) относится к кластерному анализу. Раздел математики / статистики / эконометрики, где точки данных (например, точки в n-мерном пространстве) разделены между группами или кластерами. Как это сделать - нетривиальный вопрос, существует много-много возможных способов.
Подробнее читайте в статье в Википедии о кластерном анализе .