2015-06-23 2 views
1

Я здесь с новым вопросом.Как работает индексирование края в графическом купе?

Я делаю пользовательский алгоритм, которому нужны предварительно вычислимые данные для графов графа. Я использую AllEdgesIterator так:

AllEdgesIterator it = graph.getAllEdges(); 
int nbEdges = it.getCount(); 
int count = 0; 

int[] myData = new int[nbEdges]; 

while (it.next()) 
{ 
    count++; 
    ... 
} 

Первая странная вещь, что nbEdges равно 15565 краям, но граф равно только 14417. Как это возможно?

Вторая странная вещь, когда я запускаю свой пользовательский A *: я просто просматриваю узлы с помощью outEdgeExplorer, но получаю IndexOutOfBound в индексе 15569 на массиве myData. Я думал, что краевые индексы были включены в [0; N-1], где N - количество ребер, действительно ли это так?

Что может быть здесь? Кстати, у меня отключены иерархии сокращения графиков.

Благодарим вас за ответ так быстро каждый раз!

ответ

1

Первая странная вещь, что nbEdges равно 15565 краям но граф равно только 14417. Как это возможно?

Это происходит из-за «уплотнения», где удаляются недостижимые подсети, но в настоящее время только узлы удаляются из графика край просто отсоединены и остаться в ребрах-'array»помечаются как удаленные. Таким образом, iter.getCount является только верхним пределом, но AllEdgeIterator правильно исключает такие неиспользуемые ребра при повторном и правильном подсчете. Но использование iter.getCount для выделения вашего настраиваемого массива данных - правильная вещь.

Что касается второго вопроса: возможно, это связано с тем, что QueryGraph вводит новые виртуальные грани с большим значением edgeId как iter.getCount. В зависимости от точного сценария существуют разные решения, такие как просто исключение или использование исходного края и т. Д.

+0

Хорошо, я вижу, вы могли бы объяснить немного больше виртуальных краев? Что они и зачем вам это нужно? Являются ли они важными или я могу их пропустить? Как я могу узнать, что такое исходный край? Благодаря ! – user3890394

+1

Они вводятся между существующими соединениями и точками запроса, чтобы алгоритмы не нуждались в специальной обработке для этих точек. QueryResult из каждой точки (возвращается из locationIndex.findClosest) будет содержать элемент EdgeIteratorState, указывающий на исходный край. – Karussell

+0

Хорошо, спасибо вам большое :) – user3890394

Смежные вопросы