题意:给定n个点,在范围内找到x轴上的一个点,使得n个点到这个点的距离之和最小
模拟退火法
模拟退火的过程
1 找到这些点所在的范围,用两个点框定
2 在这个范围内生成NUM个点(NUM自定)
3 对于每个生成的点i,在其周围生成NUM个点,一旦有点优于i,则替换。
4 缩小范围D,若D<精度,退出,否则执行 3
模拟退火法
模拟退火的过程
1 找到这些点所在的范围,用两个点框定
2 在这个范围内生成NUM个点(NUM自定)
3 对于每个生成的点i,在其周围生成NUM个点,一旦有点优于i,则替换。
4 缩小范围D,若D<精度,退出,否则执行 3
5 遍历所有NUM个点,找到val的最小值
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include<map>
#include<ctime>
using namespace std;
const int NUM=100;
const int RAD=1000;
struct point
{
double x,y,val;
point(){}
point(double _x,double _y):x(_x),y(_y){}
}p[100001],May[NUM];
double Rand(){return rand()%(RAD+1)/(1.0*RAD);}//随机产生0-1的浮点数
int n;
double mini , maxi ;
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 judge(point t)//评价函数,得到点t的评价值val
{
double len;
len=0;
for(int i=0;i<n;i++)
len += dis(t,p[i]);
return l