POJ 2420 模拟退火求费马点

简介:

题意求一个多边形的费马点,即到所有顶点距离和最小的那一点。

以前觉得模拟退火好高端的样子,实际就是把点往四个方向移动固定步长,知道不能移动后缩小步长继续移动,也就是随机求一个接近最优并且满足精度的解。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef double diy;
struct point
{
    diy x,y;
    point() {}
    point(diy _x,diy _y):x(_x),y(_y) {}
};
double step[4][2]= {0,1,0,-1,-1,0,1,0};
double dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double disall(point a,point *g,int n)
{
    int i=0;
    double sum=0;
    while(n--)
        sum+=dis(a,g[i++]);
    return sum;
}
double SAnnealing(point *g,int n)
{
    point t=g[0];
    int flag;
    double ret=disall(t,g,n),st;
    for(st=100; st>1e-1; st*=0.98)
    {
        flag=1;
        while(flag)
        {
            flag=0;
            for(int i=0; i<4; i++)
            {
                point now(t.x+step[i][0]*st,t.y+step[i][1]*st);
                double nowdis=disall(now,g,n);
                if(nowdis<ret)
                    t=now,flag=1,ret=nowdis;
            }
        }
    }
    return ret;
}
int main()
{
    int n;
    point data[105];
    while(~scanf("%d",&n))
    {
        for(int i=0; i<n; i++)
            scanf("%lf%lf",&data[i].x,&data[i].y);
        printf("%.0f\n",SAnnealing(data,n));
    }
    return 0;
}


目录
相关文章
|
机器学习/深度学习 算法
模拟退火-n皇后问题
模拟退火-n皇后问题
HDU7018.Banzhuan(计算几何+贪心)
HDU7018.Banzhuan(计算几何+贪心)
104 0
HDU7018.Banzhuan(计算几何+贪心)
|
网络架构
POJ-1005,I Think I Need a Houseboat(数学题)
POJ-1005,I Think I Need a Houseboat(数学题)
|
机器学习/深度学习 索引 Python
使用遗传算法解决N皇后问题
经典的N皇后问题起源于国际象棋。任务是将八名皇后放置在棋盘上,而且他们中的任何两个都不互相构成威胁。换句话说,没有两个皇后可以在同一行、同一列或同一对角线。本文使用遗传算法解决N皇后问题。
1539 0
使用遗传算法解决N皇后问题
|
算法
POJ 3154 Graveyard【多解,数论,贪心】
Graveyard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1707   Accepted: 860   Special Judge Description Prog...
1248 0
|
算法
【算法导论】幻方算法
        说起幻方,大家应该在小学时候就已经接触过了,最简单的就是九宫格,射雕英雄传中的那段至今还记得:戴九履一,左三右七,二四为肩,六八为足。
1149 0