ちょっとかしこく生きよう

 ちょっとかしこく生きよう

※2018-05-23 23:50 式が間違っていたので修正。

C63d09c1a63a45d6df11597a84742830?s=128

なごみそ

May 23, 2018
Tweet

Transcript

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

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

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

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

  5. 何が ク◦ だったか

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

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

  8. 数理最適化してみた ロッカーの割当てを 整数計画問題 にした – 線形計画問題(Integer Programming; IP): • 目的関数が線形関数で表現できて変数ベクトルの

    要素が整数のみ かつ制約条件が線形関数と不等式で表現できる問題
  9. どんなことをしたか • 式を作る • 座席とロッカーの座標情報を取得する • ソルバーで解く

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

  11. 式を作る • もろもろ定義 – 座席: – ロッカー: – 定数: –

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

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

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

  15. 座席とロッカーの 座標情報を取得する • 座席とロッカーの地図はExcel製(ここもク◦) • Pandas + Xlrd でデータフレームとして読込み •

    データフレームの0行0列要素を原点として 座席とロッカーの座標を取得 さくら いずみ うづき りん あこ みお ロッカーA ロッカーB さくら=(0,1) いずみ=(1,1) あここ=(0,2) ロッカーA=(0,6) ロッカーB=(1,6) S L
  16. どんなことをしたか • 式を作る • 座席とロッカーの座標情報を取得する • ソルバーで解く

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

  18. 直感的(?) x = { (l, s): pulp.LpVariable( name='{}:{}'.format(l, s), lowBound=0,

    upBound=1, cat=pulp.LpInteger ) for l, s in product(L, S) }
  19. 直感的(?) problem += pulp.lpSum( c[l, s] * x[l, s] for

    l, s in product(L, S) ), 'TotalDistance'
  20. 直感的(?) for l in L: problem += \ sum(x[l, s]

    for s in s) <= n, \ 'Constraint_leq_{}'.format(l)
  21. 最近はあんまりメンテされていないみたい

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

  23. こたえ 微妙でした

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

  25. ちょっとかしこく生きよう • 何気ない身近な問題を技術でカイゼンできた • 思考停止は誰も幸せにならないよね – 歩く距離が伸びて疲れる...... – 人手で割当てるの面倒くさい...... •

    要改善点 – バラツキを考慮する – 忖度できるように条件を考える
  26. おしまい