优化主函数实现

This commit is contained in:
2025-11-14 11:35:15 +08:00
parent 79b09b2578
commit 96e4b3d856
2 changed files with 83 additions and 0 deletions

81
optimizer.py Normal file
View File

@@ -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()