OrderReallocation-HeavyTruc.../data_structures.py

153 lines
8.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据结构定义:存储订单、企业、供应商数据及算法配置
class OrderData:
"""订单数据类:存储物料需求、交货期、成本等信息(贴合生产实际优化)"""
def __init__(self):
self.I = 12 # 物料种类数12种分3类核心/常规/小众)
# 需求数量:核心物料(1-3)需求量大(1.5-2.5万)、常规物料(4-9)中等(0.7-1.2万)、小众物料(10-12)小(0.3-0.5万)
self.Q = [22000, 25000, 18000, 11000, 9500, 12000, 8500, 7000, 9000, 4500, 3800, 5000]
self.Dd = 35 # 交货期微调为3512种物料需更合理的生产周期
# 风险企业采购价:核心物料批量效应价低(28-35)、常规中等(38-45)、小众物料价高(48-52)
self.P0 = [32, 28, 30, 42, 40, 45, 38, 41, 43, 50, 48, 52]
# 风险企业运输成本距离近20成本整体偏低(5-8),小众物料因量小单位运输成本略高
self.T0 = [5, 6, 5, 7, 6, 7, 6, 8, 7, 8, 7, 8]
self.transport_speed = 12 # 运输速度微调为12更贴合实际公路运输效率
class RiskEnterpriseData:
"""风险企业数据类:存储风险企业的产能、距离等信息(优化产能梯度)"""
def __init__(self):
self.I = 12 # 物料种类数(与订单一致)
# 单物料最小产能:核心物料产能高(120-150)、常规中等(80-110)、小众低(50-70)
self.C0_i_min = [140, 150, 130, 100, 90, 110, 85, 80, 95, 65, 55, 70]
self.C0_total_max = 1100 # 总产能上限适配12种物料的综合供应略高于原数值
self.distance = 20 # 风险企业优先布局在需求点附近,距离保持低值
class SupplierData:
"""供应商数据类7家供应商专业化分工+数值贴合实际供需)"""
def __init__(self, I=12):
self.I = I # 物料种类数
self.supplier_count = 7 # 供应商数量7家分综合/专业/小众类型)
self.names = ["S0", "S1", "S2", "S3", "S4", "S5", "S6"] # 供应商命名
# 生产权限矩阵7×12体现专业化分工
# S0全品类头部综合供应商S1核心+部分常规S2常规物料S3小众+部分常规S4-S6专用物料按物料组分工
self.can_produce = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], # S0全品类覆盖
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], # S1核心(1-3)+常规(4-6)
[0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], # S2常规物料(4-9)
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], # S3常规(7-9)+小众(10-12)
[1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0], # S4专用组11/4/7/10
[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0], # S5专用组22/5/8/11
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1] # S6专用组33/6/9/12
]
# 单物料最小产能7×120=不能生产,产能与物料类型匹配
self.Cj_i_min = [
[130, 140, 120, 95, 85, 105, 80, 75, 90, 60, 50, 65], # S0全品类产能均衡
[145, 155, 135, 100, 90, 110, 0, 0, 0, 0, 0, 0], # S1核心物料产能偏高
[0, 0, 0, 98, 88, 108, 82, 78, 92, 0, 0, 0], # S2常规物料产能中等
[0, 0, 0, 0, 0, 0, 83, 79, 93, 62, 52, 67], # S3小众物料产能偏低
[135, 0, 0, 96, 0, 0, 81, 0, 0, 61, 0, 0], # S4专用组1产能适配
[0, 142, 0, 0, 87, 0, 0, 76, 0, 0, 51, 0], # S5专用组2产能适配
[0, 0, 132, 0, 0, 106, 0, 0, 89, 0, 0, 66] # S6专用组3产能适配
]
# 总产能上限:头部供应商(S0)最高,专业供应商次之,小众供应商最低(符合实际供应链层级)
self.Cj_total_max = [950, 880, 820, 750, 700, 680, 650]
# 最小起订量:核心物料起订量高(2000-3500)、常规中等(800-1800)、小众低(300-600)
self.MinOrder = [
[3200, 3500, 2800, 1600, 1200, 1800, 1000, 800, 1400, 500, 350, 550],
[3300, 3600, 2900, 1700, 1300, 1900, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1650, 1250, 1850, 1050, 850, 1450, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1100, 900, 1500, 550, 400, 600],
[3250, 0, 0, 1620, 0, 0, 1020, 0, 0, 520, 0, 0],
[0, 3550, 0, 0, 1280, 0, 0, 880, 0, 0, 380, 0],
[0, 0, 2850, 0, 0, 1880, 0, 0, 1480, 0, 0, 580]
]
# 最大供应量:不低于订单需求(避免供应不足),核心物料供应能力强,小众物料供应有限
self.MaxOrder = [
[25000, 28000, 21000, 14000, 12000, 15000, 11000, 9000, 12000, 6000, 5000, 7000],
[26000, 29000, 22000, 15000, 13000, 16000, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 14500, 12500, 15500, 11500, 9500, 12500, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 12000, 10000, 13000, 6500, 5500, 7500],
[25500, 0, 0, 14200, 0, 0, 11200, 0, 0, 6200, 0, 0],
[0, 28500, 0, 0, 12800, 0, 0, 9800, 0, 0, 5200, 0],
[0, 0, 21500, 0, 0, 15800, 0, 0, 12800, 0, 0, 7200]
]
# 单位采购价:核心物料因批量大价低(28-35)、常规中等(38-45)、小众高(48-55);专业供应商比综合供应商价略低(专业化优势)
self.P_ij = [
[30, 28, 29, 40, 38, 43, 39, 41, 42, 50, 48, 51],
[29, 27, 28, 39, 37, 42, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 38, 36, 41, 37, 39, 40, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 38, 40, 41, 49, 47, 50],
[31, 0, 0, 40, 0, 0, 39, 0, 0, 51, 0, 0],
[0, 28, 0, 0, 37, 0, 0, 40, 0, 0, 49, 0],
[0, 0, 29, 0, 0, 42, 0, 0, 41, 0, 0, 52]
]
# 单位运输成本:与距离正相关(核心优化点),小众物料因运输量小单位成本略高
self.T_ij = [
[8, 7, 8, 10, 9, 11, 9, 10, 10, 13, 12, 14],
[7, 6, 7, 9, 8, 10, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 11, 10, 12, 10, 11, 11, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 12, 11, 12, 14, 13, 15],
[9, 0, 0, 10, 0, 0, 9, 0, 0, 13, 0, 0],
[0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 12, 0],
[0, 0, 8, 0, 0, 11, 0, 0, 11, 0, 0, 14]
]
# 供应商距离梯度分布40-80运输成本随距离递增贴合实际物流成本逻辑
self.distance = [50, 40, 60, 70, 55, 45, 65]
class Config:
"""算法参数配置类存储NSGA-II的各类参数"""
def __init__(self):
# 种群参数
self.pop_size = 400 # 种群大小(相对越多越好)
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 = 1000 # 最大进化代数
# 惩罚系数
self.delta = 1.3 # 变更惩罚系数
# 早停参数
self.early_stop_patience = 100 # 连续多少代无改进则早停
self.early_stop_threshold = 0.15 # 目标值变化阈值(相对越高,收敛越稳定)
# 目标函数数量
self.objective_num = 2 # 双目标(成本+延期)
self.duplicate_threshold = 0.02 # 和种群数量相乘,重复解保留数量比例(根据种群数量选择)
self.print_top_n = 10 # 打印前N个最优解
class DataStructures:
"""数据结构工具类:提供评价指标计算等功能"""
@staticmethod
def calculate_evaluation_index(objectives, optimal_cost, optimal_tardiness, max_cost, max_tardiness):
"""
计算评价指标
: objectives: 解的目标值 (成本, 延期)
: optimal_cost: 最优成本值
: optimal_tardiness: 最优延期值
: max_cost: 最大成本值
: max_tardiness: 最大延期值
:return: 评价指标值
"""
cost, tardiness = objectives
if max_cost - optimal_cost == 0:
cost_ratio = 0
else:
cost_ratio = cost/(max_cost - optimal_cost)
if max_tardiness - optimal_tardiness == 0:
tardiness_ratio = 0
else:
tardiness_ratio = tardiness/( max_tardiness - optimal_tardiness)
return cost_ratio + tardiness_ratio