爬山算法简介和Python实现实例

yizhihongxing

爬山算法简介和Python实现实例

爬山算法简介

爬山算法(Hill Climbing Algorithm)是一种简单且常用的启发式优化算法。该算法的基本思想是从当前解出发,每次搜索邻域中比当前解更优的解,直到达到一个局部最优解。

但是,爬山算法容易陷入局部最优解,并且不能保证找到全局最优解。因此,在实际应用中常常会利用多次随机化生成多个初始解,或者使用其他优化算法来避免这种情况。

爬山算法Python实现实例

以下是一个简单的Python代码实现爬山算法,将其应用于寻找函数 f(x) = -x^2 + 3x -2 的最大值:

import random

def f(x):
    return -x**2 + 3*x - 2

def hill_climbing(start_x, step_size, max_iter):
    x = start_x
    for i in range(max_iter):
        left_x, right_x = x - step_size, x + step_size
        if f(left_x) > f(x):
            x = left_x
        elif f(right_x) > f(x):
            x = right_x
        else:
            break
    return x

start_x = random.uniform(-10, 10)
step_size = 0.01
max_iter = 1000

print('Starting from', start_x)
print('Found maximum at', hill_climbing(start_x, step_size, max_iter))

运行该代码,结果应该类似于:

Starting from 6.593011769876599
Found maximum at 0.999970304332504

代码中的 f(x) 函数表示要求解的目标函数。hill_climbing(start_x, step_size, max_iter) 函数表示爬山算法主体部分,start_x 为初始值,step_size 为每次更新的距离,max_iter 为迭代次数。在每一轮迭代中,我们计算当前值 $\pm step_size$ 的函数值,并与当前值比较,选择更优的值继续下一轮迭代,直到达到最大迭代次数或无法继续更新为止。

另一个简单示例

以下是另一个简单示例,以解决 traveling salesman problem(TSP)为例子。TSP 源于著名的旅行商问题,它要求在不重复地经过 n 个城市的情况下,找出一条路径,使得经过的距离最短。这里我们使用中国34城市的地图

import random
import numpy as np
import matplotlib.pyplot as plt

cities = np.array([[1150,1760],[630,1660],[40,2090],[750,1100],[750,2030],
          [1030,2070],[1650,650],[1490,1630],[790,2260],[710,1310],
          [840,550],[1170,2300],[970,1340],[510,700],[750,900],
          [1280,1200],[230,590],[460,860],[1040,950],[590,1390],
          [830,1770],[490,500],[1840,1240],[1260,1500],[1280,790],
          [490,2130],[1460,1420],[1260,1910],[360,1980],[220,700],
          [1740,1710],[910,1470],[840,880],[1170,2300],[1530,1160]])

def distance(city1,city2):
    return np.linalg.norm(city1-city2)

def total_distance(order):
    dist = 0
    for i in range(len(order)):
        dist += distance(cities[order[i-1]],cities[order[i]])
    return dist

def random_order():
    order = list(range(len(cities)))
    random.shuffle(order)
    return order

def hill_climbing(max_iter):
    order = random_order()
    for i in range(max_iter):
        new_order = order.copy()
        index1 = random.randint(0,len(cities)-1)
        index2 = random.randint(0,len(cities)-1)
        new_order[index1],new_order[index2] = new_order[index2],new_order[index1]
        if total_distance(new_order) < total_distance(order):
            order = new_order
    return order

max_iter = 5000
order = hill_climbing(max_iter)
print(order)
print(total_distance(order))

plt.plot(cities[:,0], cities[:,1], 'o')
for i in range(len(order)):
    plt.plot([cities[order[i-1],0],cities[order[i],0]], [cities[order[i-1],1],cities[order[i],1]], '-')
plt.show()

结果应该类似于:

[23, 10, 31, 11, 14, 12, 16, 3, 27, 13, 9, 5, 29, 32, 8, 20, 22, 0, 24, 6, 18, 7, 21, 1, 19, 4, 17, 26, 15, 2, 28, 30, 25]
8894.648633712076

代码中,cities 定义了所有城市的坐标。distance(city1,city2) 函数计算两个城市之间的距离(欧式距离)。total_distance(order) 函数计算某排序下,经过所有城市的路径总长度。random_order() 函数生成一个随机排序,用作初始值。hill_climbing(max_iter) 函数表示爬山算法的主体,max_iter 为最大迭代次数。在每一轮迭代中,我们先随机选择两个城市,交换它们的顺序,并比较是否能够减少路径长度,如果可以就接受新的顺序;否则,直接进入下一轮迭代。最终输出生成的排序和总路径长度。最后,代码绘制了城市图和所得排序下的路径。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:爬山算法简介和Python实现实例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 区分python中的进程与线程

    区分Python中的进程与线程 在Python中,进程(process)和线程(thread)是常见的多任务处理方式。在深入理解它们的区别之前,我们需要先了解一些基础知识。 1. 什么是进程和线程? 进程:操作系统中的一个概念,是正在运行的程序实例。进程有自己的内存空间和系统资源,可以独立运行。 线程:进程中执行的“任务”或“工作单元”,是程序执行的最小单位…

    python 2023年5月19日
    00
  • python发送邮件接收邮件示例分享

    Python发送邮件接收邮件完整攻略 一、发送邮件 1. 导入模块 首先,在代码中导入所需的模块:smtplib、email.mime.multipart、email.mime.text、email.mime.image。其中,smtplib模块提供SMTP邮件发送功能,email.mime.multipart、email.mime.text及email.m…

    python 2023年5月20日
    00
  • 深入浅析Python 中的sklearn模型选择

    深入浅析Python 中的sklearn模型选择 本文将针对Python中的scikit-learn (简称 sklearn),深入浅出的介绍模型选择的相关知识。 什么是模型选择 在机器学习中,模型选取是一个非常重要的工作。机器学习算法存在许多参数需要调整,而这些参数的不同取值会对最终的模型性能产生非常大的影响。模型选择的目的是在不同的模型或不同的参数集上进…

    python 2023年6月2日
    00
  • 使用pycharm运行flask应用程序的详细教程

    使用PyCharm运行Flask应用程序的详细教程 为了使用PyCharm运行Flask应用程序,需要执行以下步骤: 确保已经安装了Python和PyCharm IDE:在开始使用PyCharm运行Flask应用程序之前,需要先确保安装了Python和PyCharm。 安装Flask扩展:可以使用pip(Python包管理器)来安装Flask扩展。在命令行中…

    python 2023年5月13日
    00
  • 符合语言习惯的 Python 优雅编程技巧【推荐】

    我来为您详细讲解符合语言习惯的Python优雅编程技巧的攻略。 符合语言习惯的Python优雅编程技巧【推荐】 作为一门具有灵活性和可读性的语言,Python为我们提供了许多优雅的编程技巧。在这里,我们来介绍一些符合语言习惯的Python优雅编程技巧,帮助您提高Python代码的可读性和可维护性。 1. 列表推导式 列表推导式是Python中的一种构建列表的…

    python 2023年5月13日
    00
  • 解决python3爬虫无法显示中文的问题

    当我们使用Python 3进行爬虫时,有时会遇到无法正确显示中文字符的问题。这是因为Python 3默认使用Unicode字符编码,而网站的字符编码通常是UTF-8,所以需要进行字符编码的转换。以下是解决Python 3爬虫无法显示中文的完整攻略: 1. 检查网站字符编码 在进行字符编码转换前,我们需要先检查网站的字符编码。我们可以通过查看网站头部信息找到字…

    python 2023年5月20日
    00
  • Python学习笔记之函数的参数和返回值的使用

    Python学习笔记之函数的参数和返回值的使用 1.函数的参数 函数的参数指的是传递给函数的变量,在 Python 中,有以下几种参数: 1.1 必需参数 必需参数即传递给函数的参数是必须的,如果不传递参数或者传递的参数少于函数需要的参数,则会抛出 TypeError 异常。 举个例子,下面是一个计算两个数之和的函数,它需要两个必需参数: def add(x…

    python 2023年5月14日
    00
  • Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    让我们来详细讲解一下Python中字符串String的基本内置函数与过滤字符模块函数的基本用法。 内置函数 Python中字符串的内置函数非常丰富,常用的有以下几类: 1. 查找字符串 find(sub[, start[, end]]): 查找字符串sub在字符串中第一次出现的位置,返回下标(如果没有找到,返回-1)。可以指定开始查找和结束查找的下标。 in…

    python 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部