У меня есть набор траекторий, состоящий из точек вдоль траектории и с координатами, связанными с каждой точкой. Я храню их в 3d-массиве (траектория, точка, параметр). Я хочу найти множество r траекторий с максимальным накопленным расстоянием между возможными попарно комбинациями этих траекторий. Моя первая попытка, которую я думаю, что это работает, выглядит так:Комбинаторная оптимизация метрики расстояния
max_dist = 0
for h in itertools.combinations (xrange(num_traj), r):
for (m,l) in itertools.combinations (h, 2):
accum = 0.
for (i, j) in itertools.izip (range(k), range(k)):
A = [ (my_mat[m, i, z] - my_mat[l, j, z])**2 \
for z in xrange(k) ]
A = numpy.array(numpy.sqrt (A)).sum()
accum += A
if max_dist < accum:
selected_trajectories = h
Это займет навсегда, так как num_traj может быть около 500-1000, и г может быть около 5-20. к произвольно, но обычно может быть до 50.
Пытается быть супер-умными, я поставил все на два вложенных списковые, делая тяжелое использование itertools:
chunk = [[ numpy.sqrt((my_mat[m, i, :] - my_mat[l, j, :])**2).sum() \
for ((m,l),i,j) in \
itertools.product (itertools.combinations(h,2), range(k), range(k)) ]\
for h in itertools.combinations(range(num_traj), r) ]
Помимо того, что довольно Нечитаемый (!!!), это также занимает много времени. Может ли кто-нибудь предложить какие-либо способы улучшить это?
Это был основной источник ускорения! Благодаря! – Jose