1. 引言
1.1 什么是启发式算法
启发式算法是一类用于寻找复杂优化问题近似解的方法,特别适用于在计算资源有限的情况下求解大型问题。与精确算法不同,启发式算法不保证找到全局最优解,但能在可接受的时间内提供一个质量较高的解。
1.2 启发式算法的应用领域
启发式算法广泛应用于诸多领域,包括但不限于:
- 工程设计:如结构优化和电路设计。
- 生产调度:如车间作业调度和生产计划优化。
- 物流配送:如车辆路径优化和仓库选址。
- 网络优化:如网络路由和拓扑设计。
- 机器学习:如参数调优和特征选择。
1.3 启发式算法与精确算法的区别
精确算法(如动态规划、线性规划)能在有限时间内找到问题的最优解,但其计算复杂度较高,难以应对大规模问题。启发式算法通过经验和启发式规则,在合理时间内找到近似最优解,具有计算速度快、适应性强的优点。
2. 启发式算法的类型及基本概念
2.1 局部搜索算法
局部搜索算法从一个初始解出发,通过邻域搜索找到更好的解,直到没有更好的邻域解。
- 基本概念:解空间、邻域结构、局部最优解。
- 应用实例:解决旅行商问题(TSP)。
- 算法实现:
def local_search(schedule): best_schedule = schedule best_cost = calculate_cost(schedule) while True: neighbors = generate_neighbors(schedule) improved = False for neighbor in neighbors: cost = calculate_cost(neighbor) if cost < best_cost: best_schedule = neighbor best_cost = cost improved = True if not improved: break return best_schedule, best_cost
2.2 模拟退火算法
模拟退火算法模拟物理退火过程,通过控制温度逐渐降低的策略寻找全局最优解。
- 基本概念:退火过程、温度控制策略、接受概率。
- 应用实例:生产调度问题。
- 算法实现:
import random import math def simulated_annealing(tsp, initial_temp, cooling_rate, stop_temp): current_solution = random.sample(tsp, len(tsp)) current_temp = initial_temp best_solution = current_solution best_cost = calculate_cost(current_solution) while current_temp > stop_temp: new_solution = generate_new_solution(current_solution) new_cost = calculate_cost(new_solution) if new_cost < best_cost or accept_new_solution(best_cost, new_cost, current_temp): current_solution = new_solution best_cost = new_cost best_solution = current_solution current_temp *= cooling_rate return best_solution, best_cost def calculate_cost(solution): cost = 0 for i in range(len(solution) - 1): cost += distance(solution[i], solution[i+1]) cost += distance(solution[-1], solution[0]) return cost def generate_new_solution(solution): new_solution = solution[:] i, j = random.sample(range(len(solution)), 2) new_solution[i], new_solution[j] = new_solution[j], new_solution[i] return new_solution def accept_new_solution(best_cost, new_cost, temp): return math.exp((best_cost - new_cost) / temp) > random.random() def distance(city1, city2): return math.sqrt((city1[0] - city2[0])**2 + (city1[1] - city2[1])**2) tsp = [(0, 0), (1, 2), (3, 5), (6, 1), (7, 7), (8, 8), (10, 10)] initial_temp = 1000 cooling_rate = 0.995 stop_temp = 1 best_solution, best_cost = simulated_annealing(tsp, initial_temp, cooling_rate, stop_temp) print(f"最优路径: {best_solution}, 最短距离: {best_cost}")
2.3 遗传算法
遗传算法通过模拟生物进化过程,通过选择、交叉、变异等操作优化种群,寻找最优解。
- 基本概念:种群、适应度函数、选择、交叉、变异。
- 应用实例:机器学习中的特征选择。
- 算法实现:
import random def genetic_algorithm(func, bounds, pop_size, generations, crossover_rate, mutation_rate): population = [random_individual(bounds) for _ in range(pop_size)] best_individual = max(population, key=lambda ind: func(ind)) for _ in range(generations): selected = selection(population, func) offspring = crossover(selected, crossover_rate) population = mutation(offspring, mutation_rate, bounds) current_best = max(population, key=lambda ind: func(ind)) if func(current_best) > func(best_individual): best_individual = current_best return best_individual de