逐次計画の基礎

rcpsp43.py

OptSeq

#rcpsp43.py
from optseq import *
import math
#====データセット
#Key:["",期間,[後続]、員数,開始,完了],\
data={
"A01":["A01_3人",3,["A04","A06"],3,0,0],
"A02":["A02_1人",4,["A05","A07"],1,0,0],
"A03":["A03_1人",6,["A08","0"],1,0,0],
"A04":["A04_4人",4,["A05","A07"],4,0,0],
"A05":["A05_4人",5,["A08","0"],4,0,0],
"A06":["A06_4人",5,["A09","0"],4,0,0],
"A07":["A07_5人",4,["A10","0"],5,0,0],
"A08":["A08_2人",2,["A10","0"],2,0,0],
"A09":["A09_5人",2,["A10","0"],5,0,0],
"A10":["A10_3人",4,["0","0"],3,0,0],\
}
#====アクティビティ
prob=Model()
act={}
for i in data:
    act[i]=prob.addActivity(data[i][0])
#====先行制約
for i in data:
    for j in data[i][2]:
        if j!="0": prob.addTemporal(act[i],act[j])  
#====資源制約  
res=prob.addResource("Resource",capacity={(0,"inf"):10}) 
mode={}  
for i in data:
    mode[i]=Mode("M["+i+"][{0:02d}]".format(data[i][3]),
                                    duration=data[i][1])
    mode[i].addResource(res,requirement=data[i][3])
    act[i].addModes(mode[i])
#====求解
prob.Params.Makespan=True
prob.Params.TimeLimit=1
prob.Params.OutputFlag=True
prob.optimize()
prob.write("rcpsp43a.txt")
prob.writeExcel("rcpsp43a.csv")  
#=======================================================================
print("") 
for a in prob.act:
  mode_nam=a.selected.name
  i=a.name[0:3]
  data[i][4]=a.start
  data[i][5]=a.completion  
#-----
w1=[]; w2=[]; w3=[]; w4=[]; w5=[];
d1=5; d2=20; 
for i in data:
  start=data[i][4]
  stop=data[i][5]
  if stop < d1: w1.append(i)                  # 完了
  if start+1 <= d1 and d1 <= stop: w2.append(i) #仕掛
  if d1 < start+1  and stop < d2:  w3.append(i) #自由
  if start+1 <= d2 and d2 < stop: w4.append(i) #次のリスケにおける仕掛
  if d2 < start+1: w5.append(i)               #未着手
idata2a=w2;   #仕掛かり中のアクティビティ
idata2b=w3;   #仕掛かっていないアクティビティ 
idata2=w2+w3; #リスケすべきアクティビティ日
#====アクティビティ
prob2=Model()
act2={}
for i in idata2b:
    act2[i]=prob2.addActivity(data[i][0])
#====先行制約
for i in idata2b:
    for j in data[i][2]:
        if j!="0": prob2.addTemporal(act2[i],act2[j])
#----リスケ日以降
    prob2.addTemporal("source",act[i],tempType="SS",delay=d1)      
#====資源制約  
w={(0,3):5,(3,4):0,(4,6):1,(6,7):2,(7,8):6,(8,30):10} #Case1
w={(0,3):5,(3,4):0,(4,6):1,(6,7):2,(7,8):6,(8,30):8}  #Case2
res2=prob2.addResource("Resource2",capacity=w) 
mode2={}  
for i in idata2b:
    mode2[i]=Mode("M["+i+"][{0:02d}]".format(data[i][3]),
                                    duration=data[i][1])
    mode2[i].addResource(res2,requirement=data[i][3])
    act2[i].addModes(mode2[i])
#====求解
prob2.Params.Makespan=True
prob2.Params.TimeLimit=1
prob2.Params.OutputFlag=True
prob2.optimize()
prob2.write("rcpsp43b.txt")
prob2.writeExcel("rcpsp43b.csv")  
#=======================================================================
#eof