2016-12-23 2 views
0

Попытка заставить Cytoscape JS вести себя для меня, но сталкиваясь с некоторыми проблемами юзабилити, которые я не знаю, является ли это мной или ограничением библиотеки.Cytoscape JS - Различные веса на основе направления для Dijkstra

Основная проблема заключается в использовании различных весов в зависимости от направления. А-В должен иметь вес 3, но, к примеру, от B до A должен быть вес 6. Есть только один край, определенный, поскольку docs говорят, что источник/цель игнорируются в неориентированных графах.

Я решаю это до сих пор, сохраняя вес на самом узле, и я подумал, что он работал в весовой функции dijkstra, исследуя edge.target(), чтобы получить желаемый вес.

Но, я думаю, edge.target(), похоже, соответствует только односторонней связи, определенной при настройке ребер, несмотря на то, что алгоритм direct = false соответствует алгоритму. Если я прихожу к нему с другого направления, я, кажется, ошибаюсь.

Итак, мой вопрос: как правильно получить цель узла, которую dijkstra набирает вес, внутри весовой функции, где все, что у меня есть, является краевым объектом? Мой график имеет круговые пути, поэтому к узлу можно подойти с двух сторон, и один вес не будет работать.

ответ

0

Ну, я решил это путем редактирования cytoscape.js и изменений Дейкстров передать фактический целевой узел в весовой функцию:

var weight = weightFn.apply(edge, [ edge, v ]); 

Это позволяет мне захватить вес, который я хранить на самом узле.

Мне все равно было бы интересно, если в краевом объекте есть свойство, которое обеспечивает реальную цель, но на главный вопрос был дан ответ.

+0

Я не уверен, действительно ли это будет работать в алгоритме Дейкстры, поскольку алгоритм предполагает, что на каждый край должен быть один вес. Если вес может быть выражен по направлению, и алгоритм все еще работает правильно (например, с некоторыми модульными тестами в качестве примеров), было бы здорово иметь эту функцию в lib по запросу pull. Благодаря! – maxkfranz

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