LocalSolver快速入门指南(连载十七) ---- LocalSolver可用的操作符-At操作符

超大规模数学求解器LocalSolver可用的操作符-At操作符

At操作符

运算符“at”是第一个操作数是数组或列表,后面的操作数是整数(或索引)的一种运算符。索引的数目必须与数组的维数相匹配(如果是列表,则为1)。它的值是数组中元素在给定索引处的值。

本页介绍“at”操作符在数组(一维或多维)上的使用。有关在列表变量上使用“at”运算符的说明,请参见列表变量。如果对学习使用Local Solver有更多问题,请联系LocalSolver中国独家代理商无锡迅合信息科技有限公司开发人员。

 

一维的At操作符

假设我们对状态可以是开(1)或关(0)的机器的行为进行建模。此状态被建模为二进制变量。现在,这台机器的运行成本取决于它的状态,在LocalSolver中可以直接建模为:

status <- bool();

mcost <- status ? onCost : offCost;

注意,onCostoffCost不一定是常量。它们可以依赖于其他表达式,例如,我们可能有一个可选的特殊技术(比如二进制变量specialTechno)是影响成本的,如下所示:onCost <- 100 + 20 * specialTechno.

At运算符可以看作是这个条件表达式(cab)的一般化。让我们把上面的例子推广到有几种可能的操作模式的机器上。现在status是一个整数变量,其取值在{012345}之间,操作成本取决于操作模式(即status)。

操作模式

作业成本

0

Cost 0

1

Cost 1

2

Cost 2

3

Cost 3

4

Cost 4

5

Cost 5

 

这里同样地,cost0, ... cost5不一定是常数。它们可以依赖于其他的表达或决策变量。可以用5个嵌套的条件表达式来模拟这台机器的运行成本,但是这种方法在数百种运行模式的情况下是乏味的和不恰当的。相反,at操作符允许我们在一个数组中包含所有成本,并通过使用索引status访问此数组来定义操作成本:

 

status <- int(0,5);

costs = { cost0, cost1, cost2, cost3, cost4, cost5};

// In LSP the at operator is naturally written with the [] notation on a map

LSP中,at运算符是用[]符号自然地写在映射上的

mcost <- costs[status];

 

API中,行为是相同的,但需要一个补充步骤。事实上,尽管LSP语言允许您直接使用数组、映射或列表,但其他语言不可能这样做,您的数组在使用之前必须转换为LSExpression。这个LSExpression是一个类型为O_Array的操作符。它没有数值(对其调用getValue方法是禁止的),而是包含一个表达式数组。数组中的表达式可以是常量,也可以不是常量。

PYTHON语言

 

要将Python列表转换为LocalSolver数组,只需使用LSModel.create_expression()创建一个LSExpression,然后手动将每个元素添加为操作数,或使用所提供的获取Python列表或Python iterable迭代器)对象的快捷方式。

status = model.int(0, 5)
vv = [ cost0, cost1, cost2, cost3, cost4, cost5 ]
# Convert the list to LSExpression.
lsv = model.array(vv)
# Creates the at (operator [] is overloaded in the Python API).
mcost = lsv[status]

 

C++语言

若要将C++结构转换为LocalSolver数组,可以简单地使用createExpression() 方法创建LSExpression,然后手动添加每个元素作为操作数,或使用所提供的让迭代器指向结构的开始和结束的快捷方式:

LSExpression status = model.intVar(0, 5);
std::vector<int> vv { cost0, cost1, cost2, cost3, cost4, cost5 };
// Convert the vector to LSExpression.
LSExpression lsv = model.array(vv.begin(), vv.end());
// Creates the at (operator [] is overloaded in the C++ API).
LSExpression mcost = lsv[status];

 

C#语言

 

要将C# list转换为LocalSolver数组,只需使用LSModel.CreateExpression方法创建一个LSExpression,然后手动添加每个元素作为操作数,或使用提供的获取可枚举对象的快捷方式:

LSExpression status = model.Int(0, 5);
List<LSExpression> list = new List<LSExpression> { cost0, cost1, cost2, cost3, cost4, cost5 };
// Convert the list to LSExpression.
LSExpression lsv = model.Array(list);
// Creates the at
LSExpression mcost = model.At(lsv, status);

 

JAVA语言

要将Java列表转换为LocalSolver数组,只需使用LSModel.createExpression方法创建一个LSExpression,然后将每个元素手动添加为操作数,或使用提供的获取iterable对象(迭代器对象)的快捷方式。

LSExpression status = model.intVar(0, 5);
List<LSExpression> list = Arrays.asList(cost0, cost1, cost2, cost3, cost4, cost5);
// Convert the list to LSExpression.list转换为LSExpression
LSExpression lsv = model.array(list);
// Creates the at 创建At操作符
LSExpression mcost = model.at(lsv, status);

未完待续 2021-5-22

 

Guess you like

Origin blog.csdn.net/qq_31243247/article/details/117173363