定盤計画の基礎

rcpsp41.py

OptSeq

#rcpsp41.py
from optseq import *
import math
#====データセット
#i:[名前,期間,[l,b]]
data={
1:["BLK1",1,[2,2]],
2:["BLK2",1,[1,2]],
3:["BLK3",1,[2,1]]
}    
#=====アクティビティ
prob=Model()
act={}
for i in data.keys():
    act[i]=prob.addActivity(data[i][0])
#====資源制約  
res={}
for i in range(0,4):
    for j in range(0,4):  
        if i==1 and j==2 :
            res[i,j]=prob.addResource(\
                "place[{0:02d}_{1:02d}]".format(i,j),\
                capacity={(0,"inf"):0})            
        else:     
            res[i,j]=prob.addResource(\
                "place[{0:02d}_{1:02d}]".format(i,j),\
                capacity={(0,"inf"):1})  
#-----
mode={}  
L=5; B=5; L1=0; L2=4; B1=0; B2=4;
for i in data:
    l=data[i][2][0]; b=data[i][2][1];
    for j in range(L1,L2-l+1):
        for k in range(B1,B2-b+1):         
             mode[i,j,k]=Mode(\
                 "mode[{0:02d}]_[{1:02d}_{2:02d}][{3:02d}_{4:02d}]"\
                 .format(i,j,k,l,b),duration=data[i][1])
             for s in range(0,l):
                 for t in range(0,b):
                     mode[i,j,k].addResource(res[j+s,k+t],1)         
             act[i].addModes(mode[i,j,k])    
#====問題の規模:      
A=[]
for a in prob.act: A.append(a.name) 
print("アクティビティ:",A)  
N=len(prob.act)
print("アクティビティ総数(含待機数):",N)  
M=[]
for a in prob.act: M.append(len(a.modes)) 
print("モード数:",M)  
print("平均モード数:",round(sum(M)/N))
P=math.ceil(math.log10(round(sum(M)/N)**N))
print("問題の規模: 10**",P)       
#====求解
prob.Params.Makespan=True
prob.Params.TimeLimit=1
prob.Params.OutputFlag=True
prob.optimize()
prob.write("rcpsp41.txt")
prob.writeExcel("rcpsp41.csv")