# 数据结构定义:存储订单、企业、供应商数据及算法配置 class OrderData: """订单数据类:存储物料需求、交货期、成本等信息""" def __init__(self): self.I = 5 # 物料种类数 self.Q = [6000, 12000, 20000, 7500, 13500] # 各物料的需求数量(整数) self.Dd = 30 # 需求交货期(单位:时间,整数) self.P0 = [45, 30, 30, 50, 40] # 风险企业的单位采购价(整数) self.T0 = [5, 8, 6, 7, 9] # 风险企业的单位运输成本(整数) self.transport_speed = 10 # 运输速度(单位:距离/时间,整数) class RiskEnterpriseData: """风险企业数据类:存储风险企业的产能、距离等信息""" def __init__(self): self.I = 5 # 物料种类数(与订单一致) self.C0_i_min = [50, 100, 150, 80, 100] # 单物料的单位时间最小产能(整数) self.C0_total_max = 900 # 总产能上限(单位时间,整数) self.distance = 20 # 与需求点的距离(整数) class SupplierData: """供应商数据类:存储各供应商的产能、价格、距离等信息""" def __init__(self, I=5): self.I = I # 物料种类数 self.supplier_count = 4 # 供应商数量 self.names = ["S0", "S1", "S2", "S3"] # 供应商名称 # 能否生产某物料的矩阵(supplier_count × I),1=能生产,0=不能 self.can_produce = [ [1, 1, 1, 1, 1], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [0, 0, 1, 1, 1] ] # 单物料单位时间最小产能(supplier_count × I),0表示不能生产该物料(整数) self.Cj_i_min = [ [30, 80, 100, 60, 80], [60, 0, 180, 0, 120], [0, 150, 0, 120, 0], [0, 0, 170, 105, 115] ] # 供应商单位时间的最大总产能(supplier_count,整数) self.Cj_total_max = [700, 800, 600, 850] # 最小起订量(supplier_count × I,整数) self.MinOrder = [ [800, 1500, 3000, 800, 1500], [1000, 0, 3500, 0, 1800], [0, 1700, 0, 1000, 0], [0, 0, 2500, 500, 1000] ] # 最大供应量(supplier_count × I,整数) self.MaxOrder = [ [5000, 10000, 18000, 6500, 11000], [8000, 0, 25000, 0, 15000], [0, 8000, 0, 6000, 0], [0, 0, 20000, 7500, 13500] ] # 单位采购价格(supplier_count × I,整数) self.P_ij = [ [50, 35, 28, 47, 38], [43, 0, 28, 0, 36], [0, 31, 0, 52, 0], [0, 0, 32, 52, 43] ] # 单位运输成本(supplier_count × I,整数) self.T_ij = [ [6, 9, 8, 9, 12], [4, 0, 5, 0, 15], [0, 10, 0, 7, 0], [0, 0, 8, 9, 11] ] # 供应商与需求点的距离(supplier_count,整数) self.distance = [60, 50, 70, 40] class Config: """算法参数配置类:存储NSGA-II的各类参数""" def __init__(self): # 种群参数 self.pop_size = 100 # 种群大小 self.N1_ratio = 0.2 # 优先成本的种群比例 self.N2_ratio = 0.2 # 优先延期的种群比例 self.N3_ratio = 0.3 # 强制风险企业的种群比例 self.N4_ratio = 0.3 # 随机种群比例 # 遗传操作参数 self.crossover_prob = 0.8 # 交叉概率 self.mutation_prob = 0.3 # 变异概率 self.max_generations = 500 # 最大进化代数 # 惩罚系数 self.delta = 1.3 # 变更惩罚系数 # 早停参数 self.early_stop_patience = 20 # 连续多少代无改进则早停 self.early_stop_threshold = 0.15 # 目标值变化阈值 # 目标函数数量 self.objective_num = 2 # 双目标(成本+延期) self.duplicate_threshold = 0.05 # 重复解保留数量 self.print_top_n = 10 # 打印前N个最优解 class DataStructures: """数据结构工具类:提供评价指标计算等功能""" @staticmethod def calculate_evaluation_index(objectives, optimal_cost, optimal_tardiness): """ 计算评价指标 :param objectives: 解的目标值 (成本, 延期) :param optimal_cost: 最优成本值 :param optimal_tardiness: 最优延期值 :return: 评价指标值 """ cost, tardiness = objectives # 避免除以零(成本最优值为0时的保护) if optimal_cost == 0: cost_ratio = cost else: cost_ratio = 2*(cost / optimal_cost) # 延期处理(+1避免除以零) tardiness_ratio = 800*((tardiness + 1) / (optimal_tardiness + 1)) return cost_ratio + tardiness_ratio