2.25.3 ジョブショップ問題
例題 ジョブショップ問題
前節のオープンショップ問題の条件の下,各仕事は以下の順に処理されなければならないものとします.
作業1(機械1) | 作業2(機械2) | 作業3(機械3) | |
---|---|---|---|
仕事a | 1 | 3 | 2 |
仕事b | 1 | 2 | 3 |
仕事c | 2 | 1 | 3 |
この場合の最後の作業の完了時刻が最小となるようにするには,どのように機械を割り振ればよいでしょうか.
この問題は,先行制約が以下の様に変更されます.
先行制約 | |
仕事aの作業1は,仕事aの作業3に先行する | |
仕事aの作業3は,仕事aの作業2に先行する | |
仕事bの作業1は,仕事bの作業2に先行する | |
仕事bの作業2は,仕事bの作業3に先行する | |
仕事cの作業2は,仕事cの作業1に先行する | |
仕事cの作業1は,仕事cの作業3に先行する |
上記の先行制約をデータから与えられるようにC++SIMPLEのモデルとデータを修正します.
// 作業集合 Set J; // 仕事 Element j(set = J); Set S; // 作業 Element s(set = S); // モード集合 Set M; Element m(set = M); Set AvailMode(name = "AvailMode", index = (j, s)); // 各仕事のオペレーションにおいて処理されるモード // 資源集合 Set R; Element r(set = R); // 作業時間集合 Set D; // 各モードの作業時間の最大 Element d(set = D); // 期間集合 Set T; // スケジュール期間 T = "0 .. 30"; Element t(set = T); // アクティビティ(変数) Activity act(name = "act", index = (j, s), mode = AvailMode[j, s]); // 定数 // 必要資源量 ResourceRequire req(name = "req", mode = M, resource = R, duration = D); // 資源供給量 ResourceCapacity cap(name = "cap", resource = R, timeStep = T); cap[r, t] = 1; // 目的関数(最後の作業の完了時刻の最小化) Objective f(type = minimize); f = completionTime; // 先行制約 Set Prec(name = "Prec", dim = 3); Element u(set = S); Element v(set = S); act[j, u] < act[j, v], (j, u, v) < Prec; // 求解最大時間の設定 options.maxtim = 15; // 求解 solve(); // 結果の標準出力 simple_printf("act[%s, %d] = %d\n", j, s, act[j, s].startTime);
データファイルは「2.25.2フローショップ問題」で使用したreq.datと次のdata.datを使用します.
AvailMode = [a, 1] mode_a_1 [a, 2] mode_a_2 [a, 3] mode_a_3 [b, 1] mode_b_1 [b, 2] mode_b_2 [b, 3] mode_b_3 [c, 1] mode_c_1 [c, 2] mode_c_2 [c, 3] mode_c_3 ; Prec = a 1 3 a 3 2 b 1 2 b 2 3 c 2 1 c 1 3 ;
実行すると,各作業の開始時刻が以下のように出力されます.
act[a, 1] = 0 act[a, 2] = 14 act[a, 3] = 5 act[b, 1] = 5 act[b, 2] = 10 act[b, 3] = 14 act[c, 1] = 10 act[c, 2] = 0 act[c, 3] = 20
上に戻る