狠狠撸

狠狠撸Share a Scribd company logo
翱搁学会2015年秋季研究発表会
2015年9月11日
(株)構造計画研究所
斉藤努
翱搁学会2015年秋季研究発表会
?実務における組合せ最適化
?標準問題
?数理問題
?数理問題と標準問題の関係
?最適化問題を解く
?最適化に適したソフトウェア
?最小全域木問題
?ナップサック問題
?混合整数最適化問題
?まとめ
翱搁学会2015年秋季研究発表会
?実務では組合せ最適化のニーズがいろいろある。
?大学と違い、自ら問題を見つけないといけない。
?同じ課題であっても、様々な問題としてとらえる
ことができる。
?→組合せ最適化に関する全般的な理解が必要
?組合せ最適化における体系化が役に立つ
? 問題を分類してとらえる
翱搁学会2015年秋季研究発表会
?「標準問題」と「数理問題」という見方
?標準問題とは、よく現れる問題を一般化したもの
? ナップサック問題
? 最短路問題
? …
?数理問題とは、変数や制約や目的関数の属性に
よるもの
? 線形最適化問題
? 混合整数最適化問題
? …
翱搁学会2015年秋季研究発表会
?実務でよく現れる標準問題(23個)を厳選した。
?似たようなものをまとめて標準問題クラスとした。
? グラフ?ネットワーク問題
? 経路問題
? 集合被覆?分割問題
? スケジューリング問題
? 切出し?詰込み問題
? 配置問題
? 割当?マッチング問題
?「組合せ最適化 標準問題」で検索
翱搁学会2015年秋季研究発表会
?連続か離散か
?線形か非線形か
?制約つきか制約なしか
?凸か非凸か
?微分可能かどうか
?確率的かどうか
?…
?→ 研究者によって多くの分類がある
翱搁学会2015年秋季研究発表会
?実務者にとっての組合せ最適化という文脈で
? 最初は、ざっくり3分類を覚えればよい
超難しい
難しい
やさしい
翱搁学会2015年秋季研究発表会
二面的
翱搁学会2015年秋季研究発表会
?1つの課題をいろいろな問題としてとらえるこ
とができる。
? 混合整数最適化問題(0-1変数で割当を表現)
? 集合被覆問題(候補を列挙して選ぶ)
? 最大マッチング问题(割当をマッチングと见る)
翱搁学会2015年秋季研究発表会
?数理問題→汎用ソルバー
?標準問題→専用ソルバー
?一般的には、標準問題の方が効率よく解ける
可能性がある。
?標準問題では、とらえきれないこともある。
?→ 数理問題としてとらえる
翱搁学会2015年秋季研究発表会
?問題を定義する(定式化)
?ソルバーで実行する
?専門知識がなくても、問題を数理モデルで表
せれば解くことができる。
? 数理モデルとは、数式によるモデル
? 混合整数最適化では、数理モデルの作成の仕方が
上手くないと、規模により解けないこともある。
翱搁学会2015年秋季研究発表会
?Pythonをおすすめ
? 無料で始められる
? 記述が簡単
? 理解しやすい、早くつくれる、保守しやすい
? 多くのソルバーが扱える
? Gurobi、CPLEX、SCIP、CBC、GLPK、lp_solve、cvxopt等
? 実行速度は、ソルバーにかかるものが大きい
翱搁学会2015年秋季研究発表会
import pandas as pd, networkx as nx, matplotlib.pyplot as plt
from ortoolpy import graph_from_table, networkx_draw
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)
t = nx.minimum_spanning_tree(g)
pos = networkx_draw(g)
nx.draw_networkx_edges(t, pos, width=3)
plt.show()
print(t.edges())
[(0, 1),
(0, 3),
(0, 4),
(2, 3),
(4, 5)]
翱搁学会2015年秋季研究発表会
usage
Signature: knapsack(size, weight, capacity)
Docstring:
ナップサック問題
価値の最大化
入力
size: 荷物の大きさのリスト
weight: 荷物の価値のリスト
capacity: 容量
出力
価値の総和と選択した荷物番号リスト
from ortoolpy import knapsack
size = [21, 11, 15, 9, 34, 25, 41, 52]
weight = [22, 12, 16, 10, 35, 26, 42, 53]
capacity = 100
print(knapsack(size, weight, capacity))
結果
(105.0, [0, 1, 3, 4, 5])
翱搁学会2015年秋季研究発表会
from ortoolpy import addvar
size = [21, 11, 15, 9, 34, 25, 41, 52]
weight = [22, 12, 16, 10, 35, 26, 42, 53]
capacity = 100
m = LpProblem(sense=LpMaximize)
v = [addvar(cat=LpBinary) for _ in size]
m += lpDot(weight, v)
m += lpDot(size, v) <= capacity
m.solve()
print([i for i in range(len(size)) if value(v[i]) > 0.5])
結果
[0, 1, 3, 4, 5]
モデル
変数
目的関数
制約
翱搁学会2015年秋季研究発表会
?定式化とPythonを なるべく一致させる。
?定式化でもクラス(組込とユーザー定義)を扱える
ものとする。
?定式化でもforやifも使えるものとする。
?定式化でも関数定義ができるものとする。
?定式化とPythonプログラムで変数名を統一する。
?利用しない一時変数は、「_」とする。
翱搁学会2015年秋季研究発表会
?シンプル
? 覚えやすい、理解しやすい、教育に向いている
?多くのプラットフォームで動く
? Windows、Linux、Mac
?多くの便利なライブラリが使える
? pulpとpandasを組合わせると変数管理が楽に!
?何でもできる
? 全ての処理をPythonにすることも可能
? やりたいこと毎に言語を変える必要がない
翱搁学会2015年秋季研究発表会
?標準問題と数理問題による俯瞰で全体理解
?Pythonによる実行のしきいが下がった
?→ 組合せ最適化が使えるようになる
?→ 「組合せ最適化を使おう」

More Related Content

翱搁学会 2015/9/11 組合せ最適化の体系化とフリーソフトによる最適化