模拟退火+三分

2024-02-26 18:08
文章标签 模拟退火 三分

本文主要是介绍模拟退火+三分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目
题解
方法一:三分套三分(两个变量x和y的单峰函数,二维的三分法求解)

#include<bits/stdc++.h>
using namespace std;
int n;
double xx[1005],yy[1005],w[1005];double lx,rx,ly,ry;double dis(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}double work(double x,double y){double ans=0;for(int i=1;i<=n;i++){ans+=w[i]*dis(x,y,xx[i],yy[i]);}return ans;
}double three(double x){ly=-10000.0;ry=10000.0;for(int i=1;i<=100;i++){double d=(ry-ly)/3.0;double zuo=ly+d;double you=ry-d;double zuo_val=work(x,zuo);double you_val=work(x,you);if(zuo_val<=you_val)ry=you;else ly=zuo;}return work(x,ly);
}int main(){cin>>n;for(int i=1;i<=n;i++){//cin>>xx[i]>>yy[i]>>w[i];scanf("%lf%lf%lf",xx+i,yy+i,w+i);}lx=-10000.0,rx=10000.0;for(int i=1;i<=100;i++){double d=(rx-lx)/3.0;double zuo=lx+d;double you=rx-d;double zuo_val=three(zuo);double you_val=three(you);if(zuo_val<=you_val)rx=you;else lx=zuo;}printf("%.3f %.3f",lx,ly);
}

方法二:模拟退火
将热力学的东西运用到状态学上
(1) 温度T的初始值设置问题。 温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一、初始温度高,则搜索到全局最优解的可能性大,但因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。实际应用过程中,初始温度一般需要依据实验结果进行若干次调整。

(2) 退火速度问题。 模拟退火算法的全局搜索性能也与退火速度密切相关。一般来说,同一温度下的“充分”搜索(退火)是相当必要的,但这需要计算时间。实际应用中,要针对具体问题的性质和特征设置合理的退火平衡条件。

(3) 温度管理问题。 温度管理问题也是模拟退火算法难以处理的问题之一。实际应用中,由于必须考虑计算复杂度的切实可行性等问题,常采用如下所示的降温方式:式中k为正的略小于1.00的常数,t为降温的次数。 !

#include<bits/stdc++.h>
using namespace std;
#define begin_T 10000
#define end_T 1e-8
#define change_T 0.99
int n;
double xx[1001],yy[1001],w[1001],ansx,ansy;
double ans_e;
double energy(double x,double y){double res=0;for(int i=1;i<=n;i++){res+=w[i]*sqrt(  (x-xx[i])*(x-xx[i]) +(y-yy[i])*(y-yy[i])  );}return res;
}
void sa(int times){while(times--){for(double t=10000;t>1e-14;t*=0.999){//在当前的最优解ansx,ansy上波动寻找更优解//随着温度的减小,波动幅度也变小double dx=ansx+(2*rand()-RAND_MAX)*t;double dy=ansy+(2*rand()-RAND_MAX)*t;double now_e=energy(dx,dy);if(now_e<ans_e){ansx=dx;ansy=dy;ans_e=now_e;}else if(exp(  (ans_e-now_e)/t)  >double(rand())/RAND_MAX ){ansx=dx;ansy=dy;//ans_e=now_e;}}}
}
int main(){//cout<<ans_e<<endl;//srand(time(0));cin>>n;for(int i=1;i<=n;i++){cin>>xx[i]>>yy[i]>>w[i];ansx+=xx[i];ansy+=yy[i];}//将答案初始化为平均数ansx/=n;ansy/=n;ans_e=energy(ansx,ansy);//cout<<"ans_e="<<ans_e<<endl;sa(4);printf("%.3f %.3f\n",ansx,ansy);//cout<<"ans_e="<<ans_e<<endl;}

这篇关于模拟退火+三分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/749707

相关文章

模拟退火判断一个圆是否可以放在一个多边形内

/*给定n个点的一个多边形,一个圆的半径,判断圆是否可以放在多边形里*//* ***********************************************Author :rabbitCreated Time :2014/7/3 22:46:38File Name :2.cpp**********************************************

模拟退火求n个点到某点距离和最短

/*找出一个点使得这个店到n个点的最长距离最短,即求最小覆盖圆的半径用一个点往各个方向扩展,如果结果更优,则继续以当前步长扩展,否则缩小步长*/#include<stdio.h>#include<math.h>#include<string.h>const double pi = acos(-1.0);struct point {double x,y;}p[1010];int

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

SA(模拟退火)优化算法MATLAB源码详细中文注解

以优化SVM算法的参数c和g为例,对SA(模拟退火)算法MATLAB源码进行了逐行中文注解。 完整程序和示例文件地址:http://download.csdn.net/detail/u013337691/9644107 链接:http://pan.baidu.com/s/1i5G0gPB 密码:4ge8 % 使用模拟退火法寻优SVM中的参数c和g% 使用METROPOLIS接受准则%%

模拟退火TSP问题

模拟退火算法在求解最优值问题上有很大的优势,前面一篇博文介绍了用模拟退火算法实现求函数的最大、最小值问题。本文主要介绍如何用python实现模拟退火在TSP(旅行商)问题中的应用,源代码请移步pySA。网络上有不少文章介绍模拟退火TSP应用,可以对比着看。我们对实现的算法进行了测试,动态可视化更加形象。 1. TSP 问题描述 这个问题实际上就是求解最小路劲的问题,不过目前pySA实现还

模拟退火算法求函数最大、小值——python实现

模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一个大的搜寻空间内找寻命题的最优解。模拟退火是由S.Kirkpatrick, C.D.Gelatt和M.P.Vecchi在1983年所发明的。V.Černý在1985年也独立发明此演算法。模拟退火算法是解决TSP问题的有效方法之一。 模拟退火的出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退

#1142 : 三分·三分求极值 ( 三分极值 )

#1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: [week40_1.PNG] 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。 提示:三分法 输入 第1行:5个整数a,b,c,x,

数学建模赛前备赛——模拟退火算法

一.什么是智能优化算法 智能优化算法本质上是一个优化算法,它通过不断优化模型的参数,使得系统表现达到最优,常见的只能优化算法有很多,比如说蚁群算法,遗传算法以及我们今天的主角——模拟退火算法。 二.模拟算法的前身——爬山算法 爬山算法是一种简单的优化算法,它每次会从当前解的临近解空间中选取一个最优解来作为当前解,直到达到一个局部最优解,但是爬山算法有一个致命的缺陷,就是容易陷入局部最优解,无

模拟退火算法解多元函数

模拟退火算法解多元函数 题目: F ( x ) = 11.16386 − 0.0903 x 1 − 0.1487 x 2 − 0.0664 x 3 + 0.09074 x 4 − 2.452 ∗ 1 0 − 4 x 1 x 2 + 6.228 ∗ 1 0 − 5 x 1 x 3 + 2.457 ∗ 1 0 − 3 x 1 x 4 + 3.8688 ∗ 1 0 − 3 x 2 x 3 − 6.4

模拟退火算法分析

一. 爬山算法 ( Hill Climbing )          介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。          爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索