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