LocalSolver快速入门指南(连载二十六) ---- 整数范围

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]];

猜你喜欢

转载自blog.csdn.net/qq_31243247/article/details/118070609