双重约束

时间:2018-10-15 17:49:05

标签: cplex opl

我正在尝试为随附的代码查找约束的对偶值。我只提到了我想找到其对偶的约束。如何找到代码中提到的约束6的对偶?

int NbJobs=10;
int NbMachines=2;

range Job=1..NbJobs;
range Machine= 1..NbMachines;

int JobProcessTime[Job]=...;
int JobReadyTime[Job]=...;
int JobSize[Job]=...;
int JobDueDate[Job]=...;
int MachineCapacity[Machine]=...;

float E=99999;
float e=.000001;
float Dual1[Job]=...;
tuple Batches{
    key int id;
    int BatchSetup[Job];
    float BatchReadyTime;
    float BatchProcessTime;
}
{Batches} BatchConfig=...;

dvar boolean NbTardy[Job];
dvar boolean BatchSelected[BatchConfig][Machine];
dvar float+ BatchCompletionTime[BatchConfig][Machine];
dvar float+ JobCompletionTime[Job];

minimize sum(j in Job) NbTardy[j];
subject to {
    forall (j in Job, b in BatchConfig, m in Machine) Constraint6: JobCompletionTime[j]>= BatchCompletionTime[b][m]- E*(1-b.BatchSetup[j]*BatchSelected[b][m]);
}

1 个答案:

答案 0 :(得分:1)

由于您的模型是MIP,因此无法直接获得该对偶值。

请参阅技术说明http://www-01.ibm.com/support/docview.wss?uid=swg21399941

https://www.ibm.com/developerworks/community/forums/html/topic?id=978e90f6-8fc5-4be7-a306-df9bdb4a4754&ps=25,我举了一个例子:

dvar int x in 0..10;
dvar float y in 0..10;

minimize x+y;
subject to {
  ctx :   
    x >= 1/2;
  cty:
    y>=1/2;
}

main {
  var status = 0;
  thisOplModel.generate();
  if (cplex.solve()) {
    writeln("Integer Model");   
    writeln("OBJECTIVE: ",cplex.getObjValue());   
    writeln("dual CTX:",thisOplModel.ctx.dual);
    writeln("dual CTY:",thisOplModel.cty.dual);
  }
  var xvalue=thisOplModel.x.solutionValue;

  thisOplModel.convertAllIntVars();
  thisOplModel.x.UB=xvalue;
  thisOplModel.x.LB=xvalue;
  if (cplex.solve()) {
    writeln("Relaxed Model");   
    writeln("OBJECTIVE: ",cplex.getObjValue());  
    writeln("dual CTX:",thisOplModel.ctx.dual);
    writeln("dual CTY:",thisOplModel.cty.dual);
  }

} 

给出

Integer Model
OBJECTIVE: 1.5
dual CTX:undefined
dual CTY:undefined
Relaxed Model
OBJECTIVE: 1.5
dual CTX:0
dual CTY:1

致谢

相关问题