Суммирование в CPLEX с суффиксным кортежем - PullRequest
0 голосов
/ 29 мая 2018

Я попытался получить суммирование в CPLEX в кортеже, как показано ниже, 1 элемент внутри и 1 элемент вне кортежа суффикса assignment, но он ошибся.

    forall(<i, h> in order) {
        sum(<<w, i>, h> in assignment) J[<<w, i>, h>] <= production[<i, h>];

Может кто-нибудь помочь мне объяснитьэто?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Давайте проверим эту модель, чтобы понять, почему мне нужно, чтобы == и production были переменной решения, J - выход на одного работника, а производство - общее число на каждую дату.

tuple ordertype
{
int part;  // 2 parts: 1 and 2
int period;  // period 1...5
}     

tuple workerskilltype
{
int worker; // 4 workers: 1..4
int part;   // running time per worker per part
}
tuple assignmenttype
{
workerskilltype workerskill;
int h;
}

{ordertype} order = {<1,1>, <1,2>, <1,3>, <1,4>, <1,5>, <2,1>, <2,2>, <2,3>, <2,4>, <2,5>}; 
int orderQty[order] = [0,0,2000,0,0,0,0,0,0,5000];

{workerskilltype} workerskill = {<1,1>, <1,2>, <2,1>, <3,2>, <4,1>, <4,2>}; 

float workerSkillRunning[workerskill] = [3,7,3.5,6.5,7.8,2.9,6.7];

int step[k in 1..5] = k;
{assignmenttype} assignment={<<w, i>, h> | <w, i> in workerskill, k in 1..5, h in 1..step[k]}; 

int production[i in order]=i.period;
dvar int J[<<w, i>, h> in assignment];

dvar int+ inventory[<i, h> in order]; 
dvar int+ backorder[<i, h> in order];

dexpr float X = sum(<i, h> in order) backorder[<i, h>];

minimize X;

 subject to
 {
 forall (<i, h> in order) {
        if(h == 1){ 

            orderQty[<i, h>] == production[<i, h>]  - inventory[<i, h>] + backorder[<i, h>];    
        }       
        else {      
            orderQty[<i, h>] == production[<i, h>] + inventory[<i, h-1>]  - backorder[<i, h-1>] - inventory[<i, h>] + backorder[<i, h>];
        }   
    } 

forall(<i, h> in order) {
        sum(<<w, i>, h> in assignment) J[<<w, i>, h>] == production[<i, h>];

      }       
}`
0 голосов
/ 29 мая 2018
tuple ordertype
{
int i;
int h;
}     
tuple assignmenttype
{
ordertype o;
int h;
}

{ordertype} order={<1,2>}; 
{assignmenttype} assignment={<<1,2>,3>}; 

int production[i in order]=i.h;
dvar int J[assignment]; 
 subject to
 {
forall(<i, h> in order) {
        sum(<<w, i>, h> in assignment) J[<<w, i>, h>] <= production[<i, h>];

      }        
}

отлично работает

привет

...