최적의 요리 순서를 찾는다.
제목
국립정보학연구소 우노 선생님스케줄링 문제을 풀어보세요.
많은 공정 (스프, 야키토리, ...)을 다양한 리소스 (사람, 스토브, 부엌칼, 오븐)를 사용하여 가능한 한 빨리 완성합니다.
정식화하고 범용 솔버로 풀 수 있지만 힘들기 때문에 스케줄링 전용 솔버 OptSeq를 사용합니다. 유료이지만 변수 15까지는 무료 평가판으로 풀 수 있습니다.
설치 및 사용법은 스케줄링 최적화 솔버 OptSeq II을 참조하십시오.
파이썬으로 풀기
이름을 지정하지 않아도 되도록 보조 함수를 정의합니다.
파이썬from more_itertools import pairwise
from optseq import *
def addResource(m, capacity=1, name=None, addResource_count=[0]):
if name is None:
addResource_count[0] += 1
name = f'R{addResource_count[0]}'
return m.addResource(name, capacity=capacity)
def addMode(dur, res=[], name=None, addMode_count=[0]):
if name is None:
addMode_count[0] += 1
name = f'M{addMode_count[0]}'
md = Mode(name, dur)
for r in res:
md.addResource(r, requirement=1)
return md
def addActivity(m, dur, res=[], name=None, addActivity_count=[0]):
if name is None:
addActivity_count[0] += 1
name = f'A{addActivity_count[0]}'
ac = m.addActivity(name)
md = addMode(dur, res)
ac.addModes(md)
return ac
실제로 모델을 만들어 풀어 봅시다.
4개의 자원(사람, 쿡탑, 부엌칼, 오븐)의 조합을 1개의 숫자로 나타낼 수 있도록, 각각 1,2,4,8이라고 합니다. ''스프': [(5,10),…]'의 5는 1(사람)과 4(칼)을 모두 사용하는 것을 나타냅니다. 10은 작업 시간(분)입니다.
파이썬# 1:人, 2:コンロ, 4:包丁, 8:オーブン
prm = {'スープ': [(5,10),(3,10),(0,20),(0,20)],
'焼鳥': [(5,10),(9,20),(3,10)],
'魚料理': [(3,10),(9,30)],
'温野菜': [(5,20),(3,10)],
'茶': [(3,10)]} # リソースフラグ,時間
m = Model() # モデル
# リソース
res = {i:addResource(m,j) for i,j in zip([1,2,4,8],[2,2,2,1])}
# 工程
act = {k:[addActivity(m, d, [r for j,r in res.items() if f&j], f'{k}{i+1}')
for i,(f,d) in enumerate(l)] for k,l in prm.items()}
for l in act.values():
for i,j in pairwise(l):
m.addTemporal(i,j) # 同一料理内では順番に
m.addTemporal('sink',act['魚料理'][1],'CC') # 魚料理2は最後に
m.addTemporal('sink',act['茶'][0],'CC') # 茶1は最後に
m.Params.TimeLimit = 1 # 計算時間は1秒まで
m.Params.Makespan = True # 全工程の終了時刻を最小化
m.optimize() # ソルバー実行
결과 ================ Now solving the problem ================
Solutions:
source --- 0 0
sink --- 70 70
スープ1 --- 0 10
スープ2 --- 10 20
スープ3 --- 20 40
スープ4 --- 40 60
焼鳥1 --- 0 10
焼鳥2 --- 10 30
焼鳥3 --- 30 40
魚料理1 --- 20 30
魚料理2 --- 40 70
温野菜1 --- 30 50
温野菜2 --- 50 60
茶1 --- 60 70
두 숫자는 프로세스의 시작 시간과 종료 시간을 나타냅니다.
sink가 70이므로 70분 만에 모든 공정이 종료된다는 것을 알 수 있습니다.
또한 개별적으로 봐도 아래 선생님의 결과와 거의 같은 대답임을 알 수 있습니다.
이상
Reference
이 문제에 관하여(최적의 요리 순서를 찾는다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SaitoTsutomu/items/dc3a030a9c247a357325
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이름을 지정하지 않아도 되도록 보조 함수를 정의합니다.
파이썬
from more_itertools import pairwise
from optseq import *
def addResource(m, capacity=1, name=None, addResource_count=[0]):
if name is None:
addResource_count[0] += 1
name = f'R{addResource_count[0]}'
return m.addResource(name, capacity=capacity)
def addMode(dur, res=[], name=None, addMode_count=[0]):
if name is None:
addMode_count[0] += 1
name = f'M{addMode_count[0]}'
md = Mode(name, dur)
for r in res:
md.addResource(r, requirement=1)
return md
def addActivity(m, dur, res=[], name=None, addActivity_count=[0]):
if name is None:
addActivity_count[0] += 1
name = f'A{addActivity_count[0]}'
ac = m.addActivity(name)
md = addMode(dur, res)
ac.addModes(md)
return ac
실제로 모델을 만들어 풀어 봅시다.
4개의 자원(사람, 쿡탑, 부엌칼, 오븐)의 조합을 1개의 숫자로 나타낼 수 있도록, 각각 1,2,4,8이라고 합니다. ''스프': [(5,10),…]'의 5는 1(사람)과 4(칼)을 모두 사용하는 것을 나타냅니다. 10은 작업 시간(분)입니다.
파이썬
# 1:人, 2:コンロ, 4:包丁, 8:オーブン
prm = {'スープ': [(5,10),(3,10),(0,20),(0,20)],
'焼鳥': [(5,10),(9,20),(3,10)],
'魚料理': [(3,10),(9,30)],
'温野菜': [(5,20),(3,10)],
'茶': [(3,10)]} # リソースフラグ,時間
m = Model() # モデル
# リソース
res = {i:addResource(m,j) for i,j in zip([1,2,4,8],[2,2,2,1])}
# 工程
act = {k:[addActivity(m, d, [r for j,r in res.items() if f&j], f'{k}{i+1}')
for i,(f,d) in enumerate(l)] for k,l in prm.items()}
for l in act.values():
for i,j in pairwise(l):
m.addTemporal(i,j) # 同一料理内では順番に
m.addTemporal('sink',act['魚料理'][1],'CC') # 魚料理2は最後に
m.addTemporal('sink',act['茶'][0],'CC') # 茶1は最後に
m.Params.TimeLimit = 1 # 計算時間は1秒まで
m.Params.Makespan = True # 全工程の終了時刻を最小化
m.optimize() # ソルバー実行
결과
================ Now solving the problem ================
Solutions:
source --- 0 0
sink --- 70 70
スープ1 --- 0 10
スープ2 --- 10 20
スープ3 --- 20 40
スープ4 --- 40 60
焼鳥1 --- 0 10
焼鳥2 --- 10 30
焼鳥3 --- 30 40
魚料理1 --- 20 30
魚料理2 --- 40 70
温野菜1 --- 30 50
温野菜2 --- 50 60
茶1 --- 60 70
두 숫자는 프로세스의 시작 시간과 종료 시간을 나타냅니다.
sink가 70이므로 70분 만에 모든 공정이 종료된다는 것을 알 수 있습니다.
또한 개별적으로 봐도 아래 선생님의 결과와 거의 같은 대답임을 알 수 있습니다.
이상
Reference
이 문제에 관하여(최적의 요리 순서를 찾는다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SaitoTsutomu/items/dc3a030a9c247a357325텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)