我正在Cplex OPL中实现IP模型,并且一开始我以非常低效的方式制定了该模型。大约有120,000个决策变量x_ij
,其中只有约2,000个有效。 (这是一个工作分配问题,要分配给约200个工人,500个工作的工人,每个工人最多可以胜任5个工作。由于运行和解决程序需要花费数小时,因此我研究了使用元组构建更有效的模型请遵循本手册:https://www.ibm.com/developerworks/community/forums/atom/download/attachment_14941147_Efficient_OPL_Modeling.PDF?nodeId=f3b70168-871b-4d8f-b457-4641a488bdf4
我创建了以下三个元组:
tuple Worker{
key string WorkerID;
float Wage;
}
tuple Job{
key string JobID;
int RelImportance;
}
tuple Assignment{
string WorkerID;
string JobID;
float Utility;
}
{Worker} Workers = ...;
{Job} Jobs = ...;
{Assignment} Assignments = ...;
决策变量声明如下:
dvar boolean x[Assignments];
现在,在尝试表达以下内容时遇到麻烦: 我想为每个“工作-工作”对创建一个变量y,以计算解决方案中分配给该工作的较低工资的工人数量。
我已尝试实现以下目标:
dexpr int y[<i,j,u> in Assignments] = sum(k in Workers : k.Wage < Workers.find(<i>).Wage) x[<k.UserID,j,u>];
因此,对于每个工人-工作对(i,j),我尝试将所有工资低于工人i的工人的决策变量求和。但是这种方法会带来错误。
所以我的问题是,我不知道如何使用对另一个元组(赋值)的求和来访问一个元组(工作器)中的元素。