数理最適化セミナーのご案内

2.2 モデルの記述

 Nuorium Optimizerを用いるためには、解きたい問題を数理最適化問題として表現し、モデリング言語C++SIMPLEで記述する必要があります。ここでは2.1で取り上げた例題をSIMPLEで記述します。

 本例題を数理最適化問題として表現すると次のようになります。

集合
$JOB = \{接客, 厨房, レジ打ち, 仕入, 掃除, 仕込み\}$ 仕事の集合
$PEOPLE = \{安藤, 佐藤, 鈴木, 山本, 渡辺\}$ 人の集合
 
変数(0-1整数変数)
$x_{jp}, j \in JOB, p \in PEOPLE$ 仕事$j$を人$p$に割り当てるならば$x_{jp}=1$、そうでないならば$x_{jp}=0$
 
定数
$cost_{jp}, j \in JOB, p \in PEOPLE$ 仕事$j$を人$p$に割り当てる際のコスト
$jyukuren_{jp}, j \in JOB, p \in PEOPLE$ 仕事$j$を人$p$が行う際の熟練度
$necessary_j, j \in JOB$ 仕事$j$に割り振る必要がある人数
$quality_j, j \in JOB$ 仕事$j$に最低必要なクオリティ
 
目的関数(最小化)
$\displaystyle \sum_{j,p} cost_{jp} \times x_{jp}$ コストの総和
 
制約条件
$\displaystyle \sum_p x_{jp}  = necessary_j, \forall j \in Job$ 各仕事に必要人数割り当てる
$\displaystyle \sum_j x_{jp} \le 3, \forall p \in PEOPLE$ 各人には、最大3つまでの仕事を割り当てることができる
$\displaystyle \sum_p jyukuren_{jp} \times x_{jp} \ge quality_j, \forall j \in JOB$ 各仕事に必要なクオリティを確保する
$\displaystyle \sum_{j,j \in \{接客,厨房\}} x_{jp} \le 1, \forall p\in PEOPLE$ 接客、厨房は違う人が担当する(同じ人が接客と厨房を兼ねない)

 上記の数理最適化問題を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));

 

 

上に戻る