Local Solver 列表变量特定的操作符
at运算符允许访问列表中给定位置的值。它需要两个操作数:一个列表和一个整数表达式(不一定是常量)。当给定索引为负或大于或等于count(x)时,它返回-1。
例如,以下模型中的目标函数是最大化列表中第一项和最后一项的乘积:
x <- list(5);
constraint count(x) > 0;
maximize x[0] * x[count(x)-1];
indexOf运算符返回给定整数在列表中的位置,如果该整数未包含在列表中,则返回-1。它需要两个操作数:一个列表和一个整数表达式(不一定是常量)。例如,给定一个大小为n的矩阵c,线性排序问题在于寻找最小代价的[0..n-1]的排列,其中当j在排序中在i之前时支付代价c[i][j]。以下是相应的模型表达:
x <- list(n);
constraint count(x) == n;
minimize sum[i in 0..n-1][j in 0..n-1](c[i][j] * (indexOf(x,i) > indexOf(x,j)));
使用列表变量进行建模
在路由问题的背景下,列表变量可以用来对各种问题建模。为了指定必须访问的所有城市,一个纯旅行商问题(TSP)用一个列表x建模,列表x有一个约束count(x)==n。这一限制将被省略为“奖金收集旅行商问题”,对不在旅途中的城市支付一个罚款。
当k为卡车数量时,车辆路径问题(VRP)将用k个列表进行建模。对于一个经典的VRP,这些列表将被限制成一个分区(操作符partition),而对于一个奖金收集VRP问题,只需要它们的不相交性(操作符disjoint)。
距离可以以矩阵的形式给出,用at运算符访问,也可以显式地计算出(例如用运算符pow和srqt计算欧氏距离)。
详细的路由和调度示例可以在我们的示例之旅中找到。学习中更多问题请联系LocalSolver中国总代理无锡迅合信息科技有限公司数学工程师。未完待续~~~~