从两道题来讨论一下模拟退火算法

今天上网课听了“连橘猫都能学会的计算几何”,感觉自己连橘猫都不如了…

今天唯一听懂的新知识应该就是这模拟退火算法了。

模拟退火算法是模拟钢铁才淬炼的时候的退火的过程温度变化的算法。

钢铁在退火的时候,其中某一点的温度是在不断变化的,也就是反复横跳的。模拟退火算法模拟了这一过程,在模拟精度达到一定的时候,可以实现得到全局最优解。

主要从两道题来讲。

第一道是二维的最小覆盖圆,第二道是三维的最小覆盖球。

最小覆盖圆的问题有几种解法:

  • 1、随机增量法
  • 2、爬山算法
  • 3、模拟退火算法

随机增量法在对点进行随机化之后,时间复杂度可以优化到O(N)附近。

然而我用的是模拟退火来做的,就很玄学。

第一题是HDU – 3932

求最小覆盖圆。

由于这题的精度只要求到0.1,因此我用我笨拙的模拟退火算法过了这题。事实上这道题我这样子写模拟退火是有问题的,运行效率并不高。

#include<iostream>
#include<random>
#include<math.h>
#include<time.h>
#include<algorithm>

using namespace std;

typedef long long ll;
const double eps = 1e-8;
const int maxn = 1e3 + 10;

const int inf = 0x3f3f3f3f;
const double start_T = 20000;//退火起始温度

#define sqr(x) ((x) * (x))

bool dcmp(double a, double b)
{
    return fabs(a - b) < eps;
}

int X, Y;//地图的范围
int n;//其他点的总个数

default_random_engine engine(static_cast<unsigned int>(time(0)));



class point //点或向量的类
{
public:
    double x, y;
    void read()
    {
        cin >> x >> y;
    }
    void print()
    {
        cout << x << y;
    }

    point(double mx, double my)
    {
        x = mx;
        y = my;
    }

    point()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值