●研究対象とする造船所の全景と物流を次に示します。敷地の制約から、艤装と待機は台船上で行われます。したがって、上構部を除いて、総組は行われていません。
●組立場所のレイアウトを次に示します。
●艤装・待機場所のレイアウトを次に示します。
●カレンダーとしては、いわゆる工場カレンダーのほかに、ブラスト専用のカレンダーが使われています。当研究では、工場カレンダーに基づいて計画単位を半日としています。
工場カレンダー | ブラストカレンダー |
●主に日程計画をまとめた総合日程表が作成されており、これを基にして定盤計画と配員計画が実施されています。
●また配員可能数については次を参考にしています。
プログラム:Part I-1
#プログラムI-1.0
from optseq import *
import math
#=====
print("")
print(' ************************ 艤装工程計画 *************************')
#=====
usuki1=Model()
CS=["CS","CC","SS","SC"]
●プログラムI-1.1
#プログラムI-1.1a
#=======================================================================
#リソースの定義(場所)
#=======================================================================
#作業場所の名前と矩形サイズ [name,L=L2-L1+1,B=B2-B1+1]
R={
1:["R[K1]", 42, 13 ],\
2:["R[K2]", 56, 13 ],\
3:["R[K3]", 47, 15 ],\
4:["R[K4S4]", 33, 37+2],\
5:["R[K5]", 45, 23+2],\
6:["R[K6S2]", 61, 26],\
7:["R[AB]", 19, 16 ],\
8:["R[BB]", 19, 16 ],\
9:["R[CB]", 19, 16 ],\
10:["R[WB]", 14, 13 ],\
11:["R[D35]", 33+2,18+2],\
12:["R[D5]", 54+2,16+2],\
13:["R[D7]", 72, 22+2],\
14:["R[RD1]", 40+2,14+2],\
15:["R[RD3]", 35+2,17+2],\
16:["R[RD4]", 40+2,15+2],\
17:["R[RD5]", 30+2,12+2],\
18:["R[RD6]", 30+2,12+2],\
19:["R[RD7]", 35+2,15+2],\
20:["R[RD8]", 40+2,15+2],\
}
#プログラムI-1.1b
#-----各場所の長さ方向線分[L1,L2]・幅方向線分[B1,B2]
K1= [ 1,0, R[1][1],0, R[1][2]]
K2= [ 2,0, R[2][1],0, R[2][2]]
K3= [ 3,0, R[3][1],0, R[3][2]]
K4S4=[ 4,0, R[4][1],0, R[4][2]]
K5= [ 5,0, R[5][1],0, R[5][2]]
K6S2=[ 6,0, R[6][1],0, R[6][2]]
AB = [ 7,0, R[7][1],0, R[7][2]]
BB = [ 8,0, R[8][1],0, R[8][2]]
CB = [ 9,0, R[9][1],0, R[9][2]]
WB = [10,0,R[10][1],0,R[10][2]]
D35= [11,0,R[11][1],0,R[11][2]]
D5= [12,0,R[12][1],0,R[12][2]]
D7= [13,0,R[13][1],0,R[13][2]]
RD1= [14,0,R[14][1],0,R[14][2]]
RD3= [15,0,R[15][1],0,R[15][2]]
RD4= [16,0,R[16][1],0,R[16][2]]
RD5= [17,0,R[17][1],0,R[17][2]]
RD6= [18,0,R[18][1],0,R[18][2]]
RD7= [19,0,R[19][1],0,R[19][2]]
RD8= [20,0,R[20][1],0,R[20][2]]
#プログラムI-1.1c
#-----各区画の長さ方向線分[L1,L2]・幅方向線分[B1,B2]
K12= [ 1, 14, 28, 0, R[1][2] ]
K13= [ 1, 28, 42, 0, R[1][2] ]
K14= [ 1, 42, R[1][1], 0, R[1][2] ]
K21= [ 2, 0, 14, 0, R[2][2] ]
K22= [ 2, 14, 28, 0, R[2][2] ]
K23= [ 2, 28, 42, 0, R[2][2] ]
K24= [ 2, 42, R[2][1], 0, R[2][2] ]
K312=[ 3, 0, 24, 0, R[3][2] ]
K33 =[ 3, 24, 47, 0, R[3][2] ]
S4 =[ 4, 11, R[4][1], 0, 12 ]
K411=[ 4, 0, 16, 12, 26 ]
K412=[ 4, 16, R[4][1], 12, 26 ]
K421=[ 4, 0, 16, 26, R[4][2] ]
K422=[ 4, 16, R[4][1], 26, R[4][2] ]
K5U= [ 5, 7, R[5][1], 0, 12 ]
K5R= [ 5, 0, R[5][1], 10+2, R[5][2] ]
S2W= [ 6, 1, 22, 1, 13+2 ]
S2E= [ 6, 36, R[6][1], 0, 13+2 ]
K6= [ 6, 0, R[6][1], 13, R[6][2] ]
D7N =[13, 0, 31, 0, 24 ]
D7S =[13, 38, 63, 0, 24 ]
D7EN=[13, 0, 31, 0, 12 ]
D7ES=[13, 38, 63, 0, 12 ]
D7WN=[13, 0, 31, 13, 24 ]
D7WS=[13, 38, 63, 13, 24 ]
#プログラムI-1.1d
#-----データセットにおける割付場所
K1K2 =[K12,K13,K14,K21,K22,K23,K24];
K1K2_K5U=[K12,K13,K14,K21,K22,K23,K24,K5U]
K3=[K312,K33];
K4=[K411,K412,K421,K422,S4,WB];
K5U=[K5U];
K5R=[K5R];
K6=[K6,S2W,S2E]
#AB=[AB]; BB=[BB]; CB=[CB];
ABC=[AB,BB,CB];
AB=ABC; BB=ABC; CB=ABC;
RD =[RD1,RD3,RD4,RD5,RD6,RD7,RD8,D35,D5,D7N,D7S,S4]
RD2=[RD1,RD3,RD4,RD5,RD6,RD7,RD8,D35,D5,D7N,D7S,S4]
#プログラムI-1.1e
#-----ブロック特有の割付場所の起点・終点 [i,x1,y1,x2,y2]
K1_1FS1=[[ 1,R[1][1]-14, R[1][1], 0, R[1][2]]]
K1_1S6P=[[ 1,R[1][1]-11, R[1][1], 0, R[1][2]]]
K1_1S6S=[[ 1,R[1][1]-22, R[1][1]-11,0, R[1][2]]]
K2_8S6P=[[ 2,R[2][1]-22, R[2][1]-11,0, R[2][2]]]
K2_8S6S=[[ 2,R[2][1]-11, R[2][1], 0, R[2][2]]]
K4_1AS1=[S4]
D5_AH= [[12,1,25,0,12]]
D7_3AS1=[D7ES]
D7_1AS1P=[D7ES]
D7_1AS1S=[D7ES]
D7_1AS5P=[D7WN]
D7_1AS5S=[D7WN]
D7_2S6P=[D7ES]
D7_2S6S=[D7ES]
D7_AH1P=[D7N]
D7_AH1S=[D7N]
D7_AH2=[D7N]
D7_3AS12=[D7ES]
D7_1AS1P2=[D7ES]
D7_1AS1S2=[D7ES]
D7_1AS5P2=[D7WN]
D7_1AS5S2=[D7WN]
県岸=0
#プログラムI-1.1f
resPL={}
for id in R:
resPL[id]=0
if not id in [4,5,6,13]:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):1})
if id==4:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in range(0,11) and j in range(0,12):
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):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,7) and j in range(0,10):
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):1})
if id==6:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in [0,22,23,24,25,26,27,28,29,30,31,32,33,34,35] and j in range(0,13):
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):0})
elif i in range(1,17) and j in range(0,1):
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):1})
if id==13:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in [31,32,33,34,35,36,37,63,64,65,66,67,68,69,70,71] and j in range(0,24):
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki1.addResource(R[id][0]+"[{0:02d}_{1:02d}]"\
.format(i,j), capacity={(0,"inf"):1})
●プログラムI-1.2
#プログラムI-1.2
#=======================================================================
#リソースの定義(作業員)
#=======================================================================
eps1=1.25
resWH={} #取付28人
r=math.floor(28*4*eps1);
resWH=usuki1.addResource("R[WH]", capacity={(0,"inf"):r})
#-----
resWW={} #溶接43人
r=math.floor(43*4*eps1);
resWW=usuki1.addResource("R[WW]", capacity={(0,"inf"):r})
#-----
eps2=1.25
resWF1={} #鉄艤5人
r=math.floor(5*4*eps2);
resWF1=usuki1.addResource("R[WF1]", capacity={(0,"inf"):r})
#-----
resWF2={} #甲配7人
r=math.floor(7*4*eps2);
resWF2=usuki1.addResource("R[WF2]", capacity={(0,"inf"):r})
#-----
resWF3={} #機配5人⇒10人
r=math.floor(10*4*eps2);
resWF3=usuki1.addResource("R[WF3]", capacity={(0,"inf"):r})
#-----
resWP={} #塗装内4人⇒8人
r=math.floor(8*4*eps2);
resWP=usuki1.addResource("R[WP]", capacity={(0,"inf"):r})
#-----
resWP2={} #塗装外8人
r=math.floor(8*4*eps2);
resWP2=usuki1.addResource("R[WP2]", capacity={(0,"inf"):r})