Я хочу найти двойственное ограничение в cplex - PullRequest
0 голосов
/ 08 октября 2018

как найти двойственное для ограничения, которое дано ниже:

    forall(t in tree, p in Pattern, m in Machine) Constraint1:
    TreeCutTime[t]>=BatchCutTime[p][m] - 1000(1- 
    p.BatchSetup[t]*BatchSelected[p][m])

where, 
Range of t = 1..10
Range of m = 1..2
Pattern = <1 [1 0 0 0 0 0 0 0 0 0], 5,5> and so on
BatchSelected= [1 0 0 0 0 0 0 0 0 0] and so on.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

с 3D нужно только индексировать:

dvar float+ Gas[1..2][1..2][1..2];
dvar float+ Chloride[1..2][1..2][1..2];

dvar float obj;
maximize
 obj; 
subject to {
ctObj:obj==sum(i,j,k in 1..2 )(40 * Gas[i,j,k])  + sum(i,j,k in 1..2 ) (50 * Chloride[i,j,k]);

  forall(i,j,k in 1..2) ctMaxTotal:     
    Gas[i,j,k] + Chloride[i,j,k] <= 50;
  forall(i,j,k in 1..2 )ctMaxTotal2:    
    3 * Gas[i,j,k] + 4 * Chloride[i,j,k] <= 180;
  forall(i,j,k in 1..2 ) ctMaxChloride:  
    Chloride[i,j,k] <= 40;
}

execute
{
writeln("Chloride=",Chloride);
writeln("Gas=",Gas);
writeln("dual=",ctMaxTotal[1][2][1].dual);
}
0 голосов
/ 08 октября 2018

позвольте мне привести небольшой пример из примера volsay, который находится в каталоге OPL.

dvar float+ Gas;
dvar float+ Chloride;


maximize
  40 * Gas + 50 * Chloride;
subject to {
  ctMaxTotal:     
    Gas + Chloride <= 50;
  ctMaxTotal2:    
    3 * Gas + 4 * Chloride <= 180;
  ctMaxChloride:  
    Chloride <= 40;
}

execute
{
writeln(ctMaxTotal.dual);
writeln(ctMaxTotal2.dual);
writeln(ctMaxChloride.dual);

}

, который дает

// solution (optimal) with objective 2300
10
10
0
...