トップ > 製品概要 > NUOPT の更新情報 > NUOPT 8 の更新情報 > rcpsp 用 Simple モデルサンプル集

NUOPT8の更新情報

rcpsp 用 Simple モデルサンプル集

  1. 人員スケジュール問題(作業完了時刻最小化モデル)
  2. 人員スケジュール問題(納期遅れ最小化モデル)
  3. 人員スケジュール問題(工程分割モデル)
  4. 電車運行モデル
  1. 人員スケジュール問題(作業完了時刻最小化モデル)

    本モデルは全てのモデルの基本となるので、説明を詳しくしています。

    
    //
    //  人員スケジュール問題(作業完了時刻最小化モデル)
    //
    
    /*****************************************************
     6 つの仕事を A、B、C、の 3 人に割り振ろうとしている。
    各一は同時に二つ以上の仕事はできず、A、B、C、の習熟度により、
    各人が仕事の完成に必要な日数はことなっている。
     6 つの仕事それぞれは均質である。全ての仕事について、各人の所要時間は以下となる。
    A 6 日
    B 8 日
    C 11 日
    このとき、すべての仕事が完成するまで最短で何日所要するか、
    その際のA、B、C、への仕事の割り当てはどのようにすればよいか。
    *****************************************************/
    
    /*****************************************************
    モード( 3 人の誰が仕事を行うか)
    今回A、B、C、の 3 人がいるので、
    モードは 3 種類用意する。
    *****************************************************/
    Set M = "A_does B_does C_does"; 
    Element m(set=M);
    
    /*****************************************************
    資源( 3 人の仕事ができる容量)
    人間を資源と考える。今回は 3 人いるので、
     3 種類の資源を用意する。
    *****************************************************/
    Set R = "A B C";   
    Element r(set=R);
    
    /*****************************************************
    各モードの作業時間の最大
    今回は C が仕事を終えるのに 11 日かかるので、
    作業時間は 11 まで用意しておく。
    *****************************************************/
    Set D = "1 .. 11"; 
    Element d(set=D);
    
    /* モードと資源消費の関連 */
    ResourceRequire  req(mode=M, resource=R, duration=D);
    
    /*****************************************************
    以下で関連付けをしている。
    例えば、
     req["A_does,A",d] = 1, 1 <= d <= 6;
    は A_does というモードで仕事をするときには、
     A という資源を使い、1 <= d <= 6、の分だけ作業が必要である
    (言い換えると、 6 日間で作業が終わるということ)
    ということを表している。
    *****************************************************/
    
    req["A_does,A",d] = 1, 1 <= d <= 6;
    req["B_does,B",d] = 1, 1 <= d <= 8;
    req["C_does,C",d] = 1, 1 <= d <= 11;
    
    /* アクティビティ( 6 つの仕事)*/
    Set J = "1 .. 6";
    Element j(set=J);
    
    
    /* いつ、どの仕事を、どのモードで行うかを表す変数 */
    Activity act(index=j,mode=M); 
    
    /* スケジューリング全体の時間(日単位) */
    Set T = "0 .. 40"; 
    Element t(set=T);
    
    /* 利用可能な資源の定義 */
    ResourceCapacity cap(resource=R,timeStep=T);
    
    /*「 各人は一日1つの仕事しかできない」というのを以下で表現している。*/
    cap[r,t] = 1;
    
    /*****************************************************
    例えば、
    cap["A,3"] = 0;
    としておけば、A という資源は t = 3 のとき、
     0 であるということになる。すなわち、
     A は 3 日目は休むということが表現できる。
    *****************************************************/
    
    /* 目的関数 作業完了時刻最小化 */
    Objective f(type=minimize);
    f = completionTime;
    
    options.maxtim = 5;
    solve();
    
    /* ガントチャート出力 */
    Gantt g;
    g.add(act[j],j);
    g.dump();
    
    

    上述のモデルから

    のようなガントチャートが得られます(すべての人員が同時に一つしかタスクを実行できない)。

  2. 人員スケジュール問題(納期遅れ最小化モデル)

    
    //
    //  人員スケジュール問題(納期遅れ最小化モデル)
    //
    Set M = "A_does B_does C_does"; // モード
    Element m(set=M);
    Set R = "A B C";   // 資源
    Element r(set=R);
    Set D = "1 .. 11"; // 各モードの作業時間の最大
    Element d(set=D);
    // モードと資源消費の連関
    ResourceRequire  req(mode=M, resource=R, duration=D);
    // アクティビティ
    Set J = "1 .. 6";
    Element j(set=J);
    Parameter due(index=j);
    Activity act(index=j,mode=M,duedate=due[j]);
    // 利用可能な資源の定義
    Set T = "0 .. 40"; // スケジューリング全体の時間(日単位)
    Element t(set=T);
    ResourceCapacity cap(resource=R,timeStep=T);
    cap[r,t] = 1;
    Objective f(type=minimize);
    f = tardiness;
    options.maxtim = 30;
    solve();
    
    

  3. 人員スケジュール問題(工程分割モデル)

    
    //
    //  人員スケジュール問題(工程分割モデル)
    //
    Set M;
    Element m(set=M); // モード
    Set R;
    Element r(set=R); // 資源
    Set D;
    Element d(set=D); // 各モードの作業時間の最大
    // モードと資源消費の連関
    ResourceRequire  req(mode=M, resource=R, duration=D);
    Set T = "0 .. 40"; // スケジューリング全体期間
    Element t(set=T);
    ResourceCapacity cap(name="cap",resource=R,timeStep=T);
    cap[r,t] = 1;
    
    Set J = "1 .. 6"; // 仕事
    Set S = "1 2 3";  // 工程
    Element j(set=J);
    Element s(set=S);
    Set availMode(index=(j,s)); // アクティビティに適用可能なモード
    Set stepToMode(index=s); 
    Activity act(index=(j,s),mode= stepToMode[s]);
    // 先行制約
    act[j,s-1] < act[j,s], s > 1 ;
    
    // 最後の作業の完了時刻の最小化
    Objective f(type=minimize);
    f = completionTime;
    options.maxtim = 30;
    showSystem();
    solve();
    
    

  4. 電車運行モデル

    本モデルの視覚的イメージ。

    
    //
    //  電車運行モデル
    //
    
    // 処理集合
    Set Act(name= "Act");
    Element a(set=Act);
    
    // モード集合
    Set Mode(name="Mode");
    Element m(set=Mode);
    
    // 資源集合
    Set Resource(name="Resource");
    Element r(set=Resource);
    
    // 処理時間集合
    Set Duration(name="Duration");
    Element d(set=Duration);
    
    // スケジュール期間集合
    Set TimeStep(name= "TimeStep");
    TimeStep = "0 .. 100";
    Element ts(set=TimeStep);
    
    // 資源の必要量
    ResourceRequire rReq(name="rReq", mode=Mode, resource=r, duration=Duration, defaultval=1);
    
    // 資源の供給量
    ResourceCapacity rCap(name="rCap", resource=r, timeStep=TimeStep);
    
    Set Line(name="Line");
    Element l(set=Line);
    rCap[r,ts] = 5, r < Line ;
    rCap[r,ts] = 4, r > Line ;
    
    rCap["lineC-D",ts] = 2;
    //rCap["lineB-C",ts] = 1; // コメントを外す(B-C 間のリソースを減らす)と遅延が発生
    
    // 電車
    OrderedSet Train(name="Train");
    Train = "1 .. 5";
    Element tr(set=Train);
    
    // 区間
    OrderedSet Part(name="Part");
    Part = "1 .. 4";
    Element p(set=Part);
    
    // 駅
    Set Span(name="Span");
    Element s(set=Span);
    
    // 運転モード
    Set runMode(name="runMode", index=(tr,p));
    Element rm(set=runMode[tr,p]);
    
    // 停車モード
    Set waitMode(name="waitMode", index=(tr,s));
    
    // 運転作業
    Parameter dueTime(name="dueTime", index=(tr,p));
    Activity run(name="run", index=(tr,p), mode=runMode[tr,p], duedate = dueTime[tr,p]);
    
    // 停車作業
    Activity wait(name="wait", index=(tr,s), mode=waitMode[tr,s]);
    
    // 運転の後は停車
    run[tr,p] < wait[tr,p], p <= 3;
    wait[tr,p] < run[tr,p+1], p <= 3;
    
    // 遅延時間最小化
    Objective f;
    f = tardiness;
    
    
  5. ガントチャート出力。