臼杵造船所

●研究対象とする造船所の全景と物流を次に示します。敷地の制約から、艤装と待機は台船上で行われます。したがって、上構部を除いて、総組は行われていません。

●組立場所のレイアウトを次に示します。

●艤装・待機場所のレイアウトを次に示します。

カレンダーとしては、いわゆる工場カレンダーのほかに、ブラスト専用のカレンダーが使われています。当研究では、工場カレンダーに基づいて計画単位を半日としています。

工場カレンダー ブラストカレンダー

●主に日程計画をまとめた総合日程表が作成されており、これを基にして定盤計画と配員計画が実施されています。

●また配員可能数については次を参考にしています。

プログラム: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})