LocalSolver快速入门指南(连载十九) ---- 多维的At操作符(续)

多维的At操作符(续)

Pitfalls(缺点)

数组必须具有统一的维数

 

不要求数组具有相同数量的元素(交错数组),但它们必须具有相同的维数。因此,在同一表达式中,不可能将二维数组与三维数组混合。

// Will throw an error because the first operand is an expression of
// dimension 0 (a boolean decision) whereas the second is an array of
// dimension 1
将抛出错误,因为第一个操作数是维数为0的表达式(布尔判定),而第二个操作数是维数为1的数组
 
std::vector<int> a { 1, 2, 3 };
LSExpression array = model.array(a.begin(), a.end());
LSExpression error = model.array();
error.addOperand(model.bool());
error.addOperand(array);
 

索引是从0开始

数组的索引从0开始。因此,在用LSP语言创建at表达式时,映射必须为索引0定义一个值。

例如,以下代码将引发异常:

status <- int(1,3);
costs[1] = 10;
cost[2] = 18.2;
cost[3] = 20;
 
// will throw an exception because indices of map "costs" do not start at zero
将引发异常,因为名为“costs”的map的索引不是从零开始的
mcost <- costs[status];

 

的确,当通过map数据结构(映射)创建这样一个表达式时,

O_Array表达式是隐式创建的,因此映射中的索引必须连续且从0开始,就像在常规数组中一样。

数组溢出

At表达式的索引值在数组边界之外时,该表达式被认为是未定义的。在LocalSolver中允许未定义的表达式,只要它们不产生未定义的约束或未定义的目标,在这种情况下,LocalSolver解决方案具有不可行(Infeasible)的状态(或不一致(Inconsistent)状态,如果求解器可以证明不存在可行的解决方案)

例如,下面的代码没有显式的约束,但是由于At操作符引起的隐式约束,模型将被证明是不一致的。的确,你可以观察到,没有x的值可以防止目标函数未被定义:

x <- int(-3, 3);
c[i in 0..30] <- 3*i + 1;
maximize c[-3 + 2*x] + c[3 - 2*x];

 

相反,以下模型是一致的,即使x的所有值中有一个分支仍然没有定义:

x <- int(-3, 3);
c[i in 0..30] <- 3*i + 1;
maximize 2*x >= 3 ? c[-3 + 2*x] : c[3 - 2*x];

API中,必须创建O_Array类型的操作符

虽然LSP语言允许从map(映射)创建数组表达式,但API函数需要显式创建O_Array表达式。请参阅下面的c++代码。

std::vector<int> vv { 10, 18, 20 };
LSExpression x = model.intVar(0, 2);
 
// Will not compile because vv is not an LSExpression
//将不会编译,因为vv不是一个LSExpression
LSExpression wwx_bad = vv[x];
 
// OK since lsv is an LSExpression of type O_Array ,是允许的,因为lsv是类型为O_Array的LSExpression表达式
LSExpression lsv = model.array(vv.begin(), vv.end());
LSExpression wwx_good = lsv[x];

未完待续,下一章节:分段操作符 ,更多问题请联系Local Solver数学求解器中国区总代理无锡迅合信息科技有限公司数学建模工程师或开发人员。

猜你喜欢

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