モデルの記述

2.2. モデルの記述#

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

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

集合

\(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\)

接客、厨房は違う人が担当する(同じ人が接客と厨房を兼ねない)

上記の数理最適化問題を PySIMPLE で記述すると、次のようになります。

 1from pysimple import *
 2from pysimple.ext import excel
 3
 4# 問題の作成
 5problem = Problem()
 6
 7# 集合の宣言
 8j = Element(dim=1, value=excel['仕事'])
 9p = Element(dim=1, value=excel['従業員'])
10
11# 変数の宣言
12excel['割り当て'] = x = BinaryVariable(index=(j,p))
13
14# 定数の宣言
15cost = Parameter(index=(j,p), value=excel['コスト'])
16jyukuren = Parameter(index=(j,p), value=excel['熟練度'])
17necessary = Parameter(index=j, value=excel['必要人数'])
18quality = Parameter(index=j, value=excel['必要クオリティ'])
19
20# 各仕事に必要人数割り当てる
21problem += Sum(x[j,p], p) == necessary[j]
22# 各人には,最大 3 つまでの仕事を割り当てることができる
23problem += Sum(x[j,p], j) <= 3
24# 各仕事に必要なクオリティを確保する
25problem += Sum(x[j,p] * jyukuren[j,p], p) >= quality[j]
26# 接客,厨房は違う人が担当する
27j2 = Element(value=['接客','厨房'])
28problem += Sum(x[j2,p], j2) <= 1
29
30# 目的関数(総コスト)
31problem += Sum(cost[j,p]*x[j,p],(j,p)), "総コスト"
32
33# 求解
34problem.solve()
35
36excel['総コスト'] = Parameter(value=problem.objective.val)