C++ boost::graph中的ColorMap度量_tsp_近似的隐式图

C++ boost::graph中的ColorMap度量_tsp_近似的隐式图,c++,boost,boost-graph,traveling-salesman,C++,Boost,Boost Graph,Traveling Salesman,我正在努力实现以下目标: 有一个函数computeTspTour(大小、开始、距离),它使我能够近似地通过size多个顶点,从start开始进行最短的漫游。这里,distance是一个函数对象,它获取两个索引并返回它们之间的距离 我想利用boost::graph的metric\u tsp\u近似值。为此,我需要一个完整的基数图size,因此我想使用一个隐式定义的图来避免创建一个无用的、琐碎的大型图结构 这一切看起来都很好,但我的问题是,metric\u tsp\u approx在某个点上使用了d

我正在努力实现以下目标: 有一个函数
computeTspTour(大小、开始、距离)
,它使我能够近似地通过
size
多个顶点,从
start
开始进行最短的漫游。这里,
distance
是一个函数对象,它获取两个索引并返回它们之间的距离

我想利用
boost::graph
metric\u tsp\u近似值
。为此,我需要一个完整的基数图
size
,因此我想使用一个隐式定义的图来避免创建一个无用的、琐碎的大型图结构

这一切看起来都很好,但我的问题是,
metric\u tsp\u approx
在某个点上使用了
dijkstra\u最短路径
,它定义了一个
颜色映射
。这导致了以下两个问题:

我也很高兴,如果有人有一个更简短或完全避免创建任何图形的替代建议,那么完整的图形除了顶点数之外,实际上并不包含任何信息。

您的自定义“完整”图形代码似乎还可以

DFS需要的关键组件是“顶点索引映射”:本质上是顶点描述符和int之间的一对一对应关系,这样每个顶点都映射到区间[0,num_顶点(g)]中的一个数字。对于“标准”图,这种映射是已知的,DFS使用一些元编程来推断适当颜色映射的类型

在您的情况下,顶点_描述符是正确间隔内的整数,映射为“相同映射”。您只需使用类似以下代码来表示它:

namespace boost{ 
    template<class F>
    struct property_map< CompleteGraph<F>, vertex_index_t >
    {

        typedef identity_property_map type;

        //or more fancier 
        //typedef CompleteGraph<F> graph_t;
        //typedef typed_identity_property_map<typename graph_t::vertex_descriptor> type;

        typedef type const_type;
    };

    //then you define a "get" function:
    template<class F>
    identity_property_map
      get(vertex_index_t, const CompleteGraph<F>& /*g -- not used */) 
    {
       return identity_property_map();
    }
} //namespace boost
namespace boost{
模板
结构属性映射
{
类型定义标识\属性\映射类型;
//或者更喜欢
//typedef CompleteGraph图;
//typedef typed_identity_property_map type;
类型定义类型常量类型;
};
//然后定义一个“get”函数:
模板
标识\属性\映射
get(顶点索引,常量完成图&/*g——未使用*/)
{
返回标识\属性\映射();
}
}//名称空间提升
这应该足够了。如果某些算法需要其他“属性映射”作为图形类型,您可以用类似的方式定义它们

祝你好运!

你自定义“完整”图形的代码似乎没问题

DFS需要的关键组件是“顶点索引映射”:本质上是顶点描述符和int之间的一对一对应关系,这样每个顶点都映射到区间[0,num_顶点(g)]中的一个数字。对于“标准”图,这种映射是已知的,DFS使用一些元编程来推断适当颜色映射的类型

在您的情况下,顶点_描述符是正确间隔内的整数,映射为“相同映射”。您只需使用类似以下代码来表示它:

namespace boost{ 
    template<class F>
    struct property_map< CompleteGraph<F>, vertex_index_t >
    {

        typedef identity_property_map type;

        //or more fancier 
        //typedef CompleteGraph<F> graph_t;
        //typedef typed_identity_property_map<typename graph_t::vertex_descriptor> type;

        typedef type const_type;
    };

    //then you define a "get" function:
    template<class F>
    identity_property_map
      get(vertex_index_t, const CompleteGraph<F>& /*g -- not used */) 
    {
       return identity_property_map();
    }
} //namespace boost
namespace boost{
模板
结构属性映射
{
类型定义标识\属性\映射类型;
//或者更喜欢
//typedef CompleteGraph图;
//typedef typed_identity_property_map type;
类型定义类型常量类型;
};
//然后定义一个“get”函数:
模板
标识\属性\映射
get(顶点索引,常量完成图&/*g——未使用*/)
{
返回标识\属性\映射();
}
}//名称空间提升
这应该足够了。如果某些算法需要其他“属性映射”作为图形类型,您可以用类似的方式定义它们


祝你好运!

DFS和TSP算法要求图形同时是“顶点列表”和“关联图”(即可以访问顶点邻居的图形)

您的图表必须具有以下内容

 struct traversal_category
        : public virtual boost::vertex_list_graph_tag
        , public virtual boost::adjacency_graph_tag
        , public virtual boost::incidence_graph_tag
    {
    };

     typedef typename boost::adjacency_iterator_generator<CompleteGraph<F>, vertex_descriptor, out_edge_iterator>::type adjacency_iterator;
有了这些更改,再加上一些装饰性的更改,您的代码就可以通过编译了

顶点索引映射是可选的,Boost将使用VertexMap和ColorMap包装您的代码,可能基于无序的_映射。它的效率将低于“标识”或类似的自定义映射,但可以工作


祝你好运!

DFS和TSP算法要求图形同时是“顶点列表”和“关联图”(即可以访问顶点邻居的图形)

您的图表必须具有以下内容

 struct traversal_category
        : public virtual boost::vertex_list_graph_tag
        , public virtual boost::adjacency_graph_tag
        , public virtual boost::incidence_graph_tag
    {
    };

     typedef typename boost::adjacency_iterator_generator<CompleteGraph<F>, vertex_descriptor, out_edge_iterator>::type adjacency_iterator;
有了这些更改,再加上一些装饰性的更改,您的代码就可以通过编译了

顶点索引映射是可选的,Boost将使用VertexMap和ColorMap包装您的代码,可能基于无序的_映射。它的效率将低于“标识”或类似的自定义映射,但可以工作


祝你好运!

谢谢你的回复。不幸的是,这对我来说似乎没有任何改变。(我也已经有了get函数,所以我只是添加了属性映射结构模板的专门化。)谢谢你的回复。不幸的是,这对我来说似乎没有任何改变。(我也已经有了get函数,所以我只是添加了属性_mapstruct模板的专门化。)太棒了,非常感谢!注意:“关联图”允许访问外边缘,而不是相邻顶点,遍历类别只需要设置关联图_标记——就是这样(除了OutEdgeDescriptor的普通构造函数之外)。太棒了,非常感谢!注意:“关联图”允许访问外边缘,而不是相邻顶点,遍历类别只需要设置关联图标记即可(除了OutEdgeDescriptor的普通构造函数之外)。
 typedef vertex_list_graph_tag traversal_category;
 typedef void adjacency_iterator;