【未】[启发式算法]含初始解要求的有:TS, GA, SA, DPSO
在解决相关的TSP,VRP,PDP等方法中使用启发式算法中,需要借用初始解的有以下方法:
0. 算法简介
0.1 TS: 禁忌搜索算法
- 禁忌搜索算法(TS)
- 搞懂什么是禁忌搜索算法Tabu Search【附应用举例】
0.2 GA:遗传算法
构造初始种群(100个) → \to →种群根据适应度适者生存 → \to →种群的发展:交叉+突变 → \to →保留有效基因,提高适应度,从而逼近最优解.
- [基因遗传算法]原理思想和python代码的结合理解之(一) :单变量
- 遗传算法原理及其python实现
0.3 SA: 模拟退化算法
- 模拟退火算法(SA)
0.4 DPSO:粒子群算法
- 最优化算法之粒子群算法(PSO)
0.5 ALNS: 自适应大领域算法
单个初始解–破坏+修复–>新解,计算obj值不断的优化
- 自适应大领域搜索算法(ALNS) 详解及python示例
0.6 ACO:蚁群算法
- 蚁群算法java实现以及TSP问题蚁群算法求解
一、 初始解的构造
1.1随机构造法
demand_id_list=np.arange(10)
random.shuffle(demand_id_list)
1. 2. 插入法
- 原文:《求解PDPTW问题的快速LNS》
设L LL为所有未安排的客户集合。(或:未拜访过的站点集合)
对每个未安排的客户,找出它在当前构造的解中插入代价最小的客户,将其插入当前解中,如果是第一个客户或者没有可行插入位置,则新安排一辆车给此客户
从L LL中删除被插入的客户。
如果L为空,停止;否则跳转到步骤2
在LNS中破坏和修复,其修复过程也可以看作是插入节点的过程.如何插入可以快速得到最优解则是快速LNS的核心. 有点类同于ALNS.
二、解的解码
2.1 分割法
看Better.C所提供的方法
2.2 导弹发射算法
2.3 快速插入法
####2opt局部搜索
import randomfrom utils import distance_matrix, objclass LocalSearch():def __init__(self):passdef solve(self, points):num = len(points)distance_matrix_ = distance_matrix(points, num)current_solution = [i for i in range(num)]random.shuffle(current_solution)current_distance = obj(points, current_solution)while True:best_length = 100000000best_solution = []for index1 in range(num - 1):for index2 in range(index1 + 1, num - 1):temp_solution, temp_distance = self.one_step(num, current_solution, distance_matrix_,current_distance, index1, index2)if temp_distance < best_length:best_length = temp_distancebest_solution = [temp_solution]elif temp_distance == best_length:best_solution.append(temp_solution)if best_length >= current_distance:breakelse:# print(best_length)current_distance = best_lengthcurrent_solution = random.sample(best_solution, 1)[0]return current_solutiondef one_step(self, num, current_solution, distance_matrix, current_distance, index1, index2):a = current_solution[:index1]b = current_solution[index1:index2 + 1][::-1]c = current_solution[index2 + 1:]new_solution = a + b + cnew_distance = current_distance - distance_matrix[current_solution[(index1 - 1) % num]][current_solution[index1]] - distance_matrix[current_solution[index2]][current_solution[(index2 + 1) % num]] + \distance_matrix[current_solution[(index1 - 1) % num]][current_solution[index2]] + \distance_matrix[current_solution[index1]][current_solution[(index2 + 1) % num]]return new_solution, new_distance
ddd
def distance_matrix(points, num):distance_matrix = np.zeros([num, num])for i in range(num):for j in range(num):distance_matrix[i][j] = length(points[i], points[j])return distance_matrixdef obj(points, solution):obj = length(points[solution[-1]], points[solution[0]])for index in range(0, len(points) - 1):obj += length(points[solution[index]], points[solution[index + 1]])return obj