#rcpsp51a.py
from optseq import *
import math
prob=Model()
CS=["CS","CC","SS","SC"]
#=======================================================================
#リソースの定義(場所)
#=======================================================================
#場所の名前と矩形サイズ [name,L=L2-L1+1,B=B2-B1+1]
R={
1:["P01", 58, 13],\
2:["P02", 58, 13],\
3:["P03", 42, 16],\
5:["P05", 52, 12],\
6:["P06", 52, 13],\
}
#-----各場所の長さ方向線分[L1,L2]・幅方向線分[B1,B2]
P01=[ 1,0, R[1][1],0, R[1][2]]
P02=[ 2,0, R[2][1],0, R[2][2]]
P03=[ 3,0, R[3][1],0, R[3][2]]
P05=[ 5,0, R[5][1],0, R[5][2]]
P06=[ 6,0, R[6][1],0, R[6][2]]
#-----メッシュの使用可否
resPL={}
S={}
for id in R:
resPL[id]=0
S[id]=0
#if not id in [2,3,4,5,6,11,13,14,15,16,17,18,19,20]:
#if not id in [2,3,4,5,6,7,13]:
if not id in [2,3,5,6]:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
S[id]+=1
if id==2:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in range(0,15) and j in range(0,13):
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
S[id]+=1
if id==3:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in range(0,28) and j in range(0,2):
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
elif i in range(0,4) and j in range(2,15):
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
elif i in range(0,46) and j in range(15,16):
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
else:
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
S[id]+=1
if id==5:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in range(0,13) and j in range(0,12):
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
S[id]+=1
if id==6:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in range(0,3) and j in range(0,13):
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =prob.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
S[id]+=1
#=======================================================================
#作業の定義
#=======================================================================
act={}
for i in idata:
act[i]=prob.addActivity(data[i][0])
#=======================================================================
#先行制約
#=======================================================================
#-----日程固定
for i in idata:
prob.addTemporal("source",act[i],tempType="SS",delay= data[i][3])
prob.addTemporal(act[i],"source",tempType="SS",delay=-data[i][3])
# sys.exit()
#=======================================================================
#資源制約(作業場所)
#=======================================================================
mode={}
for i in idata:
for no in range(len(data[i][1])):
no1=data[i][1][no][0];
L=R[no1][1]; B=R[no1][2];
L1=data[i][1][no][1]; L2=data[i][1][no][2];
B1=data[i][1][no][3]; B2=data[i][1][no][4];
l=math.floor(data[i][4][0]); b=math.floor(data[i][4][1]);
skipL=1; skipB=1;
for j in range(L1,L2-l+1,skipL):
for k in range(B1,B2-b+1,skipB):
mode[i,no1,j,k]=Mode(\
"mode[{0:02d}]_[{1:03d}][{2:03d}_{3:03d}][{4:03d}_{5:03d}]"\
.format(i,no1,j,k,l,b),duration=data[i][2])
for s in range(0,l):
for t in range(0,b):
mode[i,no1,j,k].addResource(resPL[no1,j+s,k+t],1)
act[i].addModes(mode[i,no1,j,k])
#=====モード制約
con={}
for i in idata:
if i in [33,37,42]:
no1=data[i][1][no][0];
L=R[no1][1]; B=R[no1][2];
L1=data[i][1][no][1]; L2=data[i][1][no][2];
B1=data[i][1][no][3]; B2=data[i][1][no][4];
l=math.floor(data[i][4][0]); b=math.floor(data[i][4][1]);
skipL=1; skipB=1;
for j in range(L1,L2-l+1,skipL):
for k in range(B1,B2-b+1,skipB):
con[i,no1,j,k]=prob.addResource("constraint["+str(i)+"]_\
[{0:03d}][{1:03d}_{2:03d}][{3:03d}_{4:03d}]"\
.format(no1,j,k,l,b),rhs=0,direction="=")
con[i,no1,j,k].addTerms(1,act[i],mode[i,no1,j,k])
con[i,no1,j,k].addTerms(-1,act[i+1],mode[i+1,no1,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.Initial=False
prob.Params.TimeLimit=30
# prob.Params.Neighborhood=20
# prob.Params.RandomSeed=1
# prob.Params.OutputFlag=False
prob.optimize()
filename="rcpsp51.csv"
prob.writeExcel(filename)
#=======================================================================
sys.exit()
#eof
Sub Waritsuke()
Worksheets("waritsuke").Activate
ActiveSheet.DrawingObjects.Delete
Dim Sheet1 As Variant
Sheet1 = "rcpsp42"
Dim time1 As Integer, time2 As Integer, sp As Integer
time1 = 2: time2 = 10: sp = 7:
Dim act As Variant, mode As Variant, ID As Integer, no As Integer
Dim joban As Integer, sx As Integer, sy As Integer, tx As Integer
Dim ty As Integer, start As Integer, completion As Integer
Dim S As Range, Q As Shape
For i = 2 To 14
act = Worksheets(Sheet1).Cells(i, 1) 'MsgBox (act)
act = Mid(act, 8, 3)
mode = Worksheets(Sheet1).Cells(i, 2)
ID = Len(mode)
If ID = 21 Then
sx = Val(Mid(mode, 9, 2))
sy = Val(Mid(mode, 12, 2))
tx = Val(Mid(mode, 16, 2))
ty = Val(Mid(mode, 19, 2))
start = Worksheets(Sheet1).Cells(i, 3) + 1
completion = Worksheets(Sheet1).Cells(i, 5)
For j = start - time1 To completion - time1
Set S = Range(Cells(3 + sp * j + sx, 4 + 1 + sy), _
Cells(2 + sp * j + sx + tx, 3 + 1 + sy + ty))
Set Q = ActiveSheet.Shapes.AddShape(1, S.Left, S.Top, _
S.Width, S.Height)
Q.Select
ic = i Mod 6
Selection.Font.ColorIndex = 1
If ic = 0 Then
Q.Fill.ForeColor.RGB = RGB(255, 0, 0) '赤
ElseIf ic = 1 Then
Q.Fill.ForeColor.RGB = RGB(0, 255, 0) '緑
ElseIf ic = 2 Then
Q.Fill.ForeColor.RGB = RGB(0, 0, 255) '青
Selection.Font.ColorIndex = 2
ElseIf ic = 3 Then
Q.Fill.ForeColor.RGB = RGB(255, 255, 0) '黄
ElseIf ic = 4 Then
Q.Fill.ForeColor.RGB = RGB(0, 255, 255) 'シアン
ElseIf ic = 5 Then
Q.Fill.ForeColor.RGB = RGB(255, 0, 255) 'マジェンダ
End If
Selection.Text = act
Selection.Font.Size = 7
Next j
End If
Next i
End Sub
#rcpsp43a.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")
#====アクティビティ
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
#rcpsp42.py
from optseq import *
import math
#====データセット
#i:[期間,納期,[l,b]]
data={
#key:["名前",ID,[後続],[B,L],時数]
"A11":["A11_BLK1_開始" ,1, ["A12"],[1,2],0],
"A12":["A12_BLK1_作業1",11,["A13"],[1,2],10],
"A13":["A13_BLK1_作業2",12,["A31"],[1,2],20],
"A21":["A21_BLK2_開始" ,1, ["A22"],[2,1],0],
"A22":["A22_BLK2_作業1",11,["A23"],[2,1],20],
"A23":["A23_BLK2_作業2",12,["A31"],[2,1],30],
"A31":["A31_BLK3_合体" ,2, ["A32","A33"],[2,2],0],
"A32":["A32_BLK3_作業3",13,["A41"],[2,2],5],
"A33":["A33_BLK3_作業4",14,["A41"],[2,2],5],
"A41":["A41_BLK3_納品" ,0, ["0" ],[2,2],0],
}
#=====アクティビティ
prob=Model()
act={}
for i in data:
#act[i]=prob.addActivity(data[i][0])
act[i]=prob.addActivity(name=data[i][0],duedate=10,backward=True)
#====先行制約
for i in data:
for j in data[i][2]:
if j!="0": prob.addTemporal(act[i],act[j])
#----納期日の固定
for i in data:
if data[i][2][0]=="0":
prob.addTemporal("source",act[i],tempType="CC",delay= 10)
prob.addTemporal(act[i],"source",tempType="CC",delay=-10)
#====資源制約
res1=prob.addResource("worker",capacity={(0,"inf"):5})
mode={}
for i in data:
if data[i][1] in [11,12,13,14]:
period=math.ceil(data[i][4]/8) #1人で何日かかるか
mode[i]=Mode("M["+i+"]_[{0:02d}]".format(period),duration=period)
mode[i].addResource(res1,requirement=1)
mode[i].addParallel(start=1,finish=period,maxparallel=2)
act[i].addModes(mode[i])
else:
mode[i]=Mode("M["+i+"]",duration=1)
act[i].addModes(mode[i])
014 015 016 017 018 019
020 021
022 023 024 025 026 027 028 029 030 031 032 033
034 035 036 037 038 039 040 041 042 043
#----場所取り
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})
#----
d_act={}
d_mode={}
ww={'A11':'A13', 'A21':'A23', 'A31':'A33'}
L=5; B=5; L1=0; L2=4; B1=0; B2=4; skipL=1; skipB=1;
for i in data:
if data[i][1] in [1,2]:
d_act[i]=prob.addActivity("場所_for_"+i)
l=data[i][3][0]; b=data[i][3][1];
for j in range(L1,L2-l+1,skipL):
for k in range(B1,B2-b+1,skipB):
d_mode[i,j,k]=Mode(\
"M["+i+"]_[{0:02d}_{1:02d}][{2:02d}_{3:02d}]"\
.format(j,k,l,b))
d_mode[i,j,k].addBreak(0,'inf')
for s in range(0,l):
for t in range(0,b):
d_mode[i,j,k].addResource(res[j+s,k+t],1,"break")
d_act[i].addModes(d_mode[i,j,k])
prob.addTemporal(act[i],d_act[i],tempType="SS")
prob.addTemporal(d_act[i],act[i],tempType="SS")
ii=ww[i]
prob.addTemporal(d_act[i],act[ii],tempType="CC")
prob.addTemporal(act[ii],d_act[i],tempType="CC")
#====問題の規模:
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("rcpsp42.txt")
prob.writeExcel("rcpsp42.csv")
sys.exit()
#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])
016 017 018 019 020 021
022 023
#====資源制約
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})
024 025 026 027 028 029 030 031
032 033 034 035
#-----
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")
def writeExcel(self, filename="optseq_chart.csv", scale=1):
"""
Output the gantt's chart as a csv file for printing using Excel.
- Argument:
- filename: Output file name. Default="optseq_chart.csv."
- Example usage:
>>> model.writeExcel("sample.csv")
"""
f = open(filename, "w")
horizon = 0
actList = []
for a in self.activities:
actList.append(a)
act = self.activities[a]
horizon = max(act.completion, horizon)
# print("planning horizon=",horizon)
if scale <= 0:
print("optseq write scale error")
exit(0)
original_horizon = horizon
horizon = int(horizon/scale)+1
actList.sort()
title = " activity , mode,".center(20)+" duration,"
width = len(str(horizon)) # period width =largest index of time
for t in range(horizon):
num = str(t+1)
title += num.rjust(width)+","
f.write(title+"\n")
for a in actList: # sorted order
act = self.activities[a] # act: activity object
actstring = act.name.center(10)[:10]+","if len(act.modes) >= 2: actstring += str(act.selected.name).center(10)+"," actstring += str(self.modes[act.selected.name].duration).center(10)+","else: actstring += str(act.modes[0].name).center(10)[:10]+"," actstring += str(act.modes[0].duration).center(10)+","
execute = [0 for t in range(horizon)]
for (s, c) in act.execute:
para = act.execute[s, c]
for t in range(s, c):
t2 = int(t/scale)
execute[t2] = int(para)
for t in range(horizon):
if execute[t] >= 2:
actstring += "*"+str(execute[t]).rjust(width-1)+","
elif execute[t] == 1:
actstring += ""+"="*(width)+","
elif t >= int(act.start/scale) and t < int(act.completion/scale):
actstring += ""+"."*(width)+","
else:
actstring += ""+" "*width+","
f.write(actstring+"\n")
resList = []
for r in self.resources:
resList.append(r)
resList.sort()
for r in resList:
res = self.resources[r]
if len(res.terms) == 0: # output residual and capacity
rstring = res.name.center(30)+", , ,"
cap = [0 for t in range(horizon)]
residual = [0 for t in range(horizon)]
for (s, c) in res.residual:
amount = res.residual[(s, c)]
if c == "inf":
c = horizon
s = min(s, original_horizon)
c = min(c, original_horizon)
s2 = int(s/scale)
c2 = int(c/scale)
for t in range(s2, c2):
residual[t] += amount
for (s, c) in res.capacity:
amount = res.capacity[(s, c)]
if c == "inf":
c = horizon
s = min(s, original_horizon)
c = min(c, original_horizon)
s2 = int(s/scale)
c2 = int(c/scale)
for t in range(s2, c2):
cap[t] += amount
for t in range(horizon):
# num=str(cap[t]-residual[t])
rstring += str(residual[t]) + ","
f.write(rstring+"\n")
# rstring= str(" ").center(30)+", , ,"
#
# for t in range(horizon):
# num=str(cap[t])
# rstring+=""+num.rjust(width) +","
# f.write(rstring+"\n")
f.close()
#rcpsp34.py
from optseq import *
#====データセット
#i:[名前,期間,後続,資源]
data={
1:["A01",5,[2],1],
2:["A02",1,[0],0]
}
date10=10 #納期日
#====アクティビティ
prob=Model()
act={}
for i in data:
act[i]=prob.addActivity(name=data[i][0])
#====先行制約
for i in data.keys():
for j in data[i][2]:
if j>0:
prob.addTemporal(act[i],act[j],tempType="CS",delay=0)
prob.addTemporal(act[j],act[i],tempType="SC",delay=0) #重要
#----A02固定
i==2
prob.addTemporal("source",act[i],tempType="CC",delay= date10)
prob.addTemporal(act[i],"source",tempType="CC",delay=-date10)
#====資源制約
res=prob.addResource("place",capacity={(0,"inf"):1})
mode={}
for i in data:
mode[i]=Mode("M{0:02d}".format(i),duration=data[i][1])
mode[i].addResource(res,requirement=data[i][3])
if i==1:
mode[i].addBreak(0,'inf') #Case1
#mode[i].addBreak(0,'inf',maxtime=2) #Case2
#mode[i].addBreak(0,0) #Case3
mode[i].addResource(res,1,'break')
act[i].addModes(mode[i])
#====求解
prob.Params.Makespan=True
prob.Params.TimeLimit=1
#prob.Params.OutputFlag=True
prob.optimize()
prob.write("rcpsp34.txt")
prob.writeExcel("rcpsp34.csv")
#rcpsp32.py
:
#====資源制約
res=prob.addResource("Resource",capacity={(0,"inf"):10})
mode={}
for i in data:
mode[i]=Mode("M{0:02d}_{1:02d}".format(i,data[i][3]),duration=data[i][1])
mode[i].addResource(res,requirement=data[i][3])
act[i].addModes(mode[i])
026 027 028 029 029a 030 031 031a 032
#rcpsp33.py
:
#====資源制約
res=prob.addResource("Resource",capacity={(0,"inf"):10})
mode={}
for i in data:
period=data[i][1]*data[i][3] #1人で何日かかるか
mode[i]=Mode("M{0:02d}_{1:02d}".format(i,period),duration=period)
mode[i].addResource(res,requirement=1)
mode[i].addParallel(start=1,finish=period,maxparallel=10)
act[i].addModes(mode[i])