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)。