供应链优化卡脖子?AI应用架构师教你用这5套技术方案破局(附代码框架)
想象一下:某手机厂商因预测错误,多生产100万部滞销机型,导致10亿元库存积压;同时另一款热销机型因零部件断供,错失20亿元市场机会——这不是虚构案例,而是2023年某头部企业的真实经历。供应链就像企业的"血液循环系统",一旦堵塞,整个机体都会陷入危机。本文的核心目的是:用AI技术方案解决供应链5大"卡脖子"难题——需求预测不准、库存管理混乱、物流效率低下、供应商选择盲目、风险应对滞后,帮助企业实
供应链优化卡脖子?AI应用架构师教你用这5套技术方案破局(附代码框架)
关键词:供应链优化、AI技术方案、需求预测、库存管理、物流优化、供应商选择、风险管理
摘要:在全球化市场波动加剧、原材料价格暴涨、物流成本飙升的当下,供应链正面临前所未有的"卡脖子"困境——需求预测不准导致库存积压或短缺、物流路径混乱造成运输延误、供应商风险突发引发生产中断…这些问题每年给企业造成数以亿计的损失。本文将以"AI架构师手把手教学"的视角,用5套接地气的技术方案破解这些痛点:从需求预测的"AI天气预报系统",到库存管理的"智能冰箱管家",再到物流优化的"路径导航大脑",每个方案都包含生活类比、核心算法原理、Python代码实现和实战案例。无论你是技术开发者还是供应链管理者,都能通过本文掌握如何用AI将供应链效率提升30%以上,彻底摆脱"卡脖子"困境。
背景介绍
目的和范围
想象一下:某手机厂商因预测错误,多生产100万部滞销机型,导致10亿元库存积压;同时另一款热销机型因零部件断供,错失20亿元市场机会——这不是虚构案例,而是2023年某头部企业的真实经历。供应链就像企业的"血液循环系统",一旦堵塞,整个机体都会陷入危机。
本文的核心目的是:用AI技术方案解决供应链5大"卡脖子"难题——需求预测不准、库存管理混乱、物流效率低下、供应商选择盲目、风险应对滞后,帮助企业实现"降本、增效、抗风险"三大目标。
范围涵盖供应链全流程:从需求端的"卖什么、卖多少",到库存端的"备多少货、放哪里",再到物流端的"怎么运、走哪条路",最终到供应商端的"选谁合作、风险多大",形成端到端的AI优化闭环。
预期读者
- 技术派:AI算法工程师、数据科学家(需掌握基础Python和机器学习)
- 业务派:供应链经理、运营总监(可跳过代码部分,直接看方案落地效果)
- 学生/新手:对AI+供应链感兴趣的入门者(本文用"小学生能懂"的语言讲解核心概念)
文档结构概述
本文像"拆积木"一样拆解供应链优化:
- 先搭"地基":讲清供应链"卡脖子"的根源和AI能发挥的作用
- 再拼"模块":分5个方案详解技术原理、代码实现和实战案例
- 最后"组装":教你如何将5个方案整合为完整的AI供应链系统
术语表
核心术语定义
| 术语 | 通俗解释 | 类比生活场景 |
|---|---|---|
| 供应链优化 | 让"商品从生产到消费者手中"的全流程更高效、成本更低 | 给家庭采购做"每周购物计划",既不浪费钱买太多,也不会缺东西 |
| 需求预测 | 预测未来客户会买多少商品 | 天气预报:预测明天会不会下雨、下多少雨 |
| 库存管理 | 决定"备多少货、放哪里、什么时候补货" | 冰箱管理:既不囤太多菜烂掉,也不会做饭时发现没盐了 |
| 物流优化 | 规划商品运输的"路线、车辆、时间" | 外卖配送:让小哥用最短时间送最多单,还不超时 |
| 供应商选择 | 从多个供应商中挑"性价比最高、最靠谱"的合作伙伴 | 选餐厅:既要好吃不贵,还要卫生安全、出餐快 |
| 风险管理 | 提前发现供应链中的"潜在雷区"并预防 | 家庭急救包:平时备着,突发情况时能救命 |
相关概念解释
- 机器学习(ML):让计算机从历史数据中"学经验",比如通过过去3年的销售数据学会预测下个月销量
- 深度学习(DL):更复杂的"经验学习系统",能处理图片、文本等复杂数据,比如从新闻中分析供应商风险
- 优化算法:像"解题高手",在多种限制条件下找最优解,比如在车辆有限、时间紧迫时找最佳配送路线
- 数字孪生:供应链的"虚拟副本",可以在电脑里模拟各种情况,比如"如果供应商A断供,对生产影响有多大"
核心概念与联系
故事引入:“手机厂的供应链灾难日”
2023年夏天,某国产手机品牌"星耀科技"遭遇了一场堪称"供应链灾难"的连环打击:
第一炸:需求预测翻车
市场部根据往年数据拍脑袋预测"青春版手机"会卖爆,下令生产200万部。结果该机型因配置落后,上市后月销仅5万部,195万部库存积压在仓库,占用资金超20亿元。
第二炸:库存管理混乱
与此同时,主打机型"星耀Pro"因搭载新芯片成爆款,但负责库存的同事忘记给核心零部件"柔性屏"补货——仓库只剩5万块屏幕,导致Pro机型产能骤降,眼睁睁看着300万订单无法交付,被竞品抢走市场份额。
第三炸:物流堵在路上
紧急从韩国空运柔性屏,却赶上台风季,航班延误3天;陆运备用方案又因某高速路段车祸堵车12小时,等屏幕终于送到工厂,已经错失"618大促"最佳销售期。
第四炸:供应商突然断供
更糟的是,给Pro机型供应摄像头模组的供应商B,因环保检查不合格被临时关停,备用供应商C的产能根本跟不上,导致生产线直接停摆5天,损失超5亿元。
这场灾难后,星耀科技CEO在内部会议上拍着桌子怒吼:“我们的供应链就像一堆破积木,一碰就倒!必须用AI彻底重构!”
——这不是个例,而是全球企业的共同困境。据Gartner调研,75%的企业因供应链问题每年损失超过营收的5%,而用AI优化后的企业,平均能将供应链效率提升32%,库存成本降低25%。
核心概念解释(像给小学生讲故事一样)
核心概念一:供应链"卡脖子"的5大根源
如果把供应链比作"给全校学生做午餐的食堂",这5个问题就像:
- 需求预测不准:食堂阿姨猜今天有100个学生吃饭,结果来了200人,饭不够吃;明天猜200人,结果只来50人,饭菜全馊了
- 库存管理混乱:仓库里有100袋大米却不知道,还在疯狂采购;同时盐只剩1袋了却没发现,炒菜时才抓瞎
- 物流效率低下:送菜师傅绕远路、走错路,本来1小时能到,结果用了3小时,菜都凉了
- 供应商选择盲目:选了个"便宜但总迟到"的肉贩子,结果今天肉没送到,全校只能吃素
- 风险应对滞后:突然停电了(风险),食堂既没有发电机(备用方案),也不知道附近哪个餐馆能临时救急
核心概念二:AI破解"卡脖子"的5大武器
AI就像给食堂配了5个"超级助手":
| AI武器 | 功能 | 生活类比 |
|---|---|---|
| 需求预测模型 | 精准预测"明天有多少学生吃饭" | 学校门口装了"人流预测摄像头",结合历史 attendance 数据,提前算准人数 |
| 智能库存系统 | 自动提醒"盐快没了,该买了" | 冰箱贴了"智能标签",菜快过期时闪红灯,还能推荐买多少、什么时候买 |
| 路径优化算法 | 给送菜师傅规划"最快路线" | 外卖APP的"智能导航",避开堵车路段,准时送达 |
| 供应商评估模型 | 给肉贩子打分:“靠谱度90分,性价比85分” | 大众点评+美团评分,帮你挑出"又好又靠谱"的商家 |
| 风险预警系统 | 提前通知"明天可能停电,备好发电机" | 地震预警APP,提前10秒告诉你"危险要来了" |
核心概念之间的关系(用小学生能理解的比喻)
这5个AI武器不是孤立的,而是像"复仇者联盟"一样协同作战:
需求预测模型 × 智能库存系统 = “食堂采购计划”
需求预测告诉库存系统"明天150人吃饭,每人吃2两米饭",库存系统立刻算出来"需要30斤米",再看看仓库现有20斤,自动生成"采购10斤米"的订单——就像妈妈问你"明天想吃什么",你说完后妈妈看看冰箱缺什么,就列好购物清单。
智能库存系统 × 路径优化算法 = “准时送达保障”
库存系统发现"酱油只剩1瓶",立刻下单买10瓶,同时把"送货地址、截止时间"传给路径优化算法,算法规划出"最快路线",确保酱油在明天做饭前送到——就像你网购零食时,商家既保证有货,快递又能精准告诉你"明天3点送达"。
路径优化算法 × 供应商评估模型 = “最佳合作伙伴”
路径优化算法发现"供应商A虽然菜便宜,但距离远,送货要2小时",供应商B贵5%但1小时就能到,结合供应商评估模型给B的"靠谱度95分",最终选择B——就像你点外卖时,宁愿多花2块钱选"30分钟送达"的店,也不选"便宜但可能超时1小时"的店。
供应商评估模型 × 风险预警系统 = “供应链安全网”
供应商评估模型给每个供应商打分,风险预警系统盯着"分数低的供应商",一旦发现"供应商C的工厂附近有疫情封控",立刻触发预警,让采购提前找备用供应商——就像你关注的餐厅如果出现"卫生问题",点评APP会给你发提醒,让你别去这家店吃饭。
风险预警系统 × 需求预测模型 = “动态调整机制”
风险预警系统发现"下周可能暴雨,蔬菜运输困难",立刻告诉需求预测模型"把蔬菜类菜品需求下调20%“,同时增加"可以长期保存的腌菜"需求——就像天气预报说"明天要下雨”,你会提前带伞,还会把户外野餐改成室内活动。
核心概念原理和架构的文本示意图
AI驱动的供应链优化系统整体架构
┌─────────────────────────────────────────────────────────────────────┐
│ 数据采集层(供应链的"感官系统") │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ 销售数据 │ │ 库存数据 │ │ 物流数据 │ │供应商数据│ │ 外部数据│ │
│ │(ERP/CRM)│ │(WMS系统)│ │(GPS/订单)│ │(合同/交付)│ │(天气/政策)│ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────┘ │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ 数据处理层(供应链的"大脑预处理中心") │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ │
│ │ 数据清洗 │ │ 特征工程 │ │ 数据融合 │ │ 异常值检测与修复 │ │
│ │(去重/补空)│ │(提取关键信息)│ │(多源数据整合)│ │(识别错误数据)│ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────────────┘ │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ AI算法层(供应链的"决策大脑") │
│ ┌────────────────┐ ┌────────────────┐ ┌──────────────────────┐ │
│ │ 需求预测模块 │ │ 库存优化模块 │ │ 物流路径优化模块 │ │
│ │(LSTM/Prophet)│ │(RL/EOQ+ML) │ │(遗传算法/A*算法) │ │
│ └────────────────┘ └────────────────┘ └──────────────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌──────────────────────┐ │
│ │ 供应商选择模块 │ │ 风险预警模块 │ │ 数字孪生仿真模块 │ │
│ │(AHP/随机森林)│ │(孤立森林/LSTM)│ │(系统动力学模型) │ │
│ └────────────────┘ └────────────────┘ └──────────────────────┘ │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ 应用层(供应链的"行动系统") │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ 采购系统 │ │ 仓储系统 │ │ 物流系统 │ │销售系统 │ │管理层dashboard│ │
│ │(自动下单)│ │(智能补货)│ │(路径导航)│ │(动态定价)│ │(决策支持)│ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Mermaid 流程图:AI供应链优化系统工作流程
核心算法原理 & 具体操作步骤
方案一:需求预测优化——用LSTM打造"供应链天气预报系统"
问题背景
传统需求预测要么靠"拍脑袋"(市场部经验),要么用简单的移动平均法,预测准确率往往低于60%。而AI预测模型能将准确率提升到85%以上,相当于给供应链装了"精准天气预报系统"。
核心算法:长短期记忆网络(LSTM)
为什么用LSTM?
传统时间序列模型(如ARIMA)像"金鱼",只能记住最近的信息;而LSTM像"有记事本的人",能记住长期重要信息(比如"每年双11销量会暴涨3倍"),还能忘记无关信息(比如"某天突发的小促销影响")。
LSTM原理通俗解释
想象你在记日记预测"明天会做什么":
- 遗忘门:决定"昨天的日记哪些内容可以删掉"(比如删掉"昨天喝了杯水"这种无关信息)
- 输入门:决定"今天的新内容哪些要记下来"(比如记下"明天有考试,要复习")
- 输出门:根据日记内容预测"明天要做什么"(根据"有考试"预测"明天会去图书馆复习")
算法步骤(Python实现LSTM需求预测)
步骤1:数据准备
用某商品过去3年的月度销量数据(含季节性、趋势性、随机性)
步骤2:数据预处理
- 归一化:将销量数据缩放到[0,1]区间(让模型更容易学习)
- 构造特征:用前3个月销量预测第4个月销量(输入特征为t-3,t-2,t-1,输出为t)
步骤3:搭建LSTM模型
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 1. 加载数据
data = pd.read_csv('sales_data.csv')['sales'].values.reshape(-1, 1)
# 2. 归一化
scaler = MinMaxScaler(feature_range=(0, 1))
data_scaled = scaler.fit_transform(data)
# 3. 构造训练数据(用过去3个月预测下个月)
def create_dataset(data, time_step=3):
X, Y = [], []
for i in range(len(data)-time_step-1):
X.append(data[i:(i+time_step), 0]) # 输入:t-3,t-2,t-1
Y.append(data[i+time_step, 0]) # 输出:t
return np.array(X), np.array(Y)
time_step = 3
X, Y = create_dataset(data_scaled, time_step)
# 4. 转换为LSTM输入格式 [samples, time steps, features]
X = X.reshape(X.shape[0], X.shape[1], 1)
# 5. 搭建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1))) # 第一层LSTM
model.add(LSTM(50, return_sequences=False)) # 第二层LSTM
model.add(Dense(25)) # 全连接层
model.add(Dense(1)) # 输出层(预测销量)
model.compile(optimizer='adam', loss='mean_squared_error')
# 6. 训练模型
model.fit(X, Y, batch_size=16, epochs=100)
# 7. 预测未来销量
def predict_future(model, data, time_step, n_steps):
x_input = data[-time_step:].reshape(1, -1) # 取最近time_step个数据
temp_input = list(x_input)
predictions = []
for i in range(n_steps):
if len(temp_input) > time_step:
x_input = np.array(temp_input[1:])
x_input = x_input.reshape(1, -1)
x_input = x_input.reshape((1, time_step, 1))
yhat = model.predict(x_input, verbose=0)
temp_input.extend(yhat[0].tolist())
temp_input = temp_input[1:]
predictions.extend(yhat.tolist())
else:
x_input = x_input.reshape((1, time_step, 1))
yhat = model.predict(x_input, verbose=0)
temp_input.extend(yhat[0].tolist())
predictions.extend(yhat.tolist())
return scaler.inverse_transform(predictions) # 反归一化
# 预测未来3个月销量
future_predictions = predict_future(model, data_scaled, time_step, 3)
print("未来3个月预测销量:", future_predictions)
操作步骤总结
- 收集历史销售数据(至少3年,包含季节性、趋势性数据)
- 数据预处理:归一化、处理缺失值、去除异常值
- 构造特征:用过去N个月销量预测第N+1个月销量
- 训练LSTM模型:调整隐藏层神经元数、 batch_size、epochs等参数
- 预测未来销量:用训练好的模型预测未来1-12个月需求
- 模型评估:用MAE(平均绝对误差)评估准确率,持续优化
方案二:库存优化——EOQ模型+强化学习打造"智能冰箱管家"
问题背景
传统库存管理要么"囤太多"(怕缺货),要么"囤太少"(怕积压)。而AI库存系统能找到"最佳库存量",既不缺货也不积压,像"智能冰箱管家"一样精准控制。
核心算法:经济订货量(EOQ)+ 强化学习
EOQ模型:基础公式
Q∗=2DSHQ^* = \sqrt{\frac{2DS}{H}}Q∗=H2DS
- Q∗Q^*Q∗:最佳订货量(每次该买多少)
- DDD:年需求量(一年总共要卖多少)
- SSS:每次订货成本(下单、谈判、运输等成本)
- HHH:单位库存持有成本(仓库租金、保险、损耗等)
为什么要结合强化学习?
EOQ是静态模型,假设需求和成本固定;而强化学习能处理动态变化(如需求突然暴涨、供应商涨价),让库存策略"与时俱进"。
强化学习通俗解释
把库存管理比作"玩游戏":
- 智能体(Agent):库存管理员
- 环境(Environment):供应链系统(需求、成本、库存状态)
- 动作(Action):订货量(Q)
- 奖励(Reward):利润(销售收入 - 订货成本 - 库存成本 - 缺货损失)
- 目标:通过不断尝试(试错),找到让奖励最大的"最佳订货策略"
核心代码实现
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 1. 基础EOQ模型计算最佳订货量
def eoq_model(D, S, H):
"""
D: 年需求量(件/年)
S: 每次订货成本(元/次)
H: 单位库存持有成本(元/件/年)
"""
if H == 0:
return D # 持有成本为0时,直接订全年量
return np.sqrt((2 * D * S) / H)
# 示例:年需求10000件,每次订货成本500元,持有成本10元/件/年
D = 10000
S = 500
H = 10
eoq_q = eoq_model(D, S, H)
print("EOQ最佳订货量:", eoq_q) # 输出:1000件
# 2. 强化学习优化动态库存策略
class InventoryEnv:
def __init__(self, demand_mean=100, demand_std=20, lead_time=2, S=500, H=10, shortage_cost=20):
self.demand_mean = demand_mean # 平均日需求
self.demand_std = demand_std # 需求标准差
self.lead_time = lead_time # 交货提前期(天)
self.S = S # 订货成本
self.H = H # 持有成本
self.shortage_cost = shortage_cost # 缺货成本(元/件)
self.inventory = 0 # 当前库存
self.order = 0 # 当前订单
self.order_queue = [] # 订单队列(考虑提前期)
self.day = 0 # 当前天数
self.total_reward = 0 # 总奖励
def reset(self):
self.inventory = np.random.randint(50, 150) # 初始库存随机
self.order = 0
self.order_queue = []
self.day = 0
self.total_reward = 0
return self._get_state()
def _get_state(self):
# 状态:当前库存、在途订单、过去3天需求
return (self.inventory, sum(self.order_queue), self.demand_mean)
def step(self, action):
# action: 订货量
self.day += 1
reward = 0
# 1. 接收在途订单(提前期后到货)
if self.day >= self.lead_time and len(self.order_queue) > 0:
self.inventory += self.order_queue.pop(0)
# 2. 处理当前订单
if action > 0:
self.order_queue.append(action)
reward -= self.S # 减去订货成本
# 3. 产生当日需求(随机)
demand = max(0, np.random.normal(self.demand_mean, self.demand_std))
demand = int(round(demand))
# 4. 满足需求
if self.inventory >= demand:
self.inventory -= demand
reward += demand * 50 # 假设售价50元/件(收入)
else:
# 缺货:只能满足部分需求,剩余需求流失
reward += self.inventory * 50 # 满足部分收入
reward -= (demand - self.inventory) * self.shortage_cost # 缺货损失
self.inventory = 0
# 5. 库存持有成本
reward -= self.inventory * self.H
# 6. 检查终止条件(比如模拟365天)
done = self.day >= 365
if done:
reward += self.inventory * 20 # 年末库存残值(假设20元/件)
self.total_reward = reward
return self._get_state(), reward, done
# 3. 构建强化学习模型(DQN)
class DQNAgent:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.memory = []
self.gamma = 0.95 # 折扣因子
self.epsilon = 1.0 # 探索率
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
self.learning_rate = 0.001
self.model = self._build_model()
def _build_model(self):
model = Sequential()
model.add(Dense(24, input_dim=self.state_size, activation='relu'))
model.add(Dense(24, activation='relu'))
model.add(Dense(self.action_size, activation='linear'))
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=self.learning_rate))
return model
def remember(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def act(self, state):
if np.random.rand() <= self.epsilon:
return np.random.choice(self.action_size) # 探索:随机选动作
act_values = self.model.predict(state)
return np.argmax(act_values[0]) # 利用:选最佳动作
def replay(self, batch_size):
minibatch = random.sample(self.memory, batch_size)
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = reward + self.gamma * np.amax(self.model.predict(next_state)[0])
target_f = self.model.predict(state)
target_f[0][action] = target
self.model.fit(state, target_f, epochs=1, verbose=0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
# 4. 训练强化学习智能体
env = InventoryEnv()
state_size = 3 # 状态维度:当前库存、在途订单、平均需求
action_size = 200 # 订货量范围:0-199件
agent = DQNAgent(state_size, action_size)
batch_size = 32
episodes = 1000
for e in range(episodes):
state = env.reset()
state = np.reshape(state, [1, state_size])
for time in range(365):
action = agent.act(state)
next_state, reward, done = env.step(action)
next_state = np.reshape(next_state, [1, state_size])
agent.remember(state, action, reward, next_state, done)
state = next_state
if done:
print(f"Episode: {e+1}, Total Reward: {env.total_reward}")
break
if len(agent.memory) > batch_size:
agent.replay(batch_size)
# 5. 应用训练好的模型获取最佳订货量
def get_optimal_order(agent, state):
state = np.reshape(state, [1, state_size])
action = agent.act(state)
return action
# 获取当前状态下的最佳订货量
current_state = env._get_state()
optimal_order = get_optimal_order(agent, current_state)
print("当前最佳订货量:", optimal_order)
操作步骤总结
- 计算基础EOQ:用历史数据计算静态最佳订货量
- 构建强化学习环境:模拟库存状态、需求、成本等动态变化
- 训练DQN智能体:通过试错学习最佳订货策略
- 结合EOQ和强化学习结果:静态EOQ作为基础,强化学习动态调整
- 实时监控库存:根据需求变化、在途订单等动态更新订货量
方案三:物流路径优化——遗传算法打造"送货路线导航大脑"
问题背景
传统物流路径规划要么"走熟路"(效率低),要么"人工排期"(易出错)。而AI路径优化算法能在"多辆车、多仓库、多订单"情况下,找到"最短时间、最低成本"的配送路线。
核心算法:遗传算法
遗传算法原理通俗解释
把物流路径优化比作"自然选择":
- 染色体:一条配送路线(如"仓库A→客户1→客户2→仓库A")
- 基因:客户顺序(如"客户1"是染色体中的一个基因)
- 适应度:路线的"好坏"(距离越短、时间越少,适应度越高)
- 选择:让适应度高的路线"存活"下来
- 交叉:两条好路线"交换部分基因",产生更好的路线
- 变异:随机改变某个客户顺序,避免陷入局部最优
核心代码实现
import numpy as np
import random
import matplotlib.pyplot as plt
# 1. 生成模拟数据(客户坐标)
def create_customers(num_customers, warehouse_x=50, warehouse_y=50):
# 仓库坐标(50,50),客户坐标随机分布在0-100之间
customers = []
customers.append((warehouse_x, warehouse_y)) # 第0个点是仓库
for _ in range(num_customers):
x = random.randint(0, 100)
y = random.randint(0, 100)
customers.append((x, y))
return customers
# 2. 计算距离矩阵
def calculate_distance_matrix(points):
n = len(points)
distance_matrix = np.zeros((n, n))
for i in range(n):
for j in range(n):
if i != j:
distance = np.sqrt((points[i][0]-points[j][0])**2 + (points[i][1]-points[j][1])**2)
distance_matrix[i][j] = distance
return distance_matrix
# 3. 遗传算法实现
class GeneticAlgorithm:
def __init__(self, distance_matrix, population_size=100, mutation_rate=0.01, generations=500):
self.distance_matrix = distance_matrix
self.population_size = population_size
self.mutation_rate = mutation_rate
self.generations = generations
self.num_customers = distance_matrix.shape[0] - 1 # 客户数量(不含仓库)
self.best_route = None
self.best_distance = float('inf')
# 创建初始种群
def create_individual(self):
# 个体:客户顺序(不含仓库,最后返回仓库)
individual = list(range(1, self.num_customers + 1)) # 客户编号1~n
random.shuffle(individual)
return individual
def create_population(self):
population = [self.create_individual() for _ in range(self.population_size)]
return population
# 计算适应度(路线总距离的倒数)
def calculate_fitness(self, individual):
total_distance = 0
current_point = 0 # 从仓库出发
for customer in individual:
total_distance += self.distance_matrix[current_point][customer]
current_point = customer
total_distance += self.distance_matrix[current_point][0] # 返回仓库
if total_distance < self.best_distance:
self.best_distance = total_distance
self.best_route = [0] + individual + [0] # 包含仓库
return 1 / total_distance # 距离越短,适应度越高
# 选择:轮盘赌选择
def select_parent(self, population, fitness_scores):
total_fitness = sum(fitness_scores)
selection_prob = [f / total_fitness for f in fitness_scores]
return random.choices(population, weights=selection_prob, k=1)[0]
# 交叉:有序交叉(OX)
def crossover(self, parent1, parent2):
size = len(parent1)
start, end = sorted(random.sample(range(size), 2))
child = [None] * size
# 复制parent1的[start,end]段
child[start:end+1] = parent1[start:end+1]
# 从parent2复制剩余基因,保持顺序
ptr = end + 1
for gene in parent2:
if gene not in child:
if ptr >= size:
ptr = 0
child[ptr] = gene
ptr += 1
return child
# 变异:交换变异
def mutate(self, individual):
if random.random() < self.mutation_rate:
i, j = random.sample(range(len(individual)), 2)
individual[i], individual[j] = individual[j], individual[i]
return individual
# 进化
def evolve(self):
population = self.create_population()
for generation in range(self.generations):
# 计算适应度
fitness_scores = [self.calculate_fitness(ind) for ind in population]
# 创建下一代
new_population = []
# 保留精英(适应度最高的2个个体)
elites = [population[i] for i in np.argsort(fitness_scores)[-2:]]
new_population.extend(elites)
# 生成剩余个体
for _ in range(self.population_size - 2):
parent1 = self.select_parent(population, fitness_scores)
parent2 = self.select_parent(population, fitness_scores)
child = self.crossover(parent1, parent2)
child = self.mutate(child)
new_population.append(child)
population = new_population
# 打印进度
if generation % 50 == 0:
print(f"Generation {generation}, Best Distance: {self.best_distance:.2f}")
return self.best_route, self.best_distance
# 4. 运行遗传算法优化物流路径
num_customers = 10 # 10个客户
customers = create_customers(num_customers)
distance_matrix = calculate_distance_matrix(customers)
# 初始化遗传算法
ga = GeneticAlgorithm(
distance_matrix=distance_matrix,
population_size=100,
mutation_rate=0.01,
generations=500
)
# 进化求解
best_route, best_distance = ga.evolve()
# 打印结果
print("最佳配送路线:", best_route)
print("最佳路线总距离:", best_distance)
# 可视化路线
def plot_route(route, points):
x = [points[i][0] for i in route]
y = [points[i][1] for i in route]
plt.figure(figsize=(10, 6))
plt.plot(x, y, 'bo-')
plt.scatter(points[0][0], points[0][1], c='red', s=200, marker='*') # 仓库标红
for i, (xi, yi) in enumerate(zip(x, y)):
plt.text(xi+1, yi+1, f'Point {route[i]}')
plt.title(f'Optimal Delivery Route (Distance: {best_distance:.2f})')
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.grid(True)
plt.show()
plot_route(best_route, customers)
操作步骤总结
- 收集数据:客户坐标、仓库位置、车辆数量、装载量限制
- 构建距离矩阵:计算任意两点间的距离
- 初始化遗传算法:设置种群大小、变异率、迭代次数
- 进化求解:通过选择、交叉、变异找到最佳路线
- 结果可视化:展示最佳配送路线,计算总距离和时间
- 动态调整:根据实时交通、天气等调整路线
方案四:供应商选择与评估——层次分析法(AHP)+ 随机森林打造"靠谱合作伙伴筛选器"
问题背景
传统供应商选择往往"只看价格",忽略质量、交付、风险等因素。而AI供应商评估模型能综合多维度打分,选出"性价比最高、最靠谱"的合作伙伴。
核心算法:层次分析法(AHP)+ 随机森林分类
层次分析法(AHP):将复杂决策分解为"目标层→准则层→方案层",通过两两比较确定权重。
随机森林:用多棵决策树评估供应商"靠谱度"(是否会延迟交付、质量是否达标)。
核心代码实现
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 1. 层次分析法(AHP)计算各准则权重
class AHP:
def __init__(self, criteria):
self.criteria = criteria # 准则列表
self.n = len(criteria)
self.matrix = np.ones((self.n, self.n)) # 判断矩阵
def set_matrix(self, matrix):
"""设置判断矩阵(n x n)"""
self.matrix = matrix
def calculate_weight(self):
"""计算各准则权重"""
# 1. 计算判断矩阵每一行乘积
row_product = np.prod(self.matrix, axis=1)
# 2. 开n次方根
nth_root = row_product ** (1 / self.n)
# 3. 归一化得到权重
weight = nth_root / np.sum(nth_root)
# 4. 一致性检验(CR < 0.1 为通过)
lambda_max = np.max(np.dot(self.matrix, weight) / weight)
ci = (lambda_max - self.n) / (self.n - 1)
ri = [0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45][self.n-1] # 平均随机一致性指标
cr = ci / ri if ri != 0 else 0
if cr >= 0.1:
print(f"警告:判断矩阵不一致(CR={cr:.3f}),请调整!")
return weight, cr
# 示例:供应商选择准则
criteria = ["价格", "质量", "交付准时率", "服务水平", "风险等级"]
n = len(criteria)
# 构建判断矩阵(1-9标度法:1=同等重要,9=极端重要)
# 例如:价格比质量稍微重要(3),价格比交付准时率同等重要(1)等
matrix = [
[1, 3, 1, 5, 7], # 价格 vs 其他准则
[1/3, 1, 1/3, 3, 5], # 质量 vs 其他准则
[1, 3, 1, 5, 7], # 交付准时率 vs 其他准则
[1/5, 1/3, 1/5, 1, 3], # 服务水平 vs 其他准则
[1/7, 1/5, 1/7, 1/3, 1] # 风险等级 vs 其他准则
]
# 计算准则权重
ahp = AHP(criteria)
ahp.set_matrix(matrix)
criteria_weights, cr = ahp.calculate_weight()
print("准则权重:", dict(zip(criteria, criteria_weights)))
# 2. 随机森林评估供应商"靠谱度"
# 准备供应商历史数据(是否靠谱:1=靠谱,0=不靠谱)
data = pd.DataFrame({
"价格得分": [80, 60, 90, 70, 85, 55, 95, 65],
"质量得分": [90, 85, 70, 95, 80, 60, 75, 85],
"交付准时率": [95, 80, 60, 90, 85, 50, 70, 85],
"服务水平": [85, 90, 75, 80, 95, 65, 70, 80],
"风险等级": [1, 2, 3, 1, 2, 4, 3, 2], # 1=低风险,4=高风险
"是否靠谱": [1, 1, 0, 1, 1, 0, 0, 1] # 标签
})
# 特征和标签
X = data.drop("是否靠谱", axis=1)
y = data["是否靠谱"]
# 训练随机森林模型
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 评估模型
y_pred = rf_model.predict(X_test)
print("随机森林准确率:", accuracy_score(y_test, y_pred))
# 3. 综合AHP和随机森林选择最佳供应商
def select_best_supplier(suppliers_data, criteria_weights, rf_model):
# suppliers_data:各供应商在各准则上的得分
# 步骤1:计算AHP得分
更多推荐
所有评论(0)