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

Posted

技术标签:

【中文标题】如何保证使用 ortools 计算的路线不会穿越特定区域?【英文标题】:How can I guarantee a route calculated with ortools doesn't traverse specific areas? 【发布时间】:2021-05-11 14:28:35 【问题描述】:

我们正在使用 Google 或工具来计算使用 C++ 中的图像掩码的路线。

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

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

我想如果我将它与地图相关联,我们将绘制一条避开许多湖泊的路线!

我使用的 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 depot0;
    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);

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

我们可以沿生成的路线对连接进行采样,如果它们穿过一个白色区域,然后在该区域的边缘绘制一条路线,但如果我可以提供任何东西作为路线计算的输入,我更愿意这样做.

【问题讨论】:

【参考方案1】:

我们提出的解决方案与我在问题末尾发布的类似。

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

【讨论】:

以上是关于如何保证使用 ortools 计算的路线不会穿越特定区域?的主要内容,如果未能解决你的问题,请参考以下文章

Google Ortools - 路由问题示例

在 ORTools 中为每辆卡车设置不同的约束

Google ORTools - 不能共享相同路由的节点(再次)

Python中如何使用ortools求解二次规划?

ortools:如何使用搜索策略sweep和best insert?

如何在 ortools 中更改约束参数的类型