2009-04-03 6 views
3

을 생성하여 boost :: graph를 묶음 속성으로 사용합니다. 가능한 다양한 가장자리 가중치 체계를 사용하여 검색을 실행할 수 있기를 원합니다. 가능한 경우 번들 속성에 대한 추가 클래스를 만들지 않고 새 그래프를 만들거나 그래프의 기존 속성을 모두 수정하지 않고 검색 유형에 따라 다른 가중치 맵을 전달하고 싶습니다.boost :: graph edge_weight 속성 맵

edge_weight_t에 대한 property_map을 수동으로 빌드 할 수 있습니까?

typedef boost::property_map<SSPSGraph_t, boost::edge_weight_t>::type WeightMap; 
typedef boost::property<boost::edge_weight_t, float> DistanceProperty; 

그리고 난 그냥 적절한 values--

distances[e]= ? 
까지의 거리 [전자]

WeightMap distances; 
edge_descriptor_t e = some_edge_or_another; 
float d=some_derived_distance_value; 

을 할 수 그리고 지정하고 싶습니다 : 여기에 지금까지있어 무엇

또는 번들 된 속성에 대한 새로운 구조를 세분화하여 작성해야합니다. 즉, 피하려고 노력한 것입니다. 그로부터 가중치 맵을 만드시겠습니까? 새로운 boost :: graph; 내가 여기서 바보 같은 짓을하지 않는다고 가정하지 마라.

답변

2

귀하의 질문에 대한 확신이 없습니다. 여기에 당신을 도울 수있는 몇 가지 팁 : 당신이 WeightMap의를 정의하는 데 사용했다

부스트 :: property_map, 당신은 당신의 그래프 내부 속성을 해당 추가해야합니다 (만했다 DistanceProperty을 정의하여 필요한의 절반) :

typedef boost::property<boost::edge_weight_t, float> DistanceProperty; 

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirS, boost::no_property, DistanceProperty> MyGraph; 

이렇게하지 않으면 boost :: property_map이 도움이되지 않습니다.

시도하려는 모든 다른 체계에 대해 다른 가중치 속성을 추가하지 않으려면 그래프 정의 외부에서 이러한 속성을 정의하는 것이 좋습니다. 이 작업은 std :: map과 boost::associative_property (매우 간단하지만 맵의 효율성을 가지고 있음)을 사용하여 - boost::vector_property_map을 사용하는 것이 더 효율적입니다 (기본 std :: vector 덕분입니다). 그러나 식별자 property_map이 필요합니다 즉, 제공된 가장자리에서 숫자 식별자 (이상적으로 0에서 num_edges() - 1 사이)를 추출 할 수있는 property_map입니다. 이 property_map은 일반적으로 그래프 내에서 정의됩니다.

내 대답이 도움이되지 않는 경우 (또는 충분하지 않은 경우) 내 대답을 업데이트 할 수 있도록 좀 더 정확하게 질문하십시오.