Давайте проверим эту модель, чтобы понять, почему мне нужно, чтобы ==
и 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>];
}
}`