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
|