0

混合整数計画法モデルを構築しており、決定変数の最小値と mzximum を定義したいと考えています。

たとえば、C={19, 20, 30} としましょう

C_early を 19 に、C_late を 30 に定義したいと思います。次に、差を最小限に抑えたいと思います。C_late 部分は補助制約を使用して正常に定義されましたが、min 部分に何かが欠けていると思います。

ここに私のコードがあります:

int I=...;
int J=...;
int K=...; 
int T=...;

range Order = 1..I;
range Job = 1..J;
range Machine=1..K;
range Position = 1..T;

int p[Order][Job]=...;
int a[Order][Job][Machine]=...;


dvar boolean x[Order][Job][Machine][Position];
dvar int C_late[Order];
dvar int C_early[Order];
dvar int diff[Order];
dvar int+ y [Machine][Position];
dvar int+ C[Order][Job];
dvar int Cmax;


minimize 
Cmax;

subject to{
// Ensure that a job is scheduled on one position only
forall(i in Order, j in Job: p[i][j]>0) sum(t in Position, m in Machine) 
x[i][j][m][t] == 1;

forall(m in Machine, t in Position) sum(i in Order, j in Job: p[i][j]>0)
x[i][j][m][t] <= 1;  

forall(i in Order, j in Job: p[i][j]>0 , m in Machine, t in Position)
   x[i][j][m][t] - a[i][j][m] <= 0;

forall (m in Machine)
y[m][1] >= sum(i in Order, j in Job) p[i][j]*x[i][j][m][1];

forall(m in Machine, t in Position: t>=2)
y[m][t] >= y[m][t-1] + sum(i in Order, j in Job) p[i][j]*x[i][j][m][t];

forall(i in Order, j in Job: p[i][j]>0, m in Machine, t in Position) 
C[i][j] >= y[m][t] - 100000*(1 - x[i][j][m][t]);

forall(m in Machine) 
sum(i in Order, j in Job, t in Position) p[i][j]*x[i][j][m][t] - Cmax <= 0;

forall(i in Order, j in Job: p[i][j]>0)
C[i][j] >= C_early[i];

forall(i in Order, j in Job: p[i][j]>0)
C[i][j] <= C_late[i];

forall (i in Order)
C_late[i] - C_early[i] <= diff[i]
}

最後の 3 つの制約は、私の質問に関連しています。

データセットの例:

J=3;
K=3;
T=10;
I=10;

p= [
        [15,0,0], 
        [14,0,0],
        [16,0,0],
        [15,0,0],
        [14,0,0],
        [16,0,0],
        [16,0,0],
        [14,0,0],
        [15,0,0],
        [17,16,14]
            ];

a = [
        [[1,1,1], [0,0,0], [0,0,0]], 
        [[0,1,1], [0,0,0], [0,0,0]],
        [[1,1,1], [0,0,0], [0,0,0]],
        [[1,0,1], [0,0,0], [0,0,0]],
        [[0,1,1], [0,0,0], [0,0,0]],
        [[1,1,1], [0,0,0], [0,0,0]],
        [[0,1,1], [0,0,0], [0,0,0]],
        [[0,1,1], [0,0,0], [0,0,0]],
        [[1,1,1], [0,0,0], [0,0,0]],
        [[1,1,1], [1,1,1], [1,0,1]],
            ]; 

min 制約に big m メソッドを使用する必要があることはわかっていますが、どうすればよいかわかりません ありがとう、

4

1 に答える 1

0

差分ではなく、Cmax のみを最小化します。これはおそらくエラーです。

于 2015-10-07T17:05:35.227 に答える