14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

組合せ最適化で録画番組を決める

Last updated at Posted at 2016-04-16

仕事の割当問題

複数の仕事を複数のリソースに割当てることを考えます。特定の仕事のペアは同じリソースに割当てることができません。選ばれた仕事の価値の和を最大化します。

具体例を挙げます。

  • いくつかの録画したい放送番組がいくつかあります。
  • いくつかの録画可能な機器があります。
  • 放送時間が重なる番組を同じ機器で録画することはできません。(同時録画禁止)
  • 録画された番組の価値の総和を最大化します。

考え方

以下の5番組を考えます。録画機器は3台あるとします。

名称 開始時刻 終了時刻 価値
A 9:00 9:30 1
B 9:30 10:00 1
C 9:00 10:00 1
D 9:00 9:30 1
E 9:30 10:00 1

番組をノード、同時録画禁止をエッジとするグラフを考えます。
image

このグラフを機器ごとに複製した新たなグラフを考え、同じ番組間にもエッジを作成します。
image

このグラフ上で最大安定集合問題を解くことにより、「同時録画禁止を満たし、同じ番組を1つまでの機器でしか録画しない」解を求めることができますので、どの機器でどの番組を録画したらよいかがわかります。

Pythonで解いてみる

python3
import networkx as nx
from itertools import combinations
from more_itertools import grouper
from ortoolpy import maximum_stable_set, Autodict
g = nx.Graph()
dc = Autodict()
for i in 'ABCDE':
    for j in'123':
        g.add_node(dc[i+j], weight=1)
for i, j in grouper(2, 'ACADBCBECDCE'):
    for k in '123':
        g.add_edge(dc[i+k], dc[j+k])
for i in 'ABCDE':
    for j, k in combinations('123', 2):
        g.add_edge(dc[i+j], dc[i+k])
print([dc.keys[i] for i in maximum_stable_set(g)[1]])
>>>
['A1', 'B3', 'C2', 'D3', 'E1']

機器1でAとE、機器2でC、機器3でBとDを録画すればよいことが分かります。

以上

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?