82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
import pandas as pd
|
|
|
|
from core.interface import *
|
|
from data.type import *
|
|
from data.loader import *
|
|
|
|
from opt.hyper_heuristic import *
|
|
|
|
|
|
class TopBtmOpt(BaseOpt):
|
|
def __init__(self, config, part_data, step_data, feeder_data=None):
|
|
super().__init__(config, part_data, step_data, feeder_data)
|
|
self.feeder_data = pd.DataFrame(columns=['slot', 'part'])
|
|
self.optimizer = FeederPriorityOpt
|
|
|
|
def optimize(self, hinter=True):
|
|
rows = pd.Series()
|
|
top_part, btm_part = set(), set()
|
|
|
|
part_points = defaultdict(int)
|
|
part_top_points = defaultdict(int)
|
|
for r, data in self.step_data.iterrows():
|
|
if data.layer == 1:
|
|
top_part.add(data.part)
|
|
part_top_points[data.part] += 1
|
|
else:
|
|
btm_part.add(data.part)
|
|
part_points[data.part] += 1
|
|
# part_points = {part: points for part, points in part_points.items() if part in top_part and part in btm_part}
|
|
points_stat = pd.DataFrame(columns=['part', 'top', 'btm', 'total'])
|
|
for part, points in part_points.items():
|
|
points_stat.loc[len(points_stat)] = [part, part_top_points[part], points - part_top_points[part], points]
|
|
|
|
for r, data in self.step_data.iterrows():
|
|
rows[r] = True if data.part in top_part and data.part in btm_part and part_points[data.part] > 7 else False
|
|
|
|
dblayer_step_data = self.step_data[rows]
|
|
opt = self.optimizer(self.config, self.part_data, dblayer_step_data, self.feeder_data)
|
|
opt.optimize()
|
|
self.feeder_data = opt.feeder_data
|
|
|
|
for _, layer_step in self.step_data.groupby('layer'):
|
|
opt = self.optimizer(self.config, self.part_data, layer_step, self.feeder_data)
|
|
opt.optimize(hinter=hinter)
|
|
|
|
self.result = self.result + opt.result
|
|
self.feeder_data = opt.feeder_data
|
|
|
|
|
|
@timer_wrapper
|
|
def main():
|
|
# 参数解析
|
|
parser = argparse.ArgumentParser(description='assembly line optimizer implementation')
|
|
# parser.add_argument('--filename', default='PCB-1.txt', type=str, help='pcb data')
|
|
parser.add_argument('--filename', default='US2.259.0600-US7.820.51964-A1-B3-64T.txt', type=str, help='pcb data')
|
|
params = parser.parse_args()
|
|
|
|
# 结果输出显示所有行和列
|
|
pd.set_option('display.max_columns', None)
|
|
pd.set_option('display.max_rows', None)
|
|
|
|
part_data, step_data = load_data(params.filename)
|
|
config = MachineConfig()
|
|
|
|
# # === 整线 ===
|
|
# opt = HyperHeuristicOpt(2, part_data, step_data)
|
|
# opt.optimize()
|
|
# for machine_index, result in enumerate(opt.result):
|
|
# print('-------- Machine: ' + str(machine_index) + '--------')
|
|
# evaluation(config, part_data, step_data, result, hinter=True) # 估算贴装用时
|
|
|
|
# === 单机 ===
|
|
opt = TopBtmOpt(config, part_data, step_data)
|
|
opt.optimize()
|
|
evaluation(config, part_data, step_data, opt.result, hinter=True) # 估算贴装用时
|
|
print('------------------------------ ')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|