LocalSolver快速入门指南(连载二十七) ---- Lambda函数的特殊情形

Local Solver Lambda函数的特殊情形

当在此上下文中使用数组(array)操作符时,它将创建一个数组,其大小将随着关联范围(associated range)的大小而变化。通过在函数中使用第二个参数,允许递归定义该数组的元素,该参数包含函数对范围的前一个元素的求值。

形式上,如果我们定义v <- array(a..b, (i,prev) => f(i,prev))对于区间[a, b]内的所有i,我们有v[i] = f(i,v[i-1]),根据约定v[-1]等于0

这个特性的使用可以用带有时间窗的路由问题来说明。每个地点都有开放的时间,我们必须考虑卡车可能的等待时间,当他们提前到达。事实上,由此产生的时间将是最早到达时间(根据从前一个地点出发的开车时间)和营业时间之间的最大时间。考虑到每个地点的服务时间,我们有:

function departureTime(route, i, prev) {
   
   
   arrivalTime <- (i==0) ?
       openingHour[route[i]] :
       max(openingHour[route[i]], prev + distance(route[i-1],route[i]));
   return arrivalTime + serviceTime[route[i]];
}
 

所有出发时间的数组可递归地定义为:

times <- array(0..count(route)-1, (i, prev) => departureTime(route, i, prev));

 

虽然我们使用了建模语言的lambda函数来获得更可读的模型,但需要注意的是,departureTime仅返回由LocalSolver操作符组成的表达式。

现在如果我们在每个地点都有关门时间,也就是说卡车一定是在关门时间closingHour[L]之前离开地点L ?这样的约束可以通过应用操作符来添加,并且应用于相同的范围(range:

constraint and(0..count(route)-1, i => times[i] <= closingHour[route[i]]);

任何问题请联系Local Solver中国总代理无锡迅合信息科技有限公司数学工程师。未完待续,下一个章节:LocalSolver外部函数(External functions)。

Guess you like

Origin blog.csdn.net/qq_31243247/article/details/118104650