在Microsoft Solver Foundation中,我想知道是否可以添加一个值取决于决策值的参数。
即。我想要一些TSP模型,但它也应考虑从一个点到另一个点的流量。请注意:交通量取决于销售人员在该路线上行驶的时间。
以下是模型:
我有一个城市之间所有可能组合的矩阵。
Decision变量是销售人员路线的Order
。 0是第一个,1秒,......
我有一个属性timeToTravel
,该属性绑定到一个属性,该属性根据Order
值计算路由的发生时间,并返回包含当天该时间的流量的旅行时间
在我看来,参数值被读取一次并在调用Solve
函数时被缓存,我是否正确?如果是,是否有人有任何建议来解决这个问题?
最初我问了这个问题on the MSF forum,但我认为它会更多关注Stack Overflow。此外,我对MSF以外的其他解决方案持开放态度,但我更愿意留在.NET环境中。
答案 0 :(得分:1)
有一篇关于使用Solver Foundation解决“静态”旅行商问题的好文章here。如果您还没有自己的实现,也许您可以将解决方案基于该代码。
这是上述文章的目标公式:
// Goal: minimize the length of the tour.
Goal goal = model.AddGoal("TourLength", GoalKind.Minimize,
Model.Sum(Model.ForEach(city, i =>
Model.ForEachWhere(city,
j => dist[i, j] * assign[i, j], j => i != j))));
如果我理解正确,在您的问题中,两个城市之间的旅行时间取决于一天中的时间?
我不相信您可以在优化期间动态更新dist[,]
double
数组。但是,使用Model类的构建块应该可以将dist[,]
数组重新表示为一组依赖于已经行进的总距离/时间的函数。
为了完整起见,here是另一篇关于使用OML制定TSP的有趣文章。