リスケの手法

OptSeq

#rcpsp71.py プッシュ型逐次計画 
from optseq import *
import math
#=======================================================================
prob=Model()
CS=["CS","CC","SS","SC"]
#=======================================================================
#リソースの定義(RCPSP計画用)
file_path = 'RCPSP_u.res.txt'
with open(file_path, 'r', encoding='utf-8') as file:
    prog=file.read()
exec(prog)
#=======================================================================
#データセットの定義(RCPSP計画用)
# data_BC1, data_BC2, data_BC3, data_BC4, data_BC5, data_BC6, data_BC7
file_path = 'RCPSP6_data_all.txt'
with open(file_path, 'r', encoding='utf-8') as file:
    prog=file.read()
exec(prog)
#=======================================================================
data={}
data.update(data_BC1); 
data.update(data_BC2); 
data.update(data_BC3); 
data.update(data_BC4); 
data.update(data_BC5); 
data.update(data_BC6); 
data.update(data_BC7);
#-----
def extact(data):
    w=[]
    for i in data.keys():
        if data[i][1]>=0:  w.append(i)
    return w
#-----
idata_BC1=extact(data_BC1)
idata_BC2=extact(data_BC2)
idata_BC3=extact(data_BC3)
idata_BC4=extact(data_BC4)
idata_BC5=extact(data_BC5)
idata_BC6=extact(data_BC6)
idata_BC7=extact(data_BC7)
idata=idata_BC1+idata_BC2+idata_BC3+idata_BC4+idata_BC5+idata_BC6+idata_BC7
#print(len(idata))      
#=======================================================================
def L1L2B1B2lb(R,data,i,j,no):
    no1=data[i][j][no][0]; #j=6,7
    L=R[no1][1]; B=R[no1][2];
    l=math.floor(data[i][8][0]); b=math.floor(data[i][8][1]);   
    L1=data[i][j][no][1]; L2=data[i][j][no][2]; 
    if L1<0: l=l-abs(L1); L1=0;
    if L2>L: l=l-abs(L2-L); L2=L;         
    B1=data[i][j][no][3]; B2=data[i][j][no][4];   
    if B1<0: b=b-abs(B1); B1=0
    if B2>B: b=b-abs(B2-B); B2=B;  
    ll=L2-L1; bb=B2-B1; 
    if L2-L1>l: ll=l 
    if B2-B1>b: bb=b  
    return [no1,L1,L2,B1,B2,ll,bb] 
OptSeq

#=======================================================================   
#iwhich=5  #プッシュ型逐次計画Step1: 作業の場所取りは面全体(前後船含む)
iwhich=6  #プッシュ型逐次計画Step2: 待機の場所取りは面全体(前後船含む)
if iwhich in [5,6]: #rcpsp7_5.csv
#=======================================================================    
    data2={}
    for i in data:
        data2[i]=data[i].copy() 
    prob3=Model()
#----------------------------------------------------------------------- 
#[5.0a]リソースの定義(場所) 
#----------------------------------------------------------------------- 
    res3PL,S=res3(prob3,R)
    res2S=res2(prob3,R,S)
#----------------------------------------------------------------------- 
#[5.0b]リソースの定義(作業員)
#----------------------------------------------------------------------- 
    H={
    1:["H[1]", 28*10, 1], #取付  
    2:["H[2]", 43*10, 1], #溶接
    3:["H[3]", 12*10, 1], #塗装
    4:["H[4]",  5*10, 1], #鉄艤
    5:["H[5]",  7*10, 1], #甲配
    6:["H[6]",  5*10, 1], #機配
    }
    res1W=res1(prob3,H)   
#----------------------------------------------------------------------- 
#[5.0c]作業の定義G2
#----------------------------------------------------------------------- 
    d1=26; d2=50; 
# w1=[]; w2=[]; w3=[]; w4=[]; w5=[]; 
# for i in data:    
#     start=data2[i][3]
#     stop=data2[i][3]+data2[i][2]
 :
# jdata2a=w2;   #仕掛かり中のアクティビティ
# jdata2b=w3;   #仕掛かっていないアクティビティ 
# jdata=w2+w3;  #リスケすべきアクティビティ 
# wsum=len(w1)+len(w2)+len(w3)+len(w4)+len(w5) 
# print(len(w1),len(w2),len(w3),len(w4),len(w5),wsum) #764 14 232 43 522=1575
#-----------------------------------------------------------------------
    idata2a=[ 
"S01_B041P_20","S01_B041P_24",
"S01_B061S_10","S01_B061S_12","S01_B061S_13",
"S01_B101P_00","S01_B101P_02","S01_B101P_03","S01_B101P_04","S01_B101P_05",
"S01_B101S_00","S01_B101S_04","S01_B101S_05",
"S01_B114C_00","S01_B114C_03","S01_B114C_04","S01_B114C_05",
"S01_B175C_00","S01_B175C_04",
"S01_B195C_00","S01_B195C_03","S01_B195C_04",
    ]
    data2["S01_B041P_20"]=['S01_B041P_20__11Lx12B_出棟', 5, 1, 25, ['S01_B041P_21', 'S01_B041P_24', '0', '0', '0'], [[0, -1], [0, -1], [0, 0], [0, 0], [0, 0]], [[19, 12, 23, 2, 14]], 0, [11, 12, 0], 132]
    data2["S01_B041P_24"]=['S01_B041P_24__11Lx12B_甲配', 16, 0, 0, ['S01_B041P_30', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 42-4*10]
    data2["S01_B061S_10"]=['S01_B061S_10__14Lx13B_正転', 3, 1, 25, ['S01_B061S_11', 'S01_B061S_12', 'S01_B061S_13', '0', '0'], [[0, -1], [0, -1], [0, -1], [0, 0], [0, 0]], [[4, -2, 11, 29, 43]], 0, [13, 14, 0], 182]
    data2["S01_B061S_12"]=['S01_B061S_12__14Lx13B_溶接', 11, 0, 0, ['S01_B061S_20', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 204-4*10]
    data2["S01_B061S_13"]=['S01_B061S_13__14Lx13B_甲配', 16, 0, 0, ['S01_B061S_20', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 60-3*10]
    data2["S01_B101P_00"]=['S01_B101P_00__14Lx9B_開始',  1, 1, 25, ['S01_B101P_01', 'S01_B101P_02', '0', '0', '0'], [[0, -1], [0, -1], [0, 0], [0, 0], [0, 0]], [[2, 44, 58, 2, 11]], 0, [14, 9, 0], 126]
    data2["S01_B101P_02"]=['S01_B101P_02__14Lx9B_取付',  10, 0, 0, ['S01_B101P_03', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 0, 114-8*10]
    data2["S01_B101P_03"]=['S01_B101P_03__14Lx9B_溶接',  11, 0, 0, ['S01_B101P_04', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 0, 136]
    data2["S01_B101P_04"]=['S01_B101P_04__14Lx9B_取付',  12, 0, 0, ['S01_B101P_05', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 0, 76]
    data2["S01_B101P_05"]=['S01_B101P_05__14Lx9B_溶接',  13, 0, 0, ['S01_B101P_10', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 68]
    data2["S01_B101S_00"]=['S01_B101S_00__14Lx12B_開始', 1, 1, 25, ['S01_B101S_01', 'S01_B101S_04', '0', '0', '0'], [[0, -1], [0, -1], [0, 0], [0, 0], [0, 0]], [[2, 16, 30, 1, 13]], 0, [14, 12, 0], 168]
    data2["S01_B101S_04"]=['S01_B101S_04__14Lx12B_取付', 12, 0, 0, ['S01_B101S_05', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 0, 76]
    data2["S01_B101S_05"]=['S01_B101S_05__14Lx12B_溶接', 13, 0, 0, ['S01_B101S_10', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 68]
    data2["S01_B114C_00"]=['S01_B114C_00__13Lx12B_開始', 1, 1, 25, ['S01_B114C_01', 'S01_B114C_03', '0', '0', '0'], [[0, -1], [0, -1], [0, 0], [0, 0], [0, 0]], [[3, 27, 40, 3, 15]], 0, [13, 12, 0], 156]
    data2["S01_B114C_03"]=['S01_B114C_03__13Lx12B_溶接', 11, 0, 0, ['S01_B114C_04', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 0, 204-12*10]
    data2["S01_B114C_04"]=['S01_B114C_04__13Lx12B_取付', 12, 0, 0, ['S01_B114C_05', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 0, 76]
    data2["S01_B114C_05"]=['S01_B114C_05__13Lx12B_溶接', 13, 0, 0, ['S01_B114C_10', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 10]
    data2["S01_B175C_00"]=['S01_B175C_00__13Lx11B_開始', 1, 1, 25, ['S01_B175C_01', 'S01_B175C_04', '0', '0', '0'], [[0, -1], [0, -1], [0, 0], [0, 0], [0, 0]], [[6, 27, 40, 1, 12]], 0, [13, 11, 0], 143]
    data2["S01_B175C_04"]=['S01_B175C_04__13Lx11B_取付', 10, 0, 0, ['S01_B175C_10', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 16]
    data2["S01_B195C_00"]=['S01_B195C_00__13Lx13B_開始', 1, 1, 25, ['S01_B195C_01', 'S01_B195C_03', '0', '0', '0'], [[0, -1], [0, -1], [0, 0], [0, 0], [0, 0]], [[6, 40, 53, -2, 11]], 0, [13, 13, 0], 169]
    data2["S01_B195C_03"]=['S01_B195C_03__13Lx13B_溶接', 11, 0, 0, ['S01_B195C_04', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 0, 48]
    data2["S01_B195C_04"]=['S01_B195C_04__13Lx13B_取付', 10, 0, 0, ['S01_B195C_10', '0', '0', '0', '0'], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 0, 0, 1, 16]
#-----------------------------------------------------------------------     
    idata2b=[     
"S01_B021P_00","S01_B021P_02","S01_B021P_03","S01_B021P_10","S01_B021P_12",
"S01_B021S_00","S01_B021S_02","S01_B021S_03","S01_B021S_10","S01_B021S_12",
"S01_B031P_00","S01_B031P_02","S01_B031P_03","S01_B031P_10","S01_B031P_12",
"S01_B031S_00","S01_B031S_02","S01_B031S_03","S01_B031S_10","S01_B031S_12",
"S01_B041P_30","S01_B041P_32",
"S01_B041S_30","S01_B041S_32",
"S01_B051P_20","S01_B051P_22","S01_B051P_23","S01_B051P_24",
"S01_B051P_30","S01_B051P_32",
"S01_B051S_20","S01_B051S_22","S01_B051S_23","S01_B051S_24",
"S01_B051S_30","S01_B051S_32",
"S01_B061P_10","S01_B061P_12","S01_B061P_13","S01_B061P_14",
"S01_B061P_20","S01_B061P_22","S01_B061P_30","S01_B061P_32",
"S01_B061S_20","S01_B061S_22","S01_B061S_30","S01_B061S_32",
"S01_B071P_10","S01_B071P_12","S01_B071P_13","S01_B071P_14",
"S01_B071P_20","S01_B071P_22",
"S01_B071P_30","S01_B071P_32",
"S01_B071S_10","S01_B071S_12","S01_B071S_13","S01_B071S_14",
"S01_B071S_20","S01_B071S_22",
"S01_B071S_30","S01_B071S_32",
"S01_B084P_00","S01_B084P_02","S01_B084P_03","S01_B084P_04",
"S01_B084P_10","S01_B084P_12",
"S01_B084S_00","S01_B084S_02","S01_B084S_03","S01_B084S_04",
"S01_B084S_10","S01_B084S_12",
"S01_B091P_10","S01_B091P_12",
"S01_B091P_20","S01_B091P_22","S01_B091P_23","S01_B091P_24",
"S01_B091S_10","S01_B091S_12",
"S01_B091S_20","S01_B091S_22","S01_B091S_23","S01_B091S_24",
"S01_B101P_10","S01_B101P_12","S01_B101P_13","S01_B101P_14",
"S01_B101P_20","S01_B101P_22",
"S01_B101P_30","S01_B101P_32",
"S01_B101S_10","S01_B101S_12","S01_B101S_13","S01_B101S_14",
"S01_B101S_20","S01_B101S_22",
"S01_B114C_10","S01_B114C_12","S01_B114C_13","S01_B114C_14",
"S01_B114H_00","S01_B114H_02","S01_B114H_12",
"S01_B123C_10","S01_B123C_12","S01_B123C_13",
"S01_B153C_00","S01_B153C_02","S01_B153C_10","S01_B153C_12",
"S01_B153C_20","S01_B153C_22","S01_B153C_23",
"S01_B153D_00","S01_B153D_02",
"S01_B153H_00","S01_B153H_02","S01_B153H_03",
"S01_B165C_10","S01_B165C_12",
"S01_B165C_20","S01_B165C_22","S01_B165C_23","S01_B165C_24","S01_B165C_25","S01_B165C_26",
"S01_B165C_30","S01_B165C_32","S01_B165C_33",
"S01_B175C_10","S01_B175C_12",
"S01_B175C_20","S01_B175C_22","S01_B175C_23","S01_B175C_24","S01_B175C_25","S01_B175C_26",
"S01_B175C_30","S01_B175C_32","S01_B175C_33",
"S01_B184C_00","S01_B184C_02","S01_B184C_10","S01_B184C_12","S01_B184C_13","S01_B184C_14",
"S01_B184H_00","S01_B184H_02","S01_B184H_03",
"S01_B195C_10","S01_B195C_12","S01_B195C_20","S01_B195C_22","S01_B195C_23","S01_B195C_24","S01_B195C_25",
"S01_B195C_30","S01_B195C_32","S01_B195C_33",
"S01_B223C_00","S01_B223C_02","S01_B223C_03","S01_B223C_10","S01_B223C_12",
"S01_B223D_00","S01_B223D_02",
"S01_B223H_00","S01_B223H_02","S01_B223H_03",
"S01_B235C_00","S01_B235C_02","S01_B235C_03","S01_B235C_04",
"S01_B235C_10","S01_B235C_12",
"S01_B245C_00","S01_B245C_02","S01_B245C_03","S01_B245C_04",
"S01_B245C_10","S01_B245C_12","S01_B245C_13",
"S01_B245C_20","S01_B245C_22","S01_B245C_23","S01_B245C_24",
"S01_B265C_00","S01_B265C_02","S01_B265C_03","S01_B265C_04",
"S01_B265C_10","S01_B265C_12",
"S01_B275C_00","S01_B275C_02","S01_B275C_03","S01_B275C_04",
"S01_B345C_00","S01_B345C_02","S01_B345C_03","S01_B345C_04",
"S01_B375C_00","S01_B375C_02","S01_B375C_03","S01_B375C_04",
"S01_B392P_00","S01_B392P_02","S01_B392P_03","S01_B392P_04","S01_B392P_05","S01_B392P_10","S01_B392P_12","S01_B392P_13",
"S01_B392S_00","S01_B392S_02","S01_B392S_03","S01_B392S_04","S01_B392S_05",
"S01_B422P_00","S01_B422P_02","S01_B422P_03","S01_B422P_04","S01_B422P_10","S01_B422P_12",
"S01_B422S_00","S01_B422S_02","S01_B422S_03","S01_B422S_04","S01_B422S_10","S01_B422S_12",
"S01_B432S_00","S01_B432S_02","S01_B432S_03","S01_B432S_04","S01_B432S_05",
"S01_B563C_00","S01_B563C_02",
"S01_B563H_00","S01_B563H_02","S01_B563H_03",
    ]    
#-----------------------------------------------------------------------       
    idata2c1=[
"S01_B014C_00","S01_B014C_02","S01_B014C_03","S01_B014C_04","S01_B014C_05",
"S01_B021P_20","S01_B021P_22",
"S01_B021S_20","S01_B021S_22",
"S01_B031P_20","S01_B031P_22",
"S01_B031S_20","S01_B031S_22",
"S01_B041P_40","S01_B041P_42",
"S01_B041S_40","S01_B041S_42",
"S01_B051P_40","S01_B051P_42",
"S01_B051S_40","S01_B051S_42",
"S01_B061P_40","S01_B061P_42",
"S01_B061S_40","S01_B061S_42",
"S01_B071P_40","S01_B071P_42",
"S01_B071S_40","S01_B071S_42",
"S01_B084P_20","S01_B084P_22",
"S01_B084S_20","S01_B084S_22",
"S01_B091P_30","S01_B091P_32",
"S01_B091S_30","S01_B091S_32",
"S01_B114C_20","S01_B114C_22","S01_B114C_23","S01_B114C_24",
"S01_B123C_20","S01_B123C_22","S01_B123C_23",
"S01_B134P_00","S01_B134P_02","S01_B134P_03","S01_B134P_04",
"S01_B134S_00","S01_B134S_02","S01_B134S_03","S01_B134S_04",
"S01_B153C_30","S01_B153C_32",
"S01_B165C_40","S01_B165C_42","S01_B165C_43","S01_B165C_44",
"S01_B175C_40","S01_B175C_42","S01_B175C_43","S01_B184C_20","S01_B184C_22","S01_B184C_23",
"S01_B223C_20","S01_B223C_22",#"S01_B223C_23",#"S01_B223C_24",
"S01_B235C_20","S01_B235C_22","S01_B235C_23","S01_B235C_24","S01_B235C_25","S01_B235C_26",
"S01_B245C_30","S01_B245C_32","S01_B245C_33",
"S01_B265C_20","S01_B265C_22",#"S01_B265C_23",#"S01_B265C_24",#"S01_B265C_25",
"S01_B275C_10","S01_B275C_12","S01_B275C_13","S01_B275C_14","S01_B275C_15","S01_B275C_16",
"S01_B293D_00","S01_B293D_02","S01_B293D_03","S01_B293D_04","S01_B293D_05",
"S01_B333C_00","S01_B333C_02","S01_B333C_03",
"S01_B345C_10","S01_B345C_12","S01_B345C_13","S01_B345C_14","S01_B345C_15",#"S01_B345C_16",
"S01_B384C_00","S01_B384C_02","S01_B384C_03","S01_B384C_04","S01_B384C_05",
"S01_B392P_20","S01_B392P_22","S01_B392P_23",
"S01_B392S_10","S01_B392S_12","S01_B392S_13",
"S01_B432P_00","S01_B432P_02","S01_B432P_03","S01_B432P_04","S01_B432P_05",
"S01_B444H_00","S01_B444H_02","S01_B444H_12",
"S01_B444S_00","S01_B444S_02","S01_B444S_03",
"S01_B454H_00","S01_B454H_02","S01_B454H_12",
"S01_B462P_00","S01_B462P_02","S01_B462P_03",#"S01_B462P_04",
"S01_B462S_00","S01_B462S_02","S01_B462S_03","S01_B462S_04",
"S01_B472P_00","S01_B472P_02","S01_B472P_03",#"S01_B472P_04",#"S01_B472P_05",
"S01_B472S_00","S01_B472S_02","S01_B472S_03",#"S01_B472S_04",#"S01_B472S_05",
"S01_B563C_10","S01_B563C_12",
"S01_B707D_00","S01_B707D_02",#"S01_B707D_03",
    ]
    idata2c2=[
"S01_B014C_99",
"S01_B021P_99",
"S01_B021S_99",
"S01_B031P_99",
"S01_B031S_99",
"S01_B041P_99",
"S01_B041S_99",
"S01_B051P_99",
"S01_B051S_99",
"S01_B061P_99",
"S01_B061S_99",
"S01_B071P_99",
"S01_B071S_99",
"S01_B084C_99",
"S01_B091P_40",
"S01_B091S_40",
"S01_B114C_99",
"S01_B123C_30",
"S01_B134P_10",
"S01_B134S_10",
"S01_B153C_40",
"S01_B165C_99",
"S01_B175C_99",
"S01_B184C_99",
"S01_B223C_30",
"S01_B235C_30",
"S01_B245C_40",
"S01_B265C_30",
"S01_B275C_20",
"S01_B293C_00",
"S01_B333C_10",
"S01_B345C_20",
"S01_B375C_20",
"S01_B384C_10",
"S01_B392P_30",
"S01_B392S_20",
"S01_B432P_10",
"S01_B444S_10",
"S01_B454P_00",
"S01_B462P_10",
"S01_B462S_10",
"S01_B472P_10",
"S01_B472S_10",
"S01_B563C_20",
"S01_B707D_10",
    ]   
#-----
    data2["S01_B084S_22"][9]=60-20
    data2["S01_B091S_32"][9]=90-50
    data2["S01_B114C_22"][9]=160-80
    data2["S01_B114C_23"][9]=110-80
    data2["S01_B184C_22"][9]=390-50
    data2["S01_B245C_33"][9]=24-20
    data2["S01_B392P_22"][9]=90-10
#-----    
    data2["S01_B014C_99"][3]=d2
    data2["S01_B021P_99"][3]=d2
    data2["S01_B021S_99"][3]=d2
    data2["S01_B031P_99"][3]=d2
    data2["S01_B041P_99"][3]=d2
    data2["S01_B041S_99"][3]=d2
    data2["S01_B051P_99"][3]=d2
    data2["S01_B051S_99"][3]=d2
    data2["S01_B061P_99"][3]=d2
    data2["S01_B061S_99"][3]=d2
    data2["S01_B071P_99"][3]=d2
    data2["S01_B071S_99"][3]=d2
    data2["S01_B084C_99"][3]=d2
    data2["S01_B091P_40"][3]=d2
    data2["S01_B091S_40"][3]=d2
    data2["S01_B114C_99"][3]=d2
    data2["S01_B123C_30"][3]=d2
    data2["S01_B134P_10"][3]=d2
    data2["S01_B134S_10"][3]=d2
    data2["S01_B153C_40"][3]=d2
    data2["S01_B165C_99"][3]=d2
    data2["S01_B175C_99"][3]=d2
    data2["S01_B184C_99"][3]=d2
    data2["S01_B223C_30"][3]=d2
    data2["S01_B235C_30"][3]=d2
    data2["S01_B245C_40"][3]=d2
    data2["S01_B265C_30"][3]=d2
    data2["S01_B275C_20"][3]=d2
    data2["S01_B293C_00"][3]=d2
    data2["S01_B333C_10"][3]=d2
    data2["S01_B345C_20"][3]=d2
    data2["S01_B375C_20"][3]=d2
    data2["S01_B384C_10"][3]=d2
    data2["S01_B392P_30"][3]=d2
    data2["S01_B392S_20"][3]=d2
    data2["S01_B432P_10"][3]=d2
    data2["S01_B444S_10"][3]=d2
    data2["S01_B454P_00"][3]=d2
    data2["S01_B462P_10"][3]=d2
    data2["S01_B462S_10"][3]=d2
    data2["S01_B472P_10"][3]=d2
    data2["S01_B472S_10"][3]=d2
    data2["S01_B563C_20"][3]=d2
    data2["S01_B707D_10"][3]=d2
#-----------------------------------------------------------------------   
    idata2=idata2a+idata2b+idata2c1 #394=10+384
    if iwhich==5 : wplace=[]  #計画上の待機なし
    else: wplace=idata2a+idata2b+idata2c1 #計画上の待機あり     
   #sys.exit()    
OptSeq

#-----------------------------------------------------------------------
#[5.1]作業の定義...G2+G3
#----------------------------------------------------------------------- 
    act3={}
    print("リスケ開始")
    # print("*** pull in G2+G3 ***")
    # for i in idata2:       
    #     act3[i]=prob3.addActivity(data2[i][0],duedate=98,backward=True)  
    print("*** push in G2+G3 ***")  
    for i in idata2:    
        act3[i]=prob3.addActivity(data2[i][0])         
#----------------------------------------------------------------------- 
#[5.2]先行制約...G2+G3
#----------------------------------------------------------------------- 
    for i in  idata2:
        for iw in [0,1,2,3,4]:
            if data2[i][4][iw] in idata2:
                prob3.addTemporal(act3[i],act3[data2[i][4][iw]],\
                tempType=CS[data2[i][5][iw][0]], delay=int(data2[i][5][iw][1]))  
    #-----日程固定
    for i in idata2a:  
        if data2[i][1] in [1,3,5]: #
            prob3.addTemporal("source",act3[i],tempType="SS",delay= data2[i][3])   
            prob3.addTemporal(act3[i],"source",tempType="SS",delay=-data2[i][3]) 
    for i in idata2b:  
        if data2[i][1] in [0,2,6,7,9]: #
            prob3.addTemporal("source",act3[i],tempType="SS",delay= data2[i][3])   
            prob3.addTemporal(act3[i],"source",tempType="SS",delay=-data2[i][3])              
    for i in idata2b:
        prob3.addTemporal("source",act3[i],tempType="CS",delay= d1)            
        prob3.addTemporal(act3[i],"source",tempType="CS",delay=-d2) 
    # for i in idata2c1:  
    #     if data2[i][1] in [0,2,6,7,9,1,3,4,5,8]: #
    #         prob3.addTemporal("source",act3[i],tempType="SS",delay= data2[i][3])   
    #         prob3.addTemporal(act3[i],"source",tempType="SS",delay=-data2[i][3])                  
#----------------------------------------------------------------------- 
#[5.3]資源制約(配員)...G2+G3
#-----------------------------------------------------------------------  
    mode3={} 
    wno1=0;wno2=0;wno3=0;wno4=0;wno5=0;wno6=0;wno7=0
    for i in idata2:
    #10 F #11 W #12 C #13 CC #15 鉄艤 #16 甲配 #17 機配 #18 内塗 #19 外塗   
        if data2[i][1] in [10,12,11,13,15,16,17,18,19]: 
            hours=10
            n=math.ceil(data2[i][9]/hours)  #1人で何日かかるか
            mode3[i]=Mode("mode["+i+"]",duration=n)
            mode3[i].addBreak(0,"inf",maxtime=10)           
            if data2[i][1] in [10,12]:      #取付28人
                mode3[i].addResource(res1W[1],{(0,n):hours})
                if n>7 : mode3[i].addParallel(1,n,8)      
                else:    mode3[i].addParallel(1,n,4)                    
                wno1+=1
            elif data2[i][1] in [11,13]:    #溶接43人
                mode3[i].addResource(res1W[2],{(0,n):hours})
                if n>11 : mode3[i].addParallel(1,n,12)      
               #if n>11 : mode3[i].addParallel(1,n,8) 
                else:     mode3[i].addParallel(1,n,8)                  
                wno2+=1
            elif data2[i][1] in [15]:       #鉄艤装5人
                mode3[i].addResource(res1W[4],{(0,n):hours})
                if n>2 : mode3[i].addParallel(1,n,5)      
                else:    mode3[i].addParallel(1,n,3)   
                wno3+=1
            elif data2[i][1] in [16]:       #甲板配管7人
                mode3[i].addResource(res1W[5],{(0,n):hours})
                if n>6 : mode3[i].addParallel(1,n,7)      
                else:    mode3[i].addParallel(1,n,4)          
                wno4+=1
            elif data2[i][1] in [17]:       #機関配管5人
                mode3[i].addResource(res1W[6],{(0,n):hours})
                if n>14: mode3[i].addParallel(1,n,5)      
                else:    mode3[i].addParallel(1,n,3)  
                wno5+=1
            elif data2[i][1] in [18]:       #塗装12人
                mode3[i].addResource(res1W[3], {(0,n):hours})
                if n>8 : mode3[i].addParallel(1,n,9)      
                else:    mode3[i].addParallel(1,n,8)        
                wno6+=1
            elif data2[i][1] in [19]:       #塗装12人
                mode3[i].addResource(res1W[3], {(0,n):hours})
                if n>3 : mode3[i].addParallel(1,n,8)      
                else:    mode3[i].addParallel(1,n,4)        
                wno6+=1                
            act3[i].addModes(mode3[i])       
    # 0搭載, 1開始, 2入荷, 3正, 4反, 5出棟, 6入ブ, 7出ブ, 8運搬, 9合体; 14ダミー
        elif data2[i][1]!=-1:
            if data2[i][1]==14: mode3[i]=Mode("mode["+i+"]",duration=data2[i][2]) 
            else: mode3[i]=Mode("mode["+i+"]",duration=1) 
            act3[i].addModes(mode3[i])              
            wno7+=1                   
#----------------------------------------------------------------------- 
#[5.4]資源制約(作業場所)...G2+G3 
#----------------------------------------------------------------------- 
    # 0搭載, 1開始, 2入荷, 3正, 4反, 5出棟, 6入ブ, 7出ブ, 8運搬, 9合体, 
    ww={}
    for i in idata2:
        if data2[i][1] in [1,2,3,4,5,6,7,8,9]:
            nop=len(data2[i][4])
            for iw in range(1,nop):
                j=data2[i][4][iw] #枝iwの後続作業ID
                if j!="0":
                    #シリアルな後続は飛ばす
                    while data2[j][8]==0: j=data2[j][4][0]
                ww[i,iw]=j 
    #----- 作業場所    
    d_act={} 
    d_mode={}
    for i in idata2:
          if data2[i][1] in [1,2,3,4,5,6,7,8,9] and data2[i][6]!=0:
              d_act[i]=prob3.addActivity("場所_for_"+i)       
             #print(i)
              for no in range(len(data2[i][6])):  
                  w=L1L2B1B2lb(R,data2,i,6,no)
                  no1,L1,L2,B1,B2,l,b=w[0],w[1],w[2],w[3],w[4],w[5],w[6]
                 #if i in idata2b: L1=0; L2=R[no1][1]; B1=0; B2=R[no1][2];
                  skipL=1; skipB=1;        
                  for j in range(L1,L2-l+1,skipL): 
                      for k in range(B1,B2-b+1,skipB):
                          d_mode[i,no1,j,k]=Mode(\
                          "mode["+i+"]3_R[{0:03d}][{1:03d}_{2:03d}][{3:03d}_{4:03d}]"\
                          .format(no1,j,k,l,b))
                          for s in range(0,l):
                              for t in range(0,b):
                                  d_mode[i,no1,j,k].addBreak(0,'inf')
                                  d_mode[i,no1,j,k].addResource(res3PL[no1,j+s,k+t],1,"break")
                                  d_mode[i,no1,j,k].addResource(res2S[no1],l*b,"break")                                
                          d_act[i].addModes(d_mode[i,no1,j,k])                    
                  prob3.addTemporal(act3[i],d_act[i],tempType="SS")
                  prob3.addTemporal(d_act[i],act3[i],tempType="SS")
                  nop=len(data2[i][4])
                  for iw in range(1,nop):
                      ii=ww[i,iw]
                      if ii!="0" and ii in idata2:
                          prob3.addTemporal(d_act[i],act3[ii],tempType="CC")  
                          prob3.addTemporal(act3[ii],d_act[i],tempType="CC")  
    #----- 待機場所 
    d_act2={}
    d_mode2={}
    for i in wplace:
        if data2[i][1] in [1,2,3,4,5,6,7,8,9]:
            data2[i][7]=data2[i][6]            
            d_act2[i]=prob3.addActivity("空置_after_"+i) 
            for no in range(len(data2[i][7])):  
                w=L1L2B1B2lb(R,data2,i,7,no)
                no1,L1,L2,B1,B2,l,b=w[0],w[1],w[2],w[3],w[4],w[5],w[6]       
                #L1=0; L2=R[no1][1]; B1=0; B2=R[no1][2]; 
                skipL=1; skipB=1;        
                for j in range(L1,L2-l+1,skipL): 
                    for k in range(B1,B2-b+1,skipB):
                        d_mode2[i,no1,j,k]=Mode(\
                        "mode["+i+"]4_R[{0:03d}][{1:03d}_{2:03d}][{3:03d}_{4:03d}]"\
                        .format(no1,j,k,l,b))
                        for s in range(0,l):
                            for t in range(0,b):
                                d_mode2[i,no1,j,k].addBreak(0,'inf')
                                d_mode2[i,no1,j,k].addResource(res3PL[no1,j+s,k+t],0,"break")
                                #d_mode2[i,no1,j,k].addResource(res2S[no1],0,"break") 
                        d_act2[i].addModes(d_mode2[i,no1,j,k])                          
                prob3.addTemporal(d_act[i],d_act2[i],tempType="CS")
                prob3.addTemporal(d_act2[i],d_act[i],tempType="SC") 
                ii=data2[ww[i,1]][4][0]
                if ii in wplace:
                    prob3.addTemporal(act3[ii],d_act2[i],tempType="SC")
                    prob3.addTemporal(d_act2[i],act3[ii],tempType="CS")                                      
#----------------------------------------------------------------------- 
#[5.5]問題求解... G2+G3
#----------------------------------------------------------------------- 
    A=[]
    for a in prob3.act: A.append(a.name) 
   #print("アクティビティ:",A)  
    N=len(prob3.act)
    print("アクティビティ総数(含待機数):",N)  
    M=[]
    for a in prob3.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)                        
#----------------------------------------------------------------------- 
   #prob3.Params.Makespan=True
   #prob3.Params.Initial=False
   #prob3.Params.OutputFlag=False
   #prob3.Params.Neighborhood=20
    prob3.Params.RandomSeed=1
    prob3.Params.TimeLimit=300 
    prob3.optimize()
    filename="rcpsp71.csv"
    #print("writing "+filename) 
    prob3.writeExcel(filename)
    print("アクティビティ総数(含待機数):",N)  
    print("平均モード数:",round(sum(M)/N))
    print("問題の規模: 10**",P)
    sys.exit()
#-----------------------------------------------------------------------
#[5.6]計画上の調整期間における場所取り
#----------------------------------------------------------------------- 
    print(" ")
    print("計画上の調整期間における場所取り in G2+G3")  
    jdata=[]; ldata=[]; mdata=[]; ndata=[]
    data3={}
    for i in data2:
        data3[i]=data2[i].copy()
    for a in prob3.act:
        if len(a.modes)==1: mode_nam=a.selected.name
        else: mode_nam=a.selected
       #print("__"+a.name,len(a.modes),mode_nam,a.start,a.completion)
        if "場所_for_" in a.name:
            i=a.name[7:] #運搬作業(期間1)
            j=i[0:11]+"1"
            ldata.append(j)
            data3[j][3]=a.start
            data3[j][2]=a.completion-a.start               
            r=int(mode_nam[16+6:19+6]) 
            x=int(mode_nam[21+6:24+6]) 
            y=int(mode_nam[25+6:28+6]) 
            l=int(mode_nam[30+6:33+6]) 
            b=int(mode_nam[34+6:37+6])       
            data3[j][6]=[[r,x,x+l,y,y+b]]  
            data3[j][8]=[l,b,0]                    
        elif "空置_after_" in a.name:
            i=a.name[9:]
           #j=i[0:11]+"W"
            mdata.append(i)      
            if a.completion-a.start>0:
                data3[i][3]=a.start
                data3[i][2]=a.completion-a.start    
                jdata.append(i)
               #print(len(jdata),i,r,l,b)            
                if   r in [1,2]: data3[i][7]=[R01,R02,R03,P03] 
               #elif r in [5,6]: data3[i][7]=[R05,P07]
                else:            data3[i][7]=Q001+Q002+R00            
        elif "S01_" in a.name:
            i=a.name[0:12]  
            ndata.append(i)
            #if i[10:12]=="00": #運搬作業(期間1)
            data3[i][3]=a.start
            data3[i][2]=a.completion-a.start  #不要                
           #data3[i][3]=a.start
           #data3[i][2]=a.completion-a.start          
    print(len(ldata),len(mdata),len(ndata),len(jdata)) 
#sys.exit()     
OptSeq

#=======================================================================
#iwhich=6 #プッシュ型逐次計画Step2: 待機の場所取りは面全体(前後船含む)
if iwhich==6: 
#=======================================================================    
    prob4=Model()
#----------------------------------------------------------------------- 
#[6.0]リソースの定義(場所) 
#-----------------------------------------------------------------------   
   #-----未使用のリソース
    for id in R:    
        for i in range(0,R[id][1]):
          for j in range(0,R[id][2]):  
              res3PL[id,i,j] =prob4.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j),\
                            capacity=res3PL[id,i,j].residual)
#----------------------------------------------------------------------- 
#[6.1]作業の定義
#----------------------------------------------------------------------- 
    act4={}
    for i in jdata:    
        act4[i]=prob4.addActivity("待機_after_"+data3[i][0][0:12])
#----------------------------------------------------------------------- 
#[6.2]先行制約
#----------------------------------------------------------------------- 
   #-----日程固定
    for i in jdata:  
        prob4.addTemporal("source",act4[i],tempType="SS",delay= data3[i][3])   
        prob4.addTemporal(act4[i],"source",tempType="SS",delay=-data3[i][3])   
#----------------------------------------------------------------------- 
#[6.3]資源制約(作業場所)      
#----------------------------------------------------------------------- 
    mode4={} 
    for i in jdata:  
       #print(i,data3[i][0])
        for no in range(len(data3[i][7])):      
           #w=L1L2B1B2lb(R,data3,i,7,no)
           #no1,L1,L2,B1,B2,l,b=w[0],w[1],w[2],w[3],w[4],w[5],w[6]       
           #L1=0; L2=R[no1][1]; B1=0; B2=R[no1][2];  
            no1=data3[i][7][no][0];
            L=R[no1][1]; B=R[no1][2];
            L1=data3[i][7][no][1]; L2=data3[i][7][no][2];     
            B1=data3[i][7][no][3]; B2=data3[i][7][no][4];   
            l=math.floor(data3[i][8][0]); b=math.floor(data3[i][8][1]);                
            skipL=1; skipB=1;        
            for j in range(L1,L2-l+1,skipL): 
                for k in range(B1,B2-b+1,skipB):
                    mode4[i,no1,j,k]=Mode(\
                    "mode["+i+"]5_R[{0:03d}][{1:03d}_{2:03d}][{3:03d}_{4:03d}]"\
                    .format(no1,j,k,l,b),duration=data3[i][2])
                    for s in range(0,l):
                        for t in range(0,b):
                            mode4[i,no1,j,k].addResource(res3PL[no1,j+s,k+t],1)            
                    #mode4[i,no1,j,k].addResource(res2S[no1,j,k],l*b)   
                    act4[i].addModes(mode4[i,no1,j,k])
#----------------------------------------------------------------------- 
#[6.4]問題求解
#----------------------------------------------------------------------- 
    A=[]
    for a in prob4.act: A.append(a.name) 
   #print("アクティビティ:",A)  
    N=len(prob4.act)
    print("アクティビティ総数(含待機数):",N)  
    M=[]
    for a in prob4.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)  
#----------------------------------------------------------------------- 
   #prob4.Params.Makespan=True
   #prob4.Params.Initial=False 
   #prob4.Params.OutputFlag=True
    prob4.Params.RandomSeed=1
    prob4.Params.TimeLimit=600
    prob4.optimize()
    filename="rcpsp72.csv"
   #print("writing "+filename) 
    prob4.writeExcel(filename) 
#=======================================================================
#eof