Я работаю над julia с библиотекой Metagraphs.jl
. Чтобы решить проблему оптимизации, я хотел бы получить набор/список ребер в графе, которые указывают на специальный набор вершин, имеющих 2 общих свойства.
Моей первой догадкой было сначала получить набор/список вершин. Но я столкнулся с первой проблемой, которая заключается в том, что функция filter_vertices
, похоже, не принимает применение фильтра к более чем одному свойству. Ниже приведен пример того, что я хотел бы сделать:
g = DiGraph(5)
mg = MetaDiGraph(g, 1.0)
add_vertex!(mg)
add_edge!(mg,1,2)
add_edge!(mg,1,3)
add_edge!(mg,1,4)
add_edge!(mg,2,5)
add_edge!(mg,3,5)
add_edge!(mg,5,6)
add_edge!(mg,4,6)
set_props!(mg,3,Dict(:prop1=>1,:prop2=>2))
set_props!(mg,1,Dict(:prop1=>1,:prop2=>0))
set_props!(mg,2,Dict(:prop1=>1,:prop2=>0))
set_props!(mg,4,Dict(:prop1=>0,:prop2=>2))
set_props!(mg,5,Dict(:prop1=>0,:prop2=>2))
set_props!(mg,6,Dict(:prop1=>0,:prop2=>0))
col=collect(filter_vertices(mg,:prop1,1,:prop2,2))
И я хочу, чтобы col
нашла вершину 3 и никакие другие.
Но filter_vertices
допускает только одно свойство за раз, и тогда становится более затратным выполнять цикл с двумя фильтрами, а затем пытаться сравнивать, чтобы отсортировать список с вершинами, которые имеют оба свойства.
Учитывая размер моего графа, я хотел бы избежать определения этого набора с несколькими и дорогостоящими циклами. Кто-нибудь из вас знает, как решить эту проблему простым и мягким способом?
В итоге я сделал это, чтобы ответить на свой вопрос:
fil3=Array{Int64,1}()
fil1=filter_vertices(mg,:prop1,1)
for f in fil1
if get_prop(mg,f,:prop2)==2
push!(fil3,f)
end
end
println(fil3)
Но скажи мне, если у тебя есть что-нибудь более интересное
Спасибо за вашу помощь!