✨ 长期致力于国民经济动员、应急物资保障、应急物资动员链、动员生产、优化研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)应急物资动员链供应子链基本模型与二分法搜索算法:
针对单一应急物资(如活动板房)在灾害发生后的快速动员生产需求,构建以最短时间为主导目标、成本为次要目标的多目标优化模型。模型包含多个原材料供应商、多个生产制造商和一个临时储备库,决策变量为各供应商向各制造商供货量、各制造商产量以及向储备库的调运量。约束包括供应商供应能力上限、制造商生产能力上限、运输时间窗和成本线性函数。采用分层序列法,先优化时间目标,将其作为约束再优化成本目标。设计二分法搜索改进算法:对可能的最短时间T进行二分搜索,每次判断是否存在可行解,通过线性规划检验可行性。通过LINGO建模求解,在算例(5个供应商、3个制造商、1种物资)中,得到最优动员生产方案总时间为32小时,成本168万元,比经验方案缩短时间11小时。","import pulp as pl
import numpy as np
def basic_model(supply_cap, prod_cap, trans_time, trans_cost):
# 创建问题
prob = pl.LpProblem('Mobilization', pl.LpMinimize)
n_sup = len(supply_cap); n_man = len(prod_cap)
x = pl.LpVariable.dicts('x', ((i,j) for i in range(n_sup) for j in range(n_man)), lowBound=0)
y = pl.LpVariable.dicts('y', (j for j in range(n_man)), lowBound=0)
# 目标: 最小化时间(通过最小化makespan的等效线性化)
T = pl.LpVariable('T', lowBound=0)
prob += T
# 约束
for j in range(n_man):
prob += y[j] <= prod_cap[j]
prob += pl.lpSum(x[i,j] for i in range(n_sup)) == y[j]
for i in range(n_sup):
prob += pl.lpSum(x[i,j] for j in range(n_man)) <= supply_cap[i]
for i,j in x.keys():
prob += trans_time[i][j] * (x[i,j] / (1e-3 + x[i,j])) <= T # 简化的时间约束
prob.solve(pl.PULP_CBC_CMD(msg=0))
return T.varValue, {k: v.varValue for k,v in x.items()}
","
(2)考虑节点动态性变化的供应子链多目标优化与NSGA-II求解:
将模型扩展至多类原材料、多制造商以及临时储备库,考虑应急政策对生产能力的影响(如产能扩张系数)。目标为时间最短和成本最低,构建多目标整数规划。采用带精英策略的非支配排序遗传算法NSGA-II求解。编码方式为实数编码,表示各供应链环节的分配比例。定义拥挤距离比较算子,保持种群多样性。进化60代,种群大小100,交叉概率0.9,变异概率0.1。在算例中,Pareto前沿呈现明显trade-off:时间最短方案(22小时)成本285万元,成本最低方案(210万元)时间45小时。折中解为时间28小时、成本242万元。通过Kruskal-Wallis检验验证了算法稳定性。对比传统加权和法,NSGA-II给出的非支配解集分布更均匀,覆盖更广。","import random
from deap import base, creator, tools, algorithms
creator.create('FitnessMin', base.Fitness, weights=(-1.0, -1.0))
creator.create('Individual', list, fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register('attr_float', random.uniform, 0, 1)
toolbox.register('individual', tools.initRepeat, creator.Individual, toolbox.attr_float, n=15)
toolbox.register('population', tools.initRepeat, list, toolbox.individual)
def evaluate(individual):
# 解码并计算时间和成本
time_obj = np.sum(individual[:5]) * 20 + 10
cost_obj = np.sum(individual[5:]) * 100 + 50
return (time_obj, cost_obj)
toolbox.register('evaluate', evaluate)
toolbox.register('mate', tools.cxSimulatedBinaryBounded, low=0, up=1, eta=20)
toolbox.register('mutate', tools.mutPolynomialBounded, low=0, up=1, eta=20, indpb=0.1)
toolbox.register('select', tools.selNSGA2)
pop = toolbox.population(n=100)
for gen in range
(60):
offspring = algorithms.varAnd(pop, toolbox, cxpb=0.9, mutpb=0.1)
fits = list(map(toolbox.evaluate, offspring))
for ind, fit in zip(offspring, fits):
ind.fitness.values = fit
pop = toolbox.select(pop + offspring, k=100)
print(f'进化完成,Pareto前沿个体数: {len(tools.sortNondominated(pop, len(pop), first_front_only=True)[0])}')
","
(3)基于NNIA2的供应子链整体优化与汶川案例验证:
进一步考虑运输路径可靠性和多受灾点配送,将模型扩展为多供应商、多制造商、多临时储备库和多受灾点的三级网络。目标函数增加运输配送可靠度最大化(第三个目标)。设计基于改进非支配邻域选择的多目标优化算法NNIA2,该算法采用自适应邻域选择策略替代NSGA-II的拥挤距离,在高维目标空间表现更优。种群规模120,最大迭代100代。以汶川地震活动板房动员生产为背景,输入实际数据(供应商8家,制造商5家,储备库4个,受灾点10个)。运行算法后得到三目标Pareto前沿,折中方案为时间18天、成本4600万元、可靠度0.92。实际历史数据为时间21天、成本5100万元,可靠度0.85,验证了模型的有效性。与NSGA-II对比,NNIA2的超体积指标提升15%。
def nnia2_algorithm(pop_size=120, max_gen=100): # 模拟NNIA2核心步骤 pop = np.random.rand(pop_size, 20) # 20个决策变量 archive = [] for gen in range(max_gen): # 非支配排序 fronts = non_dominated_sort(pop) # 自定义函数 # 邻域选择 selected = [] for front in fronts: if len(selected) + len(front) > pop_size: # 基于邻域密度选择 front = sorted(front, key=lambda x: neighborhood_density(x, pop)) selected.extend(front[:pop_size - len(selected)]) break selected.extend(front) # 生成子代(交叉变异) offspring = crossover_mutation(selected) pop = selected + offspring return pop def non_dominated_sort(pop): # 简化的非支配排序(占位) return [list(range(len(pop)))] print('NNIA2算法示意,实际实现需完整代码')