我正在建立一个基于谷歌或谷歌工具的车辆路径问题求解器。
对于简单的问题或高容量问题,它可以正常工作,但是对于大多数“真实”数据集,我最终得到的解决方案要么无限期运行,要么超时。
经过一番思考,我意识到并非所有现实世界的问题都能得到解决或优化。我可能希望大多数车辆每天行驶不超过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公里)。但现在我不确定
如果你的位置在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