Local Solver的Ranges(整数范围)
范围(Range)是连续整数的集合。
注意:
在LSP建模语言中,..操作符定义一个封闭范围。也就是说,两个端点都包含在区间内:a..b表示从a到b的整数序列。相反,当从LocalSolver的api调用时,range(a,b)表示从a到b-1的整数序列。
范围的两端都可以是非常数表达式。请注意,当范围为空时,一些n元操作符(如min和max)将被认为是未定义的,也就是说,当范围为空时,解仍然是不可行的。
例如,下面的表达式隐式地约束b大于或等于a:
minimize max(a..b, i => v[i+1] * z);
Lambda functions拉姆达表达式
lambda函数是一个特殊的LocalSolver表达式,由两部分组成,参数(arguments)
=>
函数体(
body):
- 函数的实参也是LS表达式,当你使用arguments(参数) => body (函数体)构造时,会自动隐式创建。
- 函数体:函数体是一个LS表达式,将用于评估函数的结果。函数体可以是由LocalSolver支持的任何操作数和操作符组成的任何LS表达式.
注意,这些函数是用LocalSolver操作符的组合显式定义的,不应该与外部函数相混淆。
将拉姆达函数应用于一个范围(Range)
将lambda函数应用到范围(Range)或集合是通过语法op(range,function)实现的,其中:
- op 是一个n元操作符,包括:sum, prod, min, max, and,or, xor,数组
- range是一个整数范围。
- function是只有一个参数的lambda函数,但接受一个或两个操作数的数组操作符除外(见下文)。
这样一个op(range,function)表达式的值可以按如下方法计算。对于范围内的每个整数i,函数function(i)被评估,所有这些数字都使用操作符op进行合计;如果我们定义v
<-
sum(a..b,
i
=>
f(i)),那么v将等于区间[a,b]中i的所有f(i)之和。
在我们的TSP示例中可以找到此功能的典型用法,其中沿线路的距离总和计算如下:
obj <- sum(0..nbCities-2, i => distanceWeight[cities[i]][cities[i+1]])
+ distanceWeight[cities[nbCities-1]][cities[0]];