From 96e4b3d856dca05f60cf011dd32dca83dd460f0a Mon Sep 17 00:00:00 2001 From: hit_lu Date: Fri, 14 Nov 2025 11:35:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=BB=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ optimizer.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 .gitignore create mode 100644 optimizer.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..341e31e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +.idea \ No newline at end of file diff --git a/optimizer.py b/optimizer.py new file mode 100644 index 0000000..61c80f1 --- /dev/null +++ b/optimizer.py @@ -0,0 +1,81 @@ +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() +