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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值