爬山法和模拟退火

article/2025/11/10 12:47:17

文章目录

  • 前言
  • 一、爬山法
    • 1.算法步骤
    • 2.算法局限性
  • 二、模拟退火
    • 1.算法步骤
    • 2.注意点
    • 3.例题
      • 求费马点
      • 保龄球
      • 均分数据
  • 总结


前言

        爬山法和模拟退火都为随机化算法,考场想不到正解时可用来骗分,通常效果较好。模拟退火是基于爬山法的优化。


一、爬山法

       爬山法是一种贪心算法,在有限时间内很快找到局部最优解,可用来求解单峰函数极值。

1.算法步骤

       随机选出一个点,每次向最大(最小)方向更新,直到找到极值位置。
        Q:为什么单峰函数不用三分?
        A:在多维问题中需要三分套三分求解,复杂度过高。

2.算法局限性

    如下图所示:图片来源在这里插入图片描述
若当前问题的函数不是单峰,则爬山法只能寻找到局部最优解,不一定能寻找到全局最优解
下面的模拟退火能更好地解决此类问题 。

二、模拟退火

       模拟退火来源于物理模型———固体退火原理,是一种基于概率的算法。物理模型详细解释
       通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法,能快速在有限集合中以较大的概率找到全局最优解。

1.算法步骤

        (1).定义温度T使之指数级别衰减(有些题可理解为步长)
              初始温度T0         终止温度TE  
              衰减系数(0,1)一般取接近1的数
              衰减系数越接近1,衰减越慢

        (2).随机选择一个点P,并计算出此点函数值

        (3).每次迭代时在当前范围内随机选出一个新点NP,计算出NP函数值并与P函数值比较,定义 Δ \Delta ΔE=f (NP)-f ( P ),若满足要求则由旧点跳到新点,否则以一定概率跳过去在这里插入图片描述
上图以求最小值为例

        (4).随着温度降至终止温度,算法结束,找到全局最优解

        (5).为提高准确率,将以上过程重复若干次

下图为算法运行过程
在这里插入图片描述


2.注意点

  (1).局限性:1.有时运行效率较低
                      2.有一定概率出错
  (2).要求:方案或函数空间具有一定连续性

3.例题

求费马点

       题面:平面内有 n 个点,给出 n 个点的坐标,请你找出一个点,使得该点到这 n 个点的距离之和最小,答案四舍五入取整。

板子题,核心代码如下:

void simulate_anneal(){node now;now.x=randd(0,10000);//坐标范围边界now.y=randd(0,10000);for(double t=1e4;t>=1e-4;t*=0.99){//温度//初始温度:1e4  终止温度1e-4  衰减系数0.99node np;np.x=randd(now.x-t,now.x+t);np.y=randd(now.y-t,now.y+t);double delta=getans(np)-getans(now);//求解距离if(exp(-delta/t)>randd(0,1)){//以一定概率跳到新点now=np;}}
}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf%lf",&a[i].x,&a[i].y);}for(int i=1;i<=100;i++){//多次迭代simulate_anneal();}printf("%.0lf\n",ans);return 0;
}

保龄球

题目链接   模拟退火解决非几何问题

核心思路
       此题若用dp则状态难以存储,比较麻烦,转而发现本题空间有连续性(显然交换两个位置对答案影响并不大),因此可以每次随机交换两个位置,用模拟退火求解。

核心代码

void simulate_anneal(){for(double t=1e4;t>1e-4;t*=0.99){//温度 迭代int p=rand()%m;int q=rand()%m;int lst=getsum();//计算旧分数swap(a[p],a[q]);if(n+(a[n-1].x==10)==m){int now=getsum();//计算新分数int delta=now-lst;if(exp(delta/t)<(double)rand()/RAND_MAX){//一定概率交换swap(a[p],a[q]);}}else{swap(a[p],a[q]);}}
}int main(){n=read();for(int i=0;i<n;i++){a[i].x=read();a[i].y=read();}if(a[n-1].x==10){a[n].x=read();a[n].y=read();m=n+1;}else m=n;while((double)clock()/CLOCKS_PER_SEC<0.8){//卡时技巧simulate_anneal();}printf("%d\n",ans);return 0;
}

均分数据

题目链接

核心思路
       模拟退火+贪心求解
       贪心思路:方差是一种表示数据离散程度的方法,只需要让这些数据之间的差值尽可能小,就可以保障方差最小,所以每次插入时找目前和最小的集合插入。

核心代码

double getans(){double aver=0,res=0;memset(s,0,sizeof s);for(int i=0;i<n;i++){int k=0;for(int j=0;j<m;j++){//贪心找目前和最小的集合if(s[k]>s[j]){k=j;}}s[k]+=a[i];//插入}for(int i=0;i<m;i++){aver+=(double)(s[i]/m);}for(int i=0;i<m;i++){res+=(s[i]-aver)*(s[i]-aver);}res=sqrt(res/m);ans=min(ans,res);return res;
}void simulate_anneal(){random_shuffle(a,a+n);//随机打乱现有序列for(double t=1e4;t>1e-4;t*=0.99){///模拟退火int p=random()%n;int q=random()%n;double lst=getans();//计算旧值swap(a[p],a[q]);double now=getans();//计算新值double delta=now-lst;if(exp(-delta/t)<(double)rand()/RAND_MAX){//以一定概率交换swap(a[p],a[q]);}}
}int main(){scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%lf",&a[i]);}while((double)clock()/CLOCKS_PER_SEC<0.7){simulate_anneal();//卡时}printf("%.2lf\n",ans);return 0;
}

总结

例如:以上就是爬山+模拟退火,考试中的骗分利器,若有错误请指出~


http://chatgpt.dhexx.cn/article/VFwNHEQH.shtml

相关文章

搜索算法——爬山法

不断更新中...... 一、 爬山算法&#xff1a;爬山算法是一种简单的贪心搜索算法&#xff0c;该算法每次从当前位置的临近空间中选择一个最优解作为当前解&#xff0c;直到达到一个局部最优解。爬山算法可以类比成一个有失忆的人在浓雾中爬山。这里就揭示了爬山算法的两个问题…

搜索 —— 启发式搜索 —— 爬山法

【概述】 爬山法&#xff08;Hill Climbing&#xff0c;HC&#xff09;是一种局部择优的贪心搜索算法&#xff0c;其本质上是梯度下降法。 该算法每次从当前的节点开始&#xff0c;与周围的邻接点进行比较&#xff1a; 若当前节点是最大的&#xff0c;那么返回当前节点&…

Linux:快速查看IP地址及修改IP地址

导读Linux下如何快速查看IP地址及修改IP地址&#xff0c;有一个方法供参考 查ip 方法/步骤1: 打开linux操作系统在进入到界面 方法/步骤2: 在桌面右击打开终端。 方法/步骤3: 终端里输入ifconfig -a命令在回车键 方法/步骤4: 如下图可以看到了ip地址。 修改ip 方法/…

Linux Ubuntu查看IP信息的两种方式Ubuntu中检查你的 IP 地址

论使用什么系统&#xff0c;都有用到ip地址的时候&#xff0c;习惯了windows系统的人很容易就能查找出系统的ip&#xff0c;但是在linux系统如何查看ip呢&#xff1f;作为Linux新手&#xff0c;以Ubuntu的使用经验&#xff0c;我知道Ubuntu查看IP有两种方式。 第一种是在终端中…

Linux查询出口IP

查询的方式是通过Linux的curl访问查询ip的网站进行查询 具体步骤&#xff1a; 1.查询查询ip网站的ip 2.配置Linux的hosts文件 在/etc中的hosts文件增加上面的域名和ip&#xff08;注意&#xff1a;是ifconfig&#xff0c;不是ipconfig&#xff09; 3.在ssh命令下执行 curl ifc…

Linux 查看本地ip

Linux 查看本地ip 终端中输入指令ifconfig -a终端中输入指令hostname -I通过图形界面查看IP地址&#xff08;还未试通&#xff09; 终端中输入指令ifconfig -a 弹出的IP地址有点多 。 终端中输入指令hostname -I 会直接显示本机在局域网内的IP地址&#xff0c;但可能会显示多…

Linux服务器查看Ip地址

在服务器的网络配置中&#xff0c;需要同时配置这两种网络&#xff0c;才能使服务器正常使用。使用内网是为了保证我们的服务器处在一个安全的网络环境中&#xff0c;可以减少外部病毒的影响&#xff0c;而访问外网是为了方便我们配置服务器一些资源&#xff0c;如驱动程序&…

Linux 查看IP

UBuntu 系统下 按CtrlAltT 唤出终端 在终端输入: ifconfig 命令 点击回车 就可以看到自己电脑在局域网的IP地址了 图中第二行 inet 地址&#xff1a;192.168.1.101 就是你的电脑在局域网的IP地址了 如果输入 ifconfig 提示 找不到命令 那就在终端输入&#xff1a;sudo apt-get …

linux查看本机ip地址

linux中哪个命令可以查看自己的IP地址 50 我的主机是通过宽带联网的&#xff0c;主机的IP通过那个本地连接可以看到&#xff0c;但在虚拟机Debian linux5.0终端下输入route -n显示的是destination的IP&#xff0c;怎么查看属于虚拟机linux的IP呢&#xff1f;&#xff08;linux通…

Linux系统下怎么查询自己的ip和port

Linux系统下如何查询自己的ip和port 前言&#xff1a;在Linux系统中&#xff0c;学习网络协议之后&#xff0c;就需要经常查看自己系统的ip和port是否正常开启,那么怎么快速查找它们呢&#xff1f; 我现在就把它们列出来&#xff0c;以解我的心头之恨&#xff01;&#xff01;…

Linux查看IP地址命令

Linux查看公有&#xff08;运营商&#xff09;IP地址&#xff1a;下面两个命令都可以查 curl http://ifconfig.io curl ident.me Linux查看私有IP地址&#xff1a;可以使用以下四个命令中的任一一个 ip addr hostname -I | awk {print $1} ip route get 1.2.3.4 | awk {print…

linux怎么查看ip地址

linux怎么查看IP地址&#xff0c;怎么使用命令来查看IP地址&#xff1f;如下图教您怎么操作。 演示环境&#xff1a;centos7 方法一&#xff1a; 首先打开linux操作系统在进入到界面。 桌面右键打开终端 在终端里输入命令后按下回车键 ifconfig -a我们将看到ens33 位置处的…

linux 查看IP地址

参考资料整理 一.在 linux 下可以通过两个命令来查看本机的 IP 地址&#xff1a; 1.支持包括 Linux 在内的所有 Unix 系统。 # /sbin/ifconfig 2. 对于Linux 而言&#xff0c;也可以使用 ip 命令查看&#xff0c;提示&#xff1a;没有ifconfig命令时可以…

linux查看ip命令

参考文章&#xff1a;https://www.linuxidc.com/Linux/2017-10/147449.htm 摘要&#xff1a; 1、ifconfig 查看ip 2、vi 编辑 /etc/sysconfig/network-scripts 下的配置文件&#xff0c;设置动态分配IP有效 一、查看ip命令&#xff1a;ifconfig &#xff08;ip add 命令也行&…

在 Linux 命令行中查找 IP 地址介绍

几年前&#xff0c;ifconfig 是 Linux 中最受欢迎的查询本机 IP 地址的方法。但是现如今 ifconfig 命令已经被启用了。在某些 Linux 发行版上已经不用了。那么&#xff0c;除此以外还有什么别的方式来查询 IP 地址呢&#xff1f;今天我们就来了解一下这个问题。 在 Linux 命令…

在Linux系统中查找IP地址(六种方式)

在terminal输入命令 hostname -I 或 ifconfig 或 ip addr 或 ip address 或 ip addr show 或 ip address show

Linux下查看IP

输入ip查询命名 ip addr 也可以输入 ifconfig&#xff08;centOs7没有ifconfig命令&#xff09;查看ip&#xff0c;但此命令会出现3个条目&#xff0c;centos的ip地址是ens33条目中的inet值。 发现 ens33 没有 inet 这个属性&#xff0c;那么就没法通过IP地址连接虚拟机。 接着…

Linux 中查找 IP 地址的方法

概要 在 Linux 系统中&#xff0c;经常需要查找 IP 地址以进行网络配置、故障排除或安全管理。无论是查找本地主机的 IP 地址还是查找其他设备的 IP 地址&#xff0c;本文将介绍三种简单的方法&#xff0c;帮助你在 Linux 中轻松找到所需的 IP 地址。 方法一&#xff1a;使用 i…

12.4 高斯模糊

代码来源于 冯乐乐 shader入门精要 using System.Collections; using System.Collections.Generic; using UnityEngine;public class MyGaussianBlur : PostEffectsBase {public Shader gaussianBlurShader;private Material gaussianBlurMat;public Material material{get{gau…

Gamma矫正,先有鸡还是先有蛋的故事

先上图 此图出于LearnOpenGl CN。原文可能由于翻译的关系&#xff0c;导致内容其实并不好理解。翻阅了不少资料后&#xff08;其实就是冯乐乐老师的入门精要&#xff0c;逃...&#xff09;&#xff0c;想对gamma矫正做一个简单的总结。 先剖析一下这张图的含义&#xff08;此图…