Python实战开发及案例分析(25)—— 爬山算法

        爬山算法(Hill Climbing)是一种启发式搜索算法,常用于解决优化问题。它的核心思想是从一个初始解开始,不断朝着增益最大的方向移动,直到达到局部最优解。

实现步骤

  1. 从初始解开始。
  2. 在当前解的邻域中找到一个更好的解。
  3. 如果找到的解比当前解好,则移动到该解,并重复步骤2。
  4. 如果在邻域中没有找到更好的解,则算法终止,返回当前解。

代码示例

        以下示例展示了如何使用爬山算法求解一个简单的函数优化问题。目标是找到使函数值最大的输入值。

示例问题:最大化函数f\left ( x \right )=-\left ( x-3 \right )^2+10
import randomdef hill_climbing(f, x0, step_size=0.1, max_iterations=1000):current_x = x0current_f = f(current_x)for i in range(max_iterations):neighbors = [current_x + step_size, current_x - step_size]next_x = max(neighbors, key=f)next_f = f(next_x)if next_f <= current_f:breakcurrent_x, current_f = next_x, next_freturn current_x, current_f# 定义目标函数
def objective_function(x):return -(x - 3) ** 2 + 10# 初始解
initial_solution = random.uniform(-10, 10)# 执行爬山算法
solution, solution_value = hill_climbing(objective_function, initial_solution)print(f"Optimal solution: x = {solution:.4f}")
print(f"Optimal value: f(x) = {solution_value:.4f}")

案例分析

        在这个案例中,我们定义了一个简单的目标函数f\left ( x \right )=-\left ( x-3 \right )^2+10 ,其最大值出现在 𝑥=3 处。爬山算法从随机初始解开始,通过在邻域中寻找更优解,不断更新当前解,直到达到局部最优解。输出显示了算法找到的最优解及其对应的函数值。

解释与改进

        爬山算法的一个主要缺点是它容易陷入局部最优解。为了改进这一点,可以使用以下几种方法:

  1. 随机重启爬山算法(Random Restart Hill Climbing):多次运行爬山算法,每次从不同的随机初始解开始,最后选择最佳结果。
  2. 模拟退火算法(Simulated Annealing):在搜索过程中偶尔接受较差的解,以跳出局部最优解。
  3. 爬山算法与其他启发式搜索算法结合:例如与遗传算法(Genetic Algorithm)结合,利用全局搜索能力。
随机重启爬山算法示例
def random_restart_hill_climbing(f, num_restarts=10, step_size=0.1, max_iterations=1000):best_solution = Nonebest_value = float('-inf')for _ in range(num_restarts):initial_solution = random.uniform(-10, 10)solution, solution_value = hill_climbing(f, initial_solution, step_size, max_iterations)if solution_value > best_value:best_solution, best_value = solution, solution_valuereturn best_solution, best_value# 执行随机重启爬山算法
solution, solution_value = random_restart_hill_climbing(objective_function)print(f"Optimal solution: x = {solution:.4f}")
print(f"Optimal value: f(x) = {solution_value:.4f}")

        在随机重启爬山算法中,我们多次运行标准爬山算法,每次从不同的随机初始解开始。最后,选择所有运行中找到的最佳解。这种方法可以有效地避免陷入局部最优解,提高找到全局最优解的可能性。

案例:使用爬山算法解决旅行商问题(TSP)

        旅行商问题(Travelling Salesman Problem,TSP)是经典的组合优化问题,其目标是在给定的一组城市中找到一条路径,使得旅行商访问每个城市一次并返回起始城市的总距离最短。

实现步骤

  1. 定义问题:给定一组城市及其之间的距离矩阵。
  2. 初始化解:随机生成一个初始路径。
  3. 计算适应度:计算当前路径的总距离。
  4. 生成邻域解:通过交换路径中的两个城市生成邻域解。
  5. 选择更优解:在邻域解中找到比当前解更优的解,更新当前解。
  6. 重复:重复生成邻域解和选择更优解的过程,直到达到停止条件。

代码示例

import random
import itertools# 定义距离矩阵
distance_matrix = [[0, 2, 9, 10],[1, 0, 6, 4],[15, 7, 0, 8],[6, 3, 12, 0]
]# 计算路径总距离
def calculate_total_distance(path, distance_matrix):total_distance = 0for i in range(len(path)):total_distance += distance_matrix[path[i - 1]][path[i]]return total_distance# 生成初始解
def generate_initial_solution(num_cities):path = list(range(num_cities))random.shuffle(path)return path# 生成邻域解
def generate_neighbors(path):neighbors = []for i in range(len(path)):for j in range(i + 1, len(path)):neighbor = path[:]neighbor[i], neighbor[j] = neighbor[j], neighbor[i]neighbors.append(neighbor)return neighbors# 爬山算法
def hill_climbing_tsp(distance_matrix, max_iterations=1000):num_cities = len(distance_matrix)current_solution = generate_initial_solution(num_cities)current_distance = calculate_total_distance(current_solution, distance_matrix)for _ in range(max_iterations):neighbors = generate_neighbors(current_solution)best_neighbor = min(neighbors, key=lambda p: calculate_total_distance(p, distance_matrix))best_neighbor_distance = calculate_total_distance(best_neighbor, distance_matrix)if best_neighbor_distance >= current_distance:breakcurrent_solution, current_distance = best_neighbor, best_neighbor_distancereturn current_solution, current_distance# 执行爬山算法
solution, solution_distance = hill_climbing_tsp(distance_matrix)print(f"Optimal solution: {solution}")
print(f"Optimal distance: {solution_distance}")

案例分析

        在这个案例中,我们使用爬山算法来解决一个包含4个城市的旅行商问题。我们定义了一个距离矩阵,表示城市之间的距离。爬山算法从一个随机生成的初始路径开始,通过在邻域解中寻找更优的路径,不断优化当前解,最终找到一个局部最优解。

解释与改进

        爬山算法在处理TSP问题时,容易陷入局部最优解。以下是一些可能的改进:

  1. 随机重启爬山算法:多次运行爬山算法,每次从不同的随机初始解开始,最后选择最佳结果。
  2. 模拟退火算法:在搜索过程中偶尔接受较差的解,以跳出局部最优解。
  3. 混合算法:结合遗传算法、粒子群优化等全局搜索算法,提高找到全局最优解的可能性。
随机重启爬山算法示例
def random_restart_hill_climbing_tsp(distance_matrix, num_restarts=10, max_iterations=1000):best_solution = Nonebest_distance = float('inf')for _ in range(num_restarts):solution, solution_distance = hill_climbing_tsp(distance_matrix, max_iterations)if solution_distance < best_distance:best_solution, best_distance = solution, solution_distancereturn best_solution, best_distance# 执行随机重启爬山算法
solution, solution_distance = random_restart_hill_climbing_tsp(distance_matrix)print(f"Optimal solution: {solution}")
print(f"Optimal distance: {solution_distance}")

案例:使用爬山算法优化机器学习模型参数

        爬山算法不仅可以用于组合优化问题,还可以用于优化机器学习模型的参数。下面我们展示如何使用爬山算法来优化线性回归模型的参数。

实现步骤

  1. 定义问题:给定一组数据和一个线性回归模型,优化模型的参数以最小化损失函数(例如均方误差)。
  2. 初始化解:随机生成初始模型参数。
  3. 计算适应度:计算当前参数下的损失函数值。
  4. 生成邻域解:通过在当前参数周围进行微小扰动生成邻域解。
  5. 选择更优解:在邻域解中找到比当前解更优的解,更新当前解。
  6. 重复:重复生成邻域解和选择更优解的过程,直到达到停止条件。

代码示例

import numpy as np# 生成数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)# 定义损失函数(均方误差)
def mse(theta, X, y):m = len(y)predictions = X.dot(theta)return (1/m) * np.sum((predictions - y) ** 2)# 爬山算法优化线性回归参数
def hill_climbing_lr(X, y, initial_theta, step_size=0.01, max_iterations=1000):current_theta = initial_thetacurrent_loss = mse(current_theta, X, y)for i in range(max_iterations):neighbors = [current_theta + step_size * np.random.randn(*current_theta.shape) for _ in range(10)]best_neighbor = min(neighbors, key=lambda t: mse(t, X, y))best_neighbor_loss = mse(best_neighbor, X, y)if best_neighbor_loss >= current_loss:breakcurrent_theta, current_loss = best_neighbor, best_neighbor_lossreturn current_theta, current_loss# 初始化参数
initial_theta = np.random.randn(2, 1)# 扩展X矩阵,以包含偏置项
X_b = np.c_[np.ones((100, 1)), X]# 执行爬山算法
solution_theta, solution_loss = hill_climbing_lr(X_b, y, initial_theta)print(f"Optimal theta: {solution_theta.ravel()}")
print(f"Optimal loss: {solution_loss}")

案例分析

        在这个案例中,我们使用爬山算法来优化线性回归模型的参数。数据由线性模型生成,并添加了一些随机噪声。爬山算法从随机初始化的参数开始,通过在参数空间中搜索最优解,最小化损失函数(均方误差)。

解释与改进

        爬山算法在优化模型参数时可能会陷入局部最优解。以下是一些可能的改进:

  1. 随机重启爬山算法:多次运行爬山算法,每次从不同的随机初始解开始,最后选择最佳结果。
  2. 模拟退火算法:在搜索过程中偶尔接受较差的解,以跳出局部最优解。
  3. 梯度下降:使用梯度信息更高效地找到最优解。
随机重启爬山算法示例
def random_restart_hill_climbing_lr(X, y, num_restarts=10, step_size=0.01, max_iterations=1000):best_theta = Nonebest_loss = float('inf')for _ in range(num_restarts):initial_theta = np.random.randn(2, 1)theta, loss = hill_climbing_lr(X, y, initial_theta, step_size, max_iterations)if loss < best_loss:best_theta, best_loss = theta, lossreturn best_theta, best_loss# 执行随机重启爬山算法
solution_theta, solution_loss = random_restart_hill_climbing_lr(X_b, y)print(f"Optimal theta: {solution_theta.ravel()}")
print(f"Optimal loss: {solution_loss}")

        通过随机重启爬山算法,我们多次运行爬山算法,每次从不同的随机初始解开始。通过多次尝试,算法可以有效避免陷入局部最优解,提高找到全局最优解的概率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode109:组合总和Ⅳ

题目描述 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 解题思想 使用完全背包 代码 /*dp[i]&#xff1a;表示装满容量为i的背包有dp[i]种方…

高通QCS6490开发(二)AI板卡接口

QCS6490是高通公司针对高端物联网终端而优化的SoC&#xff0c;在性能和功耗上有最优的平衡。《高通QCS6490 AIoT应用开发》是一系列AIoT应用开发文章&#xff0c;介绍如何基于QCS6490平台做AIIoT的应用开发。 本文主要介绍FV01开发板的内部和外部接口。 内部的板载接口如下 接口…

天锐绿盾 | 设计院、机械制造行业透明加密cad图纸、图纸防泄密软件

天锐绿盾为设计院及机械制造行业量身打造的透明加密CAD图纸解决方案&#xff0c;专注于保障这些行业中的核心资产—设计图纸的安全。通过集成先进的加密技术和访问控制策略&#xff0c;该软件系统能有效防止图纸的未经授权访问和意外泄密。 PC地址&#xff1a; https://isite…

每日一练 2024.5.16 (补 2024.5.15)

题目&#xff1a; 给定一个 正整数 数组 beans &#xff0c;其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&#xff09;&#xff0c;使得剩下的 非空 袋子中&#xff08;即 至少还有一颗 魔法豆的袋子&#xff09;…

2024汽车行业用户洞察与营销趋势白皮书

来源&#xff1a;小红书&寰球汽车&#xff1a;

设备接入物联网平台必须掌握的关键信息——青创智通

工业物联网解决方案-工业IOT-青创智通 设备接入物联网平台需要掌握的信息相当丰富且复杂&#xff0c;这涉及到多个层面&#xff0c;包括技术细节、平台选择、安全性考虑以及后期管理与维护等。以下将详细阐述设备接入物联网平台所需掌握的关键信息。 首先&#xff0c;我们需要…

【recast-navigation-js】通过websocket获取navmesh数据并初始化

目录 说在前面目录结构websocket服务器前端结果 说在前面 操作系统&#xff1a;windows 11浏览器&#xff1a;edge版本 124.0.2478.97recast-navigation-js版本&#xff1a;0.29.0golang版本&#xff1a;1.21.5 目录结构 D:. │ go.mod │ go.sum │ main.go // websocket …

Halcon 根据XYZ生成3D模型

Halcon 根据XYZ生成3D模型 x_points := [a_x_points, b_x_points, c_x_points]y_points := [a_y_points, b_y_points, c_y_points]z_points := [a_z_points, b_z_points, c_z_points]stop()gen_object_model_3d_from_points

风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码) 基于遗传算法优化BP神经网络是一种常见的方法,用于改进BP神经网络在风电功率预测中的性…

JavaScript-基本数据类型和变量

基本数据类型 JavaScript支持数字、字符串和布尔值3种基本数据类型 字符串型 字符串型是JavaScript用来表示文本的数据类型&#xff0c;字符串通常由单引号或双引号括起来&#xff0c;如果字符串存在特殊字符&#xff0c;可以用转义字符代替 数字型 数字型也是JavaScript中的基…

【数据链路层】以太网帧包解析

文章目录 以太网的帧结构解析数据链路层信息 以太网的帧结构 使用抓包工具&#xff0c;查看数据链路层信息&#xff1a; 解析数据链路层信息 &#xff08;1&#xff09;协议类型&#xff1a;代表上层的协议 &#xff08;IP00800 ARP00806 IPv686DD &#xff09; 如图中所示&a…

金蝶AAS-V9.0前后端部署

前言 包含金蝶AAS9.0部署&#xff0c;前端部署&#xff0c;后端部署。 金蝶AAS9.0部署 1. 下载金蝶AAS9.0安装包上传至服务器&#xff1b; 2. 解压安装包&#xff1b; unzip -d /opt/AAS-V9.0 AAS-V9.0.zip3. 配置JAVA路径&#xff1b; echo $JAVA_HOME vim /opt/AAS-9.0…

力扣HOT100 - 32. 最长有效括号

解题思路&#xff1a; 栈 class Solution {public int longestValidParentheses(String s) {int max 0;// 也可以使用 Stack<Integer> stacknew Stack<>();但Stack是遗留类&#xff0c;不推荐Deque<Integer> stack new LinkedList<>();stack.push(…

怎么做微信在线预约

在快节奏的现代生活中&#xff0c;我们总是追求更高效、更便捷的服务体验。而微信&#xff0c;这个拥有数亿用户的社交平台&#xff0c;早已不仅仅是一个聊天工具&#xff0c;它更是一个融合了多种功能的综合性服务平台。今天&#xff0c;就让我们一起探讨如何通过微信在线预约…

线程池的一些问题

核心线程数1.最大线程5.队列5.存活时间10s 1.场景一 如果核心线程数.被一直占用得不到释放.新进来1个任务.会怎么样?答: 会在队列中中死等. 只要进来的任务.不超过队列的长度,就会一直挡在队列中死等 package com.lin;import java.util.concurrent.Executors; import java.u…

通过阿里云的PAI基于开源LLM搭建RAG检索增强对话系统

5月9日参加阿里云AI云峰会活动&#xff0c;学习了下如何借助阿里云的PAI服务进行搭建RAG检索增加对话系统。 前提&#xff1a; 为了方便省钱&#xff0c;建议先通过免费的优惠圈&#xff0c;这样就可以先不花钱学习一下啦。开始实验之前&#xff0c;请务必打开 阿里云免费试用…

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem&#xff0c;继上一章节讲过qt中如何编译freetype Qt编译和使用freetype矢量字库方法https://blog.csdn.net/wangningyu/article/details/138927379#QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览…

【SpringBoot】SpringBoot3-基本介绍

目录 环境基本介绍pom.xml启动器依赖管理机制分析为什么导入starter-web所有相关依赖都导入进来&#xff1f;为什么版本号都不用写&#xff1f;自定义版本号第三方的依赖 总结 自动配置机制理解默认的包扫描规则配置默认值按需加载自动配置总结 自动配置流程问题流程步骤流程总…

Python数据分析与数据可视化 概念

考试题型&#xff1a; 一、填空题&#xff08;1分*10&#xff09; 二、程序代码填空&#xff08;1分*20&#xff09; 三、读程序写结果&#xff08;10分*4&#xff09; 四、程序设计&#xff08;10分*1&#xff09; 五、问答题&#xff08;20分*1&#xff09; 考试范围&#x…

沃尔玛自建自养号测评的优势,提升产品排名的新选择

在沃尔玛平台上&#xff0c;产品排名和销量的提升对于卖家而言至关重要&#xff0c;而产品测评则是实现这一目标的有效途径。然而&#xff0c;市场上对于测评的需求激增&#xff0c;随之而来的是寻找测评服务的种种困难和风险。因此&#xff0c;越来越多的卖家选择自建自养号测…