2.2 モデルの記述
Nuorium Optimizerを用いるためには、解きたい問題を数理最適化問題として表現し、モデリング言語C++SIMPLEで記述する必要があります。ここでは2.1で取り上げた例題をSIMPLEで記述します。
本例題を数理最適化問題として表現すると次のようになります。
集合 | |
仕事の集合 | |
人の集合 | |
変数(0-1整数変数) | |
仕事を人に割り当てるならば、そうでないならば | |
定数 | |
仕事を人に割り当てる際のコスト | |
仕事を人が行う際の熟練度 | |
仕事に割り振る必要がある人数 | |
仕事に最低必要なクオリティ | |
目的関数(最小化) | |
コストの総和 | |
制約条件 | |
各仕事に必要人数割り当てる | |
各人には、最大3つまでの仕事を割り当てることができる | |
各仕事に必要なクオリティを確保する | |
接客、厨房は違う人が担当する(同じ人が接客と厨房を兼ねない) |
上記の数理最適化問題をC++SIMPLEで記述すると、次のようになります。
// 集合の宣言 Set Job; Set People; Element j(set = Job); Element p(set = People); // 変数の宣言 IntegerVariable x(type = binary, index = (j, p), name = "割り当て"); // 定数の宣言 Parameter cost(index = (j, p), name = "コスト"); Parameter jyukuren(index = (j, p), name = "熟練度"); Parameter necessary(index = j, name = "必要人数"); Parameter quality(index = j, name = "必要クオリティ"); // 各仕事に必要人数割り当てる sum(x[j, p], p) == necessary[j]; // 各人には,最大 3 つまでの仕事を割り当てることができる sum(x[j, p], j) <= 3; // 各仕事に必要なクオリティを確保する sum(x[j, p] * jyukuren[j, p], p) >= quality[j]; // 接客,厨房は違う人が担当する sum(x[j, p], (j, j == "接客" || j == "厨房")) <= 1; // 目的関数(総コスト) Objective total_cost(type = minimize, name = "総コスト"); total_cost = sum(cost[j, p] * x[j, p], (j, p));
上に戻る