在OPL的后处理执行命令中创建元组

时间:2018-11-06 09:45:25

标签: cplex opl

我遇到一个工作分配问题,其中工作包含三个组成部分 (子技能)以识别它们:

{job}职位= { | Cat1中的c1,Cat2中的c2,Cat3中的c3};

我现在从工人的队伍中创造出可能性的元组 如果符合条件,则为工人分配工作:

{possibleTuple} =可能= { | 在Jobs中,n在Workers中};

二进制数组onTeam [Possibles]指示是否将工作人员n分配给团队。

我的模型运行良好,并且得到了合理的结果。但是我 无法在后处理“执行”中很好地打印这些 命令。我想输出每个工作的工人团队 像这样:

for (var j in Jobs)
{
   for (var n in Workers)
   {
     if onTeam[<n,c1,c2,c3>] == 1, output n
   }
}

这是我遇到的内在逻辑。我不能够 重新创建元组以便索引onTeam集。

有人可以帮忙吗?

非常感谢, 帕特里克·希利

1 个答案:

答案 0 :(得分:-1)

让我给您举个小例子:

std::future<bool> simplePath::navAgent::findPathAsync(int _startX, int _startY, int _endX, int _endY){
    return std::async(std::launch::async, []{return this->findPath(_startX,_startY,_endX,_endY);});
}

std::vector< std::future_bool > results;
results.emplace_back(navComponent->findPathAsync(0,2,30,45));
results.emplace_back(navComponent->findPathAsync(0,2,123,100));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));

bool result = true;
for ( auto& f : results )
{
    result &= f.get();
}

给出

{string} Cat1={"A","B"};
{string} Cat2={"C","D"};
{string} Cat3={"E","F"};

tuple job
{
string j1;
string j2;
string j3;
}

{job} Jobs = { < c1, c2, c3 > | c1 in Cat1, c2 in Cat2, c3 in Cat3 };

{string} Workers={"Albert","Bob","Charles"};

tuple possibleTuple
{
string n;

string j1;
string j2;
string j3;
}

{possibleTuple} Possibles = { < n, c1, c2, c3 > | < c1,c2,c3> in Jobs, n in Workers };

dvar boolean onTeam[Possibles];

subject to
{
onTeam[<"Albert","A","C","E">]==1;
onTeam[<"Bob","A","C","E">]==1;
onTeam[<"Charles","A","C","F">]==1;
}

{string} workersPerJob[j in Jobs]=
{w | w in Workers : onTeam[<w,j.j1,j.j2,j.j3>]==1};

execute
{
for(var j in Jobs) if ( workersPerJob[j].size!=0)
{
writeln("for job ",j," workers : ", workersPerJob[j]);
}
}