Найдите кратчайший (скорейший) путь в трех измерениях между определенными точками

Вот моя формулировка проблемы:

У меня есть куб с указанными размерами. со временем в этом кубе генерируются несколько шаров. Я смоделировал координаты (местоположение x, y, z), время генерации и размер шаров. Теперь мне нужно найти кратчайший путь перекрывающихся шаров, соединяющих верхнюю сторону куба с нижней, и найти время, за которое этот путь пройден.

До сих пор я думал о том, чтобы найти парное евклидово расстояние между всеми точками и парную сумму радиусов шара. Затем сравните расстояние с суммой, чтобы найти матрицу перекрытия. Затем найдите все объекты наверху, у которых z-размер меньше 0 и z + размер больше глубины куба, а затем я должен найти путь. Я ценю любую помощь и идею заранее.

Например, рассмотрим следующие данные и код, который я разработал до сих пор:

offspr_x = [1 3 5 1 2]
offspr_y = [3 3 1 8 2]
offspr_z = [1 4 5 3 2]
size = [2 1 4 6 3]
time = [2 5 6 3 8]

Pos= [offspr_x' offspr_y' offspr_z']
dd=pdist(Pos,'euclidean')
ddm = squareform(dd)


% compute similar matrix based on sum of object sizes (assumes size is radius)

drad = meshgrid(size)+ meshgrid(size)';
dadj = ddm.*(ddm <= drad);

Теперь мне нужно преобразовать матрицу перекрытия в объект графа и попытаться найти кратчайший путь между теми точками, у которых offspr_z-size ‹ 0 (все объекты вверху имеют z-size меньше 0) и offspr_z+size > 5 (объекты внизу z+size больше 5):

starts = find(offspr_z-size < 0)
ends = find(offspr_z+size > 5)

ОБНОВЛЕНИЕ: как предложил @beaker, я также попробовал Floyd-Warshall, и вот код, который я использовал:

function D = FastFloyd(D)

n = size(D, 1); 

for k=1:n

    i2k = repmat(D(:,k), 1, n);
    k2j = repmat(D(k,:), n, 1);

    D = min(D, i2k+k2j);

end

end

Следовательно, для:

 dadj(dadj==0)=Inf
 D = FastFloyd(dadj)

Я получил следующий результат:

D =

3.4641    4.1815    6.0000    5.3852    1.7321
4.1815    4.8990    3.0000    5.4772    2.4495
6.0000    3.0000    6.0000    8.3066    4.3589
5.3852    5.4772    8.3066   10.7703    6.1644
1.7321    2.4495    4.3589    6.1644    3.4641

Но мне нужно найти кратчайший (скорейший) путь между начальным и конечным векторами (точками, которые перекрывают верхнюю и нижнюю поверхности куба). Я говорю скорее, потому что меня интересует не наименьшее расстояние, а наименьшее время генерации...


person Ninaa    schedule 25.09.2015    source источник
comment
Добро пожаловать в Stack Overflow! На открытые вопросы «Как ответить» сложно ответить, и они, как правило, вызывают последующие обсуждения. Чтобы повысить свои шансы на получение полезного ответа, измените свой вопрос, чтобы лучше сосредоточиться на конкретной проблеме, с которой вы столкнулись. .   -  person IKavanagh    schedule 25.09.2015
comment
@IKavanagh Я попытался сделать это более конкретным ..   -  person Ninaa    schedule 26.09.2015
comment
@Ninaa Это совсем другое. Правки должны только уточнять и давать более подробную информацию об исходном вопросе, а не задавать дополнительные вопросы. Пожалуйста, отмените редактирование и поместите новую информацию в новый вопрос.   -  person beaker    schedule 28.09.2015
comment
@beaker Я понимаю, но мне не разрешено публиковать новый вопрос. Пишет: Вы достигли лимита вопросов...   -  person Ninaa    schedule 28.09.2015
comment
Я полагаю, вы удалили некоторые вопросы, которые не были приняты очень хорошо. Так что, вероятно, не стоит рисковать и этим. При этом, с какой стати вам взять обратную величину элементов вашей матрицы смежности?   -  person beaker    schedule 28.09.2015
comment
@beaker Нет, это мой первый вопрос. Я создал этот аккаунт 3 дня назад! Я беру обратную матрицу, чтобы все несмежные пары получили значение Inf. Я нашел этот код здесь: mathworks.com/ matlabcentral/файловый обмен/   -  person Ninaa    schedule 28.09.2015
comment
Попробуйте dadj(dadj==0)=Inf.   -  person beaker    schedule 28.09.2015
comment
@beaker У меня все еще есть проблема с этим вопросом. Мы не указали глубину куба, чтобы распознать точки, которые соприкасаются с верхней и нижней поверхностью... Я очень признателен, если вы поможете мне найти решение...   -  person Ninaa    schedule 30.09.2015
comment
@Ninaa Как я уже говорил ранее, это совершенно новый вопрос, и его нужно будет рассмотреть в отдельном посте.   -  person beaker    schedule 30.09.2015
comment
@beaker Кажется, мне нужно подождать 3 дня, чтобы мне разрешили опубликовать еще один вопрос!   -  person Ninaa    schedule 30.09.2015


Ответы (1)


Вы хорошо начали:

offspr_x = [1 3 5 1 2]
offspr_y = [3 3 1 8 2]
offspr_z = [1 4 5 3 2]
size = [2 1 4 6 3]
time = [2 5 6 3 8]

Pos= [offspr_x' offspr_y' offspr_z']
dd=pdist(Pos,'euclidean')

pdist дает вам вектор расстояний. Чтобы сделать его узнаваемым, используйте squareform:

ddm = squareform(dd)

Теперь мы используем ваш расчет для матрицы радиуса, а затем для матрицы смежности:

% compute similar matrix based on sum of object sizes (assumes size is radius)

drad = meshgrid(size)+ meshgrid(size)';
adj = ddm.*(ddm <= drad);

Это находит значения в ddm, которые меньше их соответствующих расстояний по радиусу, и использует их в качестве маски для получения значений из ddm.

Вот результат для вашего тестового примера:

adj =

   0.00000   0.00000   6.00000   5.38516   1.73205
   0.00000   0.00000   3.00000   5.47723   2.44949
   6.00000   3.00000   0.00000   8.30662   4.35890
   5.38516   5.47723   8.30662   0.00000   6.16441
   1.73205   2.44949   4.35890   6.16441   0.00000
person beaker    schedule 26.09.2015
comment
Огромное спасибо. Итак, знаете ли вы, как мне найти кратчайший путь, соединяющий верхнюю поверхность с нижней? Я думаю, что я должен преобразовать матрицу перекрытия в объект графика, а затем найти те точки, что offspr_z-offspr_z ‹ 0 и offspr_z+offspr_z › 4.4, а затем найти путь между ними... - person Ninaa; 28.09.2015
comment
Вы имели в виду offspr_z-size и offspr_z+size? Если да, то я думаю, что это правильный подход. Хотя на практике может быть проще найти все пары кратчайших путей, используя что-то вроде Флойда-Уоршалла, и извлечь из него пути, соединяющие верхнюю и нижнюю поверхности. - person beaker; 28.09.2015
comment
Извините, да, я имел в виду offspr_z-size и offspr_z+size. Я не знаком с Флойдом-Уоршаллом, но проверю. Благодарность - person Ninaa; 28.09.2015
comment
@Ninaa Вы можете адаптировать практически любой имеющийся у вас алгоритм поиска кратчайшего пути (например, алгоритм Дейкстры с модификациями графика), но Флойд-Уоршалл, вероятно, является самым простым способом. - person beaker; 28.09.2015
comment
Я попробовал метод Флойда-Уоршалла. Я обновил вопрос. Не могли бы вы помочь мне с интерпретацией результатов? - person Ninaa; 28.09.2015