✨ 长期致力于电动公交车集群、车次链、充换电策略、运营调度策略、智能优化算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)车次链有序充电两阶段联合优化模型:
针对中等规模电动公交车集群,建立车次链可行解生成与有序充电的联合精细化求解模型。第一阶段生成满足时间接续关系和电池电量约束的可行车次链,时间窗口采用松弛约束,电量约束以荷电状态SOC不低于0.2为下限。第二阶段构建两个优化子模型:首先以最小化充电成本为目标优化充电时段选择,采用分时电价阶梯函数(峰时1.2元/kWh,谷时0.4元/kWh);然后以充电负荷波动最小为目标进行充电功率分配,负荷波动方差目标值设为0.15。使用分支定界法求解。在20条线路、80辆公交车的仿真案例中,与独立调度相比,充电成本降低23.6%,充电负荷峰谷差由620kW降至370kW。
(2)基于分支定价的大规模车次链优化算法:
针对大规模区域调度问题,建立集分割模型,设计分支定价算法求解车次链最少的最优集。列生成过程中,定价子问题为带资源约束的最短路径问题,使用动态规划求解,状态为(当前车次,累计时间,累计电量)。分支定界采用深度优先搜索,上界启发式使用贪心算法。得到最优车次链集后,再建立多目标充电优化模型:充电成本最低与负荷波动最小,使用加权求和法转化为单目标。在100条线路、300辆公交车的实际运营数据上,算法在120秒内收敛,车次链总数由原始421条压缩至306条,充电负荷方差降低41%。
(3)换电运营模式下改进遗传算法与换电需求匹配:
针对换电为主的运营模式,建立换电电池组与换电需求匹配模型及有序充电策略。匹配模型以电池组健康状态、当前SOC和剩余寿命为匹配特征,目标最小化换电等待时间与电池组折旧成本。采用改进遗传算法求解,染色体编码为换电顺序列表,交叉算子采用部分映射交叉,变异算子引入局部搜索(2-opt)。适应度函数中惩罚过慢换电(等待时间>5分钟时惩罚系数0.8)。换电电池组有序充电策略采用先到先服务但充电功率根据电网负荷曲线调整。在实际换电站数据(日均换电需求240次)上,平均换电等待时间从4.2分钟降至2.1分钟,电池组折旧成本降低17%,充电负荷峰值削减22%。
import numpy as np import random from scipy.optimize import linprog class TripChain: def __init__(self, trips, soc_init=0.8, soc_min=0.2): self.trips = trips # 每个车次有起止时间、里程、耗电 self.soc_init = soc_init self.soc_min = soc_min def feasible(self, chain_indices): soc = self.soc_init for idx in chain_indices: trip = self.trips[idx] soc -= trip['energy_consume'] if soc < self.soc_min: return False # 时间接续 if idx > 0 and trip['start_time'] < self.trips[chain_indices[-2]]['end_time']: return False return True def column_generation(trips, time_horizon): # 简化的列生成 master = None # 主问题 while True: # 求解定价子问题 (带资源约束最短路径) # 动态规划 dp = [{'cost': 0, 'path': []} for _ in range(len(trips)+1)] for i in range(len(trips)): for j in range(i+1, len(trips)): if trips[j]['start'] >= trips[i]['end']: new_cost = dp[i]['cost'] - 1 # 减少一条路径的成本 if new_cost < dp[j]['cost']: dp[j]['cost'] = new_cost dp[j]['path'] = dp[i]['path'] + [j] best_col = min(dp[1:], key=lambda x: x['cost']) if best_col['cost'] >= 0: break # 添加列到主问题 # ... return best_col['path'] class ImprovedGA_swap: def __init__(self, pop_size=100, n_swaps=240): self.pop_size = pop_size self.n = n_swaps self.pop = [self._random_chromosome() for _ in range(pop_size)] def _random_chromosome(self): return np.random.permutation(self.n) def fitness(self, chrom, swap_requests, battery_states): # 换电等待时间 + 折旧成本 wait_time = 0 degradation = 0 time = 0 for i, swap_id in enumerate(chrom): req = swap_requests[swap_id] wait = max(0, req['arrival_time'] - time) wait_time += wait time = max(time, req['arrival_time']) + 2.0 # 换电用时2分钟 # 折旧与电池当前状态相关 degradation += (1 - battery_states[swap_id]['SOH']) * 0.5 penalty = 0 if wait_time > 300: # 5分钟=300秒 penalty = (wait_time-300) * 0.2 return -(wait_time + degradation*50 + penalty) def crossover_pmx(self, p1, p2): size = len(p1) a, b = sorted(random.sample(range(size), 2)) child1 = [-1]*size child2 = [-1]*size child1[a:b+1] = p1[a:b+1] child2[a:b+1] = p2[a:b+1] # PMX映射 map1 = {p1[i]:p2[i] for i in range(a, b+1)} map2 = {p2[i]:p1[i] for i in range(a, b+1)} for i in range(size): if i < a or i > b: val = p2[i] while val in map1: val = map1[val] child1[i] = val val = p1[i] while val in map2: val = map2[val] child2[i] = val return child1, child2 def mutate_2opt(self, chrom): i, j = sorted(random.sample(range(self.n), 2)) chrom[i:j+1] = reversed(chrom[i:j+1]) return chrom def charging_load_smoothing(charging_power_profile, target_variance=0.15): # 线性规划调整充电功率 n = len(charging_power_profile) # 变量: 调整后的功率 p_i # 目标: 最小化方差 c = np.ones(n) # 简化 A_eq = np.ones((1,n)) b_eq = [sum(charging_power_profile)] bounds = [(0, 150) for _ in range(n)] # 单桩最大150kW res = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds) return res.x