如何保证使用 ortools 计算的路线不会穿越特定区域

问题描述

长期潜伏者第一次海报......要温柔:-)

我们正在使用 google ortools 使用 C++ 中的图像掩码计算路线。

首先,我们创建了一个图像的两个颜色蒙版,其中包含一些我们想要避免使用白色的对象,然后我们在图像上运行切片分割算法并丢弃落在白色对象内的任何分割中心。 最后,我们通过 ortools 运行剩余的中心以绘制路线。

这是一张图像,输出绘制在输入掩码上,因此您可以看到我在说什么。

Plotted route

我想如果我将它与地图联系起来,我们将绘制一条避开多个湖泊的路线!

我使用的 TSP 代码完全基于 ortools 中的电路板示例,但这里是我用来计算路线完整性的代码。在下面的代码中, build_path 方法只是示例代码中打印输出一个混蛋版本。

   void GConstraintSolver::compute_path(const std::vector<std::vector<int>>& locations,Path &path,const Image& mask) {

    const int num_vehicles = 1;
    const operations_research::RoutingIndexManager::NodeIndex depot{0};
    operations_research::RoutingIndexManager manager((int)locations.size(),num_vehicles,depot);
    operations_research::RoutingModel routing(manager);

    const auto distance_matrix = ComputeEuclideandistanceMatrix(locations);
    const int transit_callback_index = routing.RegisterTransitCallback(
            [&distance_matrix,&manager](int64_t from_index,int64_t to_index) -> int64_t {
                // Convert from routing variable Index to distance matrix NodeIndex.
                auto from_node = (size_t)manager.IndexToNode(from_index).value();
                auto to_node = (size_t)manager.IndexToNode(to_index).value();
                return distance_matrix[from_node][to_node];
            });

    routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index);
    operations_research::RoutingSearchParameters searchParameters = operations_research::DefaultRoutingSearchParameters();
    searchParameters.set_first_solution_strategy(
            operations_research::FirstSolutionStrategy::PATH_CHEApest_ARC);
    const operations_research::Assignment *solution = routing.solveWithParameters(searchParameters);
    build_path(manager,routing,*solution,locations,path,mask);
}

所以这是我的问题: 我可以使用算法的任何参数来保证计算出的路线不会遍历我们试图避免的任何对象吗?我们还没有看到它,但我可以看到很容易出现路径穿过白色物体的情况。 我们可以将避免的区域传递给算法吗?我试图查看文档,但没有找到类似的内容

我们可以沿生成的路线对连接进行采样,如果它们穿过一个白色区域,然后围绕该区域的边缘绘制一条路线,但如果有任何我可以提供作为路线计算输入的内容,我更愿意这样做出于显而易见的原因。

非常感谢!

解决方法

对于任何回到这个问题的人,我们提出的解决方案类似于我在问题末尾发布的内容。

在 ComputeEuclideanDistanceMatrix 方法中,我们检查是否有任何节点 -> 节点穿过白色区域,如果有,我们将节点之间的距离设置为非常高(10000),这确保了当 TSP 时这两个节点不直接连接执行。