增加预安装供料器功能、路径规划模型支持单点、整线优化支持批量处理
This commit is contained in:
64
optimizer.py
64
optimizer.py
@ -1,5 +1,7 @@
|
||||
import time
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from dataloader import *
|
||||
from lineopt_genetic import line_optimizer_genetic
|
||||
from lineopt_heuristic import line_optimizer_heuristic
|
||||
@ -10,11 +12,9 @@ from lineopt_model import line_optimizer_model
|
||||
from base_optimizer.optimizer_interface import *
|
||||
|
||||
|
||||
def optimizer(pcb_data, component_data, params):
|
||||
def optimizer(pcb_data, component_data, feeder_data, params):
|
||||
if params.machine_number == 1:
|
||||
assembly_info = [
|
||||
base_optimizer(1, pcb_data, component_data, pd.DataFrame(columns=['slot', 'part', 'arg']), params,
|
||||
hinter=True)]
|
||||
assembly_info = [base_optimizer(1, pcb_data, component_data, feeder_data, params, hinter=True)]
|
||||
return assembly_info
|
||||
|
||||
if params.line_optimizer == 'hyper-heuristic' or params.line_optimizer == 'heuristic' or params.line_optimizer \
|
||||
@ -33,8 +33,8 @@ def optimizer(pcb_data, component_data, params):
|
||||
for machine_index in range(params.machine_number):
|
||||
assembly_info.append(base_optimizer(machine_index + 1, partial_pcb_data[machine_index],
|
||||
partial_component_data[machine_index],
|
||||
pd.DataFrame(columns=['slot', 'part', 'arg']), params, hinter=True))
|
||||
elif params.line_optimizer == 'model':
|
||||
pd.DataFrame(columns=['slot', 'part']), params, hinter=True))
|
||||
elif params.line_optimizer == 'mip-model':
|
||||
assembly_info = line_optimizer_model(component_data, pcb_data, params.machine_number)
|
||||
else:
|
||||
raise 'line optimizer method is not existed'
|
||||
@ -44,19 +44,20 @@ def optimizer(pcb_data, component_data, params):
|
||||
|
||||
@timer_wrapper
|
||||
def main():
|
||||
warnings.simplefilter(action='ignore', category=FutureWarning)
|
||||
# 参数解析
|
||||
parser = argparse.ArgumentParser(description='assembly line optimizer implementation')
|
||||
parser.add_argument('--mode', default=1, type=int, help='mode: 0 -directly load pcb data without optimization '
|
||||
'for data analysis, 1 -optimize pcb data, 2 -batch test')
|
||||
parser.add_argument('--filename', default='L01/KAN3-Z2.txt', type=str, help='load pcb data')
|
||||
parser.add_argument('--filename', default='PCB.txt', type=str, help='load pcb data')
|
||||
# parser.add_argument('--filename', default='chapter3-2/PCB2-8 Arg1.txt', type=str, help='load pcb data')
|
||||
parser.add_argument('--comp_register', default=1, type=int, help='register the component according the pcb data')
|
||||
parser.add_argument('--machine_number', default=2, type=int, help='the number of machine in the assembly line')
|
||||
parser.add_argument('--machine_optimizer', default='feeder-scan', type=str, help='optimizer for single machine')
|
||||
parser.add_argument('--machine_number', default=1, type=int, help='the number of machine in the assembly line')
|
||||
# parser.add_argument('--machine_optimizer', default='mip-model', type=str, help='optimizer for single machine')
|
||||
parser.add_argument('--machine_optimizer', default='feeder-priority', type=str, help='optimizer for single machine')
|
||||
parser.add_argument('--line_optimizer', default='hyper-heuristic', type=str, help='optimizer for PCB assembly line')
|
||||
# parser.add_argument('--line_optimizer', default='model', type=str, help='optimizer for PCB assembly line')
|
||||
parser.add_argument('--feeder_limit', default=1, type=int, help='the upper feeder limit for each type of component')
|
||||
parser.add_argument('--save', default=1, type=int, help='save the optimization result')
|
||||
parser.add_argument('--save', default=0, type=int, help='save the optimization result')
|
||||
parser.add_argument('--save_suffix', default='(10)', type=str, help='load pcb data')
|
||||
params = parser.parse_args()
|
||||
|
||||
@ -88,14 +89,16 @@ def main():
|
||||
f'standard deviation: {np.std([info.total_time for info in assembly_info]): .3f}')
|
||||
|
||||
elif params.mode == 1:
|
||||
sys.stdout = open(f'record/{params.filename[:-4]}-{params.line_optimizer}.txt', 'w')
|
||||
# sys.stdout = open(f'record/{params.filename[:-4]}-{params.line_optimizer}.txt', 'w')
|
||||
|
||||
# 加载PCB数据
|
||||
partial_pcb_data, partial_component_data, _ = load_data(params.filename)
|
||||
partial_pcb_data, partial_component_data, feeder_data = load_data(params.filename, load_feeder=True)
|
||||
pcb_data, component_data = merge_data(partial_pcb_data, partial_component_data)
|
||||
start_time = time.time()
|
||||
assembly_info = optimizer(pcb_data, component_data, params)
|
||||
sys.stdout = sys.__stdout__
|
||||
|
||||
assembly_info = optimizer(pcb_data, component_data, feeder_data, params)
|
||||
|
||||
# sys.stdout = sys.__stdout__
|
||||
print(f'optimizer running time: {time.time() - start_time: .3f}')
|
||||
for machine_idx, info in enumerate(assembly_info):
|
||||
print(f'assembly time for machine {machine_idx + 1: d}: {info.total_time: .3f} s, total placement: '
|
||||
@ -105,6 +108,37 @@ def main():
|
||||
|
||||
print(f'finial assembly time: {max(info.total_time for info in assembly_info): .3f} s, '
|
||||
f'standard deviation: {np.std([info.total_time for info in assembly_info]): .3f}')
|
||||
elif params.mode == 2:
|
||||
machine_optimizer = ['two-phase', 'hybrid-genetic', 'cell-division', 'feeder-priority', 'aggregation']
|
||||
running_round = 10
|
||||
opt_columns = ['Cycle', 'Pick', 'Nozzle-Change', 'Running-Time']
|
||||
opt_result, opt_runtime = defaultdict(pd.DataFrame), defaultdict(pd.DataFrame)
|
||||
for opt in machine_optimizer:
|
||||
opt_result[opt] =pd.DataFrame(columns=opt_columns)
|
||||
opt_result[opt].index.name = 'file'
|
||||
|
||||
for _, file in enumerate(os.listdir('data/')):
|
||||
if file[-3:] != 'txt':
|
||||
continue
|
||||
partial_pcb_data, partial_component_data, feeder_data = load_data(file)
|
||||
pcb_data, component_data = merge_data(partial_pcb_data, partial_component_data)
|
||||
for opt in machine_optimizer:
|
||||
for round_idx in range(running_round):
|
||||
print(f'--- file : {file}, round : {round_idx}, optimizer : {opt} --- ')
|
||||
|
||||
params = parser.parse_args(['--machine_optimizer', opt, '--machine_number', str(1)])
|
||||
|
||||
start_time = time.time()
|
||||
assembly_info = optimizer(pcb_data, component_data, feeder_data, params)
|
||||
|
||||
opt_result[opt].loc[file + str(round_idx + 1), 'Cycle'] = assembly_info[0].cycle_counter
|
||||
opt_result[opt].loc[file + str(round_idx + 1), 'Pick'] = assembly_info[0].pickup_counter
|
||||
opt_result[opt].loc[file + str(round_idx + 1), 'Nozzle-Change'] = assembly_info[0].nozzle_change_counter
|
||||
opt_result[opt].loc[file + str(round_idx + 1), 'Running-Time'] = time.time() - start_time
|
||||
|
||||
with pd.ExcelWriter('result/machine_optimizer.xlsx', engine='openpyxl') as writer:
|
||||
for opt, result in opt_result.items():
|
||||
result.to_excel(writer, sheet_name=opt, float_format='%.3f', na_rep='')
|
||||
else:
|
||||
# line_optimizer = ['T-Solution', 'hyper-heuristic', 'genetic', 'reconfiguration']
|
||||
line_optimizer = ['genetic']
|
||||
|
Reference in New Issue
Block a user