Slide 1

Slide 1 text

ちょっとかしこく生きよう なごみそ@Kawasaki.rb 60th

Slide 2

Slide 2 text

自己紹介 ● 名前: なごみそ(@NagominHotMotto) ● 仕事: 夏と冬に有明周辺で戦うこと ● 副業: SEっぽいことをしています

Slide 3

Slide 3 text

使用できるロッカーも変更になるため ロッカーの再割当てが必要になった 社内の席替え

Slide 4

Slide 4 text

会社から出てきた割当案が あまりにも ク○ だった

Slide 5

Slide 5 text

何が ク○ だったか

Slide 6

Slide 6 text

何が○ソだったか ● 思考を完全停止させた配置 – 社員番号順に配置させただけ ● 自席とロッカーが 遠い ここ○ソ

Slide 7

Slide 7 text

頭にきたのでロッカーの割当を 数理最適化 するプログラムを作った

Slide 8

Slide 8 text

数理最適化してみた ロッカーの割当てを 整数計画問題 にした – 線形計画問題(Integer Programming; IP): ● 目的関数が線形関数で表現できて変数ベクトルの 要素が整数のみ かつ制約条件が線形関数と不等式で表現できる問題

Slide 9

Slide 9 text

どんなことをしたか ● 式を作る ● 座席とロッカーの座標情報を取得する ● ソルバーで解く

Slide 10

Slide 10 text

どんなことをしたか ● 式を作る ● 座席とロッカーの座標情報を取得する ● ソルバーで解く

Slide 11

Slide 11 text

式を作る ● もろもろ定義 – 座席: – ロッカー: – 定数: – 変数:

Slide 12

Slide 12 text

式を作る ● 目的関数 – 全員の座席からロッカーまでの距離総和 – これが最小になる x を探す

Slide 13

Slide 13 text

式を作る ● 制約条件 – ロッカーはひとり必ず1個割当てる – ロッカー1区画にはn人まで割当てられる

Slide 14

Slide 14 text

どんなことをしたか ● 式を作る ● 座席とロッカーの座標情報を取得する ● ソルバーで解く

Slide 15

Slide 15 text

座席とロッカーの 座標情報を取得する ● 座席とロッカーの地図はExcel製(ここもク○) ● Pandas + Xlrd でデータフレームとして読込み ● データフレームの0行0列要素を原点として 座席とロッカーの座標を取得 さくら いずみ うづき りん あこ みお ロッカーA ロッカーB さくら=(0,1) いずみ=(1,1) あここ=(0,2) ロッカーA=(0,6) ロッカーB=(1,6) S L

Slide 16

Slide 16 text

どんなことをしたか ● 式を作る ● 座席とロッカーの座標情報を取得する ● ソルバーで解く

Slide 17

Slide 17 text

ソルバーで解く ● PuLP ( https://pythonhosted.org/PuLP/) ● Python用の線形計問題最適化モジュール ● 作って式を違和感なくコード化できる(と思った)

Slide 18

Slide 18 text

直感的(?) x = { (l, s): pulp.LpVariable( name='{}:{}'.format(l, s), lowBound=0, upBound=1, cat=pulp.LpInteger ) for l, s in product(L, S) }

Slide 19

Slide 19 text

直感的(?) problem += pulp.lpSum( c[l, s] * x[l, s] for l, s in product(L, S) ), 'TotalDistance'

Slide 20

Slide 20 text

直感的(?) for l in L: problem += \ sum(x[l, s] for s in s) <= n, \ 'Constraint_leq_{}'.format(l)

Slide 21

Slide 21 text

最近はあんまりメンテされていないみたい

Slide 22

Slide 22 text

本当に席に近いロッカーを 手に入れられたのか?

Slide 23

Slide 23 text

こたえ 微妙でした

Slide 24

Slide 24 text

反省 ● 総和でしか評価していないのでバラツキがある – 遠いヒトと近いヒトがいる(私は遠かった……) ● 忖度できていない – エラいヒトも問答無用で遠い場所に配置

Slide 25

Slide 25 text

ちょっとかしこく生きよう ● 何気ない身近な問題を技術でカイゼンできた ● 思考停止は誰も幸せにならないよね – 歩く距離が伸びて疲れる...... – 人手で割当てるの面倒くさい...... ● 要改善点 – バラツキを考慮する – 忖度できるように条件を考える

Slide 26

Slide 26 text

おしまい