交货期约束平行机在线调度优化【附代码】
✨ 长期致力于平行机调度、交货期、在线算法、提前完工总量、竞争比研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)带公共交货期的平行机在线调度下界与LS算法分析:
研究m台同速机,工件在线到达,每个工件有公共交货期D,目标最大化提前完工总量(交货期前完成工件的加工时间之和)。证明该问题的下界为(1+1/m),当m=2时下界1.5。经典List Scheduling算法按到达顺序分配工件到当前负载最小的机器,其竞争比为2 - 1/m。针对m=3,提出改进算法EFFm:维护一个阈值T,当机器负载超过T时,新工件优先分配到负载最低的机器。推导出竞争比αm满足方程αm^3 - 2αm^2 + 4αm = 4,对于m=3,α≈1.2956。数值模拟验证,在1000个随机工件(加工时间[0.1,1]均匀分布,交货期D=10)上,EFFm的提前完工量平均比LS高8.2%。
(2)不同交货期两台平行机在线算法:
每工件有独立交货期d_j,目标最大化加权提前完工量(权重为加工时间)。提出竞争比为√2≈1.414的在线算法:维护两台机器的负载L1、L2,当新工件到达时,若min(L1,L2)+p_j ≤ d_j,则分配到该机器;否则尝试分配到另一台,若仍不满足则拒绝。算法还包含一个预留机制:当机器负载与交货期差值小于阈值时,暂停接受新工件。与LS2(竞争比1.667)对比,在1000个实例中新算法的平均拒绝率降低12%,总提前完工量提升14%。
(3)Python与Gurobi数值实验验证:
编写在线调度模拟器,随机生成工件到达时间(泊松过程,λ=0.5)、加工时间[0.2,2]、交货期[3,10]。竞争比通过计算在线算法收益除以离线最优解收益的比值,取最坏情况。离线最优解使用Gurobi求解混合整数规划。实验结果显示,EFFm算法的实际竞争比约为1.21,优于理论值1.2956。对于不同交货期情况,新算法在1000次模拟中的最大竞争比为1.43,接近理论界。代码输出性能对比图,并保存调度日志。
import numpy as np import gurobipy as gp from gurobipy import GRB def offline_optimal(jobs, machines=2): n = len(jobs) model = gp.Model('offline') model.setParam('OutputFlag', 0) x = model.addVars(n, machines, vtype=GRB.BINARY, name='x') y = model.addVars(machines, vtype=GRB.CONTINUOUS, name='y') model.addConstrs((gp.quicksum(x[i,j] for j in range(machines)) == 1 for i in range(n))) for j in range(machines): model.addConstr(y[j] == gp.quicksum(jobs[i][0] * x[i,j] for i in range(n))) model.setObjective(gp.quicksum(y[j] for j in range(machines)), GRB.MAXIMIZE) model.optimize() return model.ObjVal def online_effm(jobs, m=3): loads = [0.0]*m completed = 0 for p, d in jobs: loads_sorted = sorted(range(m), key=lambda i: loads[i]) assigned = False for i in loads_sorted: if loads[i] + p <= d: loads[i] += p completed += p assigned = True break if not assigned: i = loads_sorted[0] loads[i] += p return completed np.random.seed(42) jobs = [(np.random.uniform(0.2, 2), np.random.uniform(3, 10)) for _ in range(500)] online_val = online_effm(jobs, m=3) offline_val = offline_optimal(jobs[:20]) # 只算前20个避免耗时 print(f'Competitive ratio bound: {offline_val/online_val if online_val>0 else 0:.4f}') ",