今天上网课听了“连橘猫都能学会的计算几何”,感觉自己连橘猫都不如了…
今天唯一听懂的新知识应该就是这模拟退火算法了。
模拟退火算法是模拟钢铁才淬炼的时候的退火的过程温度变化的算法。
钢铁在退火的时候,其中某一点的温度是在不断变化的,也就是反复横跳的。模拟退火算法模拟了这一过程,在模拟精度达到一定的时候,可以实现得到全局最优解。
主要从两道题来讲。
第一道是二维的最小覆盖圆,第二道是三维的最小覆盖球。
最小覆盖圆的问题有几种解法:
- 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()

最低0.47元/天 解锁文章
1132

被折叠的 条评论
为什么被折叠?



