engine.ca

压缩退火求解器(Compressed Annealing),基于模拟退火框架的 TSPTW 求解。

Attributes

CA_DEFAULT_PARAMS

Classes

CASolver

压缩退火求解器(Compressed Annealing)。

Functions

_cal_fitness_numba(line, cost_mat, travel_speed, ...)

Numba JIT 编译的适应度计算内核(与 VNS 共享相同逻辑)。

Module Contents

engine.ca.CA_DEFAULT_PARAMS
engine.ca._cal_fitness_numba(line, cost_mat, travel_speed, penalty_weight, early_wait_weight, late_return_weight, depot_index, spots_start, spots_end, spots_stay, use_real_time_matrix=False)

Numba JIT 编译的适应度计算内核(与 VNS 共享相同逻辑)。

沿路径逐段模拟行程,累计总成本与时间惩罚。 路径必须从 depot 出发并回到 depot,长度不足 3 时返回极大惩罚值。

两种矩阵模式: - use_real_time_matrix=False(默认,标准数据集):矩阵元素为距离,travel_time = d / travel_speed - use_real_time_matrix=True(高德真实数据):矩阵元素为旅行时间(小时),travel_time = d

Args:

line: 路径数组(含起终点的完整路径)。 cost_mat: 距离/旅行时间矩阵。 travel_speed: 旅行速度(距离/时间单位)。use_real_time_matrix=True 时该参数无效。 penalty_weight: 迟到惩罚权重。 early_wait_weight: 早到等待惩罚权重。 late_return_weight: 晚归惩罚权重。 depot_index: 起终点索引。 spots_start: 各景点时间窗开始时间数组。 spots_end: 各景点时间窗结束时间数组。 spots_stay: 各景点停留时长数组。 use_real_time_matrix: 矩阵是否为旅行时间(避免 d / travel_speed 重复计算)。

Returns:
Tuple[float, float, float]: (总成本, 旅行累积值, 时间惩罚).

旅行累积值:标准模式下为总距离,真实模式下为总旅行时间。

class engine.ca.CASolver(city_indices: list[int], spots_dict: dict, travel_speed: float = 1.0, penalty_weight: float = 100.0, early_wait_weight: float = 0.1, late_return_weight: float = 50.0, depot_index: int = 0, use_real_time_matrix: bool = False, **kwargs)

压缩退火求解器(Compressed Annealing)。

基于模拟退火框架,引入压缩系数动态调节距离成本与时间惩罚之间的权重比例。 搜索初期偏向探索可行域之外的区域,后期逐渐收紧至可行解。

增强特性: - 时间窗引导邻域:针对违规最严重的节点执行重定位扰动(加速不可行解修复) - 压缩系数动态增长:初期惩罚权重小(允许探索不可行区域),后期逐渐增大至与原始成本一致 - 2-opt 精细化:主循环结束后对最优解执行 First Improvement 2-opt 局部搜索

city_indices
num_cities
spots_dict
travel_speed = 1.0
penalty_weight = 100.0
early_wait_weight = 0.1
late_return_weight = 50.0
depot_index = 0
use_real_time_matrix = False
params
spots_start
spots_end
spots_stay
_cal_fitness(line: list[int], cost_mat: numpy.ndarray)

直接调用 Numba 内核评估路径成本

CA 单次运行中几乎不会重复评估同一解,故不设缓存。

Args:

line: 路径列表(含起终点的完整路径)。 cost_mat: 距离/旅行时间矩阵。

Returns:

Tuple[float, float, float]: (总成本, 旅行累积值, 时间惩罚).

_initial_solution() list[int]

按时间窗起始时间排序生成初始解(启发式效果优于随机)

Returns:

list[int]: 闭合路径 [depot, ...景点..., depot]。

_standard_neighbor(solution: list[int], temp_ratio: float)

标准邻域生成器。

根据当前退火温度比例选择不同类型的变异: - 高温段(temp_ratio > 0.7):大范围反转 - 中温段(temp_ratio > 0.3):交换两点 - 低温段:插入操作(精细化微调)

_time_window_guided_neighbor(solution: list[int], cost_mat: numpy.ndarray, temp_ratio: float)

时间窗引导邻域生成。

识别违反时间窗最严重的节点,将其重定位到路径中另一随机位置。 适用于搜索早期快速修正不可行解。

_get_neighbor(solution: list[int], iteration: int, max_iter: int, cost_mat: numpy.ndarray)

混合邻域选择:50% 概率使用时间窗引导,50% 使用标准邻域

Args:

solution: 当前解路径。 iteration: 当前迭代次数。 max_iter: 总迭代次数。 cost_mat: 距离矩阵。

Returns:

List[int]: 新邻居解路径。

_local_search_2opt(solution: list[int], cost_mat: numpy.ndarray, max_iter: int = 20)

2-opt 局部搜索(First Improvement)。

使用 First Improvement 而非 Best Improvement 策略: 找到首个改善即接受,牺牲单步最优性换取更快的整体收敛速度。

solve(cost_mat: numpy.ndarray)

执行压缩退火主循环。

Args:

cost_mat: 距离矩阵。

Returns:
dict: 包含以下键:
  • best_solution (List[int]): 最优路径(含起终点)。

  • best_cost (float): 最优总成本(旅行累积值 + 时间惩罚,单位由输入矩阵决定)。

  • best_distance (float): 旅行累积值。标准模式 = 总距离;真实模式 = 总旅行时间。

  • best_penalty (float): 最优路径总时间惩罚。

  • convergence_history (List[float]): 收敛曲线,每轮迭代后的最优成本。