当前位置: 首页 > 知识库问答 >
问题:

或工具-VRP-无法找到最佳解决方案的处理案例

莘光华
2023-03-14

我正在建立一个基于谷歌或谷歌工具的车辆路径问题求解器。

对于简单的问题或高容量问题,它可以正常工作,但是对于大多数“真实”数据集,我最终得到的解决方案要么无限期运行,要么超时。

经过一番思考,我意识到并非所有现实世界的问题都能得到解决或优化。我可能希望大多数车辆每天行驶不超过500公里。然而,如果我必须给600公里以外的人送货,整个解决方案将会失败。

我该如何应对这些情况?现在,这似乎是一个二进制的通过或失败。我非常高兴某些案例被忽略,或者它返回了一个次优的解决方案。

这是我的解决方案的代码

public List<OptimisedVehicleRoute> Start(Location depot, List<Location> locations, int numVehicles = 1, float maxDistanceKmPerVehicle = 1000f, float maxDistanceKmSlack = 5f)
{
    // Create Routing Index Manager
    var depotIndex = locations.IndexOf(depot);
    var manager = new RoutingIndexManager(locations.Count, numVehicles, depotIndex);
    Console.WriteLine($"Depot at {depot.Postcode}");

    var routing = new RoutingModel(manager);

    var numCalls = 0l;

    int transitCallbackIndex = routing.RegisterTransitCallback((long fromIndex, long toIndex) =>
    {
        numCalls++;

        // Convert from routing variable Index to distance matrix NodeIndex.
        var fromNode = manager.IndexToNode(fromIndex);
        var toNode = manager.IndexToNode(toIndex);

        var fromLocation = locations[fromNode];
        var toLocation = locations[toNode];

        var mDistance = fromLocation.DistanceTo(toLocation);

        return mDistance;
    });

    // The arc cost evaluator tells the solver how to calculate the cost of travel between any two locations
    routing.SetArcCostEvaluatorOfAllVehicles(transitCallbackIndex);

    long maxVehicleDistanceSlack = (long)Math.Round(maxDistanceKmSlack * 1000); // slack per day
    long maxVehicleDistance = (long)Math.Round(maxDistanceKmPerVehicle * 1000); // 1000km max distance per day

    routing.AddDimension(transitCallbackIndex, maxVehicleDistanceSlack, maxVehicleDistance, true, "Distance");
    RoutingDimension distanceDimension = routing.GetMutableDimension("Distance");
    distanceDimension.SetGlobalSpanCostCoefficient(100);

    var searchParameters = operations_research_constraint_solver.DefaultRoutingSearchParameters();
    searchParameters.FirstSolutionStrategy = FirstSolutionStrategy.Types.Value.PathCheapestArc;

    var timer = new Stopwatch();
    timer.Start();
    searchParameters.LogSearch = true;
    var solution = routing.SolveWithParameters(searchParameters);
    timer.Stop();
    Console.WriteLine(timer.Elapsed.TotalSeconds);

    var optimisedVehicleRoutes = this.CreateOptimisedVehicleLocations(locations, numVehicles, routing, manager, solution);

    this.OptimisedDistanceKm = optimisedVehicleRoutes.Sum(r => r.TotalDistanceKm);

    routing.Dispose();

    return optimisedVehicleRoutes;
} 

另外,如果有人能帮我理解“Slack”的实际用途,我将不胜感激。我最初认为这是每辆车的公差(即10公里的间隙允许该车辆在其最大路线距离上行驶10公里)。但现在我不确定

共有1个答案

闾丘博
2023-03-14

如果你的位置在600公里,最大允许距离为500公里,你的问题基本上是不可行的。。。

但是你可以使用adddisconction()使你的问题可行,让解算器删除这个位置。。。

请看看我们在留档网站上的例子:https://developers.google.com/optimization/routing/penalties

 类似资料:
  • 我在这么多地方发现了这么多与此相关的问题。 当我在命令提示符中输入ant-version时,会打印以下内容: 无法定位tools.jar.预计在C:\Program Files\Java\jre1.8\libtools.jar Apache Ant版本1.9.4于2014年4月29日编译 尽管它说的是“找不到tools.jar……”它也在打印版本号。 除了复制工具,其他所有解决方案都不起作用。ja

  • 在维基百科中,背包的算法如下: 我在网上找到的所有例子的结构都是一样的<我无法理解的是,这段代码是如何考虑到最大值可能来自较小的背包这一事实的?E、 如果背包容量为8,那么最大值可能来自容量7(8-1)<我找不到任何逻辑来考虑最大值可能来自较小的背包。这是错误的想法吗?

  • 基于这个来自云平衡问题的示例,我尝试将客户从工作解决方案中删除,如下所示: 结果我得到了这个例外: java.lang.IllegalStateException:实体(Customer--6361356485874019865)有一个值为(Customer--902742678799526425)的变量(previousStandstill),该变量有一个值为(null)的sourceVaria

  • 我有个例外 Selenium.common.exceptions.ElementClickInterceptedException:message:Element....在点(841.5,483.25)处不可单击,因为另一个元素......遮蔽了它 所以我在互联网上挖掘了一点,我发现的大部分似乎来自一个永久的覆盖问题,但用下面的代码替换最后一行并没有点击指定的按钮

  • 本文向大家介绍IONIC自定义subheader的最佳解决方案,包括了IONIC自定义subheader的最佳解决方案的使用技巧和注意事项,需要的朋友参考一下 IONIC subheader是我们常用的一个css 属性,但是这个subheader的高度是固定的,当然也是可以改变的,但是如果改了subheader的告诉,还要更改content的top值,稍微有些麻烦,如果是动态告诉的subheade

  • 问题内容: 至少有六打Django应用程序为Django提供OpenID身份验证: django-openid django-openid-auth 另一个django-openid-auth,似乎已经死了 django-authopenid django-socialauth(还提供对Twitter和Facebook帐户的身份验证) django-socialregistration(也具有Fa