在 glpk (gusek) 中实现 Open Shop Scheduling 算法
Implement Open Shop Scheduling algorithm in glpk (gusek)
我尝试使用以下代码在 gusek 中实现 'open shop scheduling' 算法:
.dat:
param endTime := 2809 ;
param nMach := 4 ;
param nJobs := 3 ;
param duration:
1 2 3 :=
1 121 661 6
2 333 168 489
3 343 621 212
4 171 505 324 ;
.mod:
param endTime integer > 0;
param nMach integer > 0;
param nJobs integer > 0;
param duration {1..nMach, 1..nJobs};
var Start {1..nMach, 1..nJobs} integer >= 0, <= endTime;
var Makespan integer >= 0, <= endTime;
minimize Objective: Makespan;
subject to NoJobConflicts
{m in 1..nMach, j1 in 1..nJobs, j2 in j1+1..nJobs}:
Start[m,j1] + duration[m,j1] <= Start[m,j2] or
Start[m,j2] + duration[m,j2] <= Start[m,j1];
subject to NoMachineConflicts
{m1 in 1..nMach, m2 in m1+1..nMach, j in 1..nJobs}:
Start[m1,j] + duration[m1,j] <= Start[m2,j] or
Start[m2,j] + duration[m2,j] <= Start[m1,j];
subj to MakespanDefn {m in 1..nMach, j in 1..nJobs}:
Start[m,j] + duration[m,j] <= Makespan;
但我收到以下错误:"syntax error in constraint statement. Context: ...tart [ m , j1 ] + duration [ m , j1 ] <= Start [ m , j2 ] or "。
据我所知,gusek 用于线性问题,而运算符 'or' 用于非线性问题。
有没有办法使用 gusek 解决这个问题。
欢迎任何提示。
类似
的约束
x + a ≤ y or
y + b ≤ x
可以用大M约束来实现:
x + a ≤ y + M⋅δ
y + b ≤ x + M(1-δ)
δ ∈ {0,1}
其中 M
是一个足够大的常量(要尽可能严格地选择)。
所以在你的情况下:
subject to NoJobConflicts
{m in 1..nMach, j1 in 1..nJobs, j2 in j1+1..nJobs}:
Start[m,j1] + duration[m,j1] <= Start[m,j2] + M*d1[m,j1,j2];
subject to NoJobConflicts2
{m in 1..nMach, j1 in 1..nJobs, j2 in j1+1..nJobs}:
Start[m,j2] + duration[m,j2] <= Start[m,j1] + M*(1-d1[m,j1,j2]) ;
M
可以是规划范围的长度,d1
是一个二进制变量。
另一种情况类似。在那里你应该使用不同的二进制变量。例如d2
。
我尝试使用以下代码在 gusek 中实现 'open shop scheduling' 算法:
.dat:
param endTime := 2809 ;
param nMach := 4 ;
param nJobs := 3 ;
param duration:
1 2 3 :=
1 121 661 6
2 333 168 489
3 343 621 212
4 171 505 324 ;
.mod:
param endTime integer > 0;
param nMach integer > 0;
param nJobs integer > 0;
param duration {1..nMach, 1..nJobs};
var Start {1..nMach, 1..nJobs} integer >= 0, <= endTime;
var Makespan integer >= 0, <= endTime;
minimize Objective: Makespan;
subject to NoJobConflicts
{m in 1..nMach, j1 in 1..nJobs, j2 in j1+1..nJobs}:
Start[m,j1] + duration[m,j1] <= Start[m,j2] or
Start[m,j2] + duration[m,j2] <= Start[m,j1];
subject to NoMachineConflicts
{m1 in 1..nMach, m2 in m1+1..nMach, j in 1..nJobs}:
Start[m1,j] + duration[m1,j] <= Start[m2,j] or
Start[m2,j] + duration[m2,j] <= Start[m1,j];
subj to MakespanDefn {m in 1..nMach, j in 1..nJobs}:
Start[m,j] + duration[m,j] <= Makespan;
但我收到以下错误:"syntax error in constraint statement. Context: ...tart [ m , j1 ] + duration [ m , j1 ] <= Start [ m , j2 ] or "。
据我所知,gusek 用于线性问题,而运算符 'or' 用于非线性问题。
有没有办法使用 gusek 解决这个问题。
欢迎任何提示。
类似
的约束x + a ≤ y or
y + b ≤ x
可以用大M约束来实现:
x + a ≤ y + M⋅δ
y + b ≤ x + M(1-δ)
δ ∈ {0,1}
其中 M
是一个足够大的常量(要尽可能严格地选择)。
所以在你的情况下:
subject to NoJobConflicts
{m in 1..nMach, j1 in 1..nJobs, j2 in j1+1..nJobs}:
Start[m,j1] + duration[m,j1] <= Start[m,j2] + M*d1[m,j1,j2];
subject to NoJobConflicts2
{m in 1..nMach, j1 in 1..nJobs, j2 in j1+1..nJobs}:
Start[m,j2] + duration[m,j2] <= Start[m,j1] + M*(1-d1[m,j1,j2]) ;
M
可以是规划范围的长度,d1
是一个二进制变量。
另一种情况类似。在那里你应该使用不同的二进制变量。例如d2
。