#include #include #include #include #include using namespace std; double randdouble(double fMin, double fMax) { double f = (double)rand() / RAND_MAX; return fMin + f * (fMax - fMin); } struct Pt { double x; double y; Pt(): x(0), y(0) {} }; double dist(const Pt &a, const Pt &b) { return sqrt(pow(a.x-b.x, 2) + pow(a.y-b.y, 2)); } int n; vector pts; vector sol; vector best_sol; double eval() { double res = 0; for (Pt p : pts) { double b = 99999999; for (Pt s : sol) b = min(b, dist(p, s)); res += b; } return res; } double hill_climb(int k, int it) { sol.clear(); sol = vector(k); for (int i=0; i value) { sol[s].x -= dx; sol[s].y -= dy; } else { value = new_val; } if ((i+1)%10==0) { delta *= 0.95; delta = max(delta, 1E-6); } } return value; } int main() { srand(123456); cin >> n; for (int i=0; i> p.x >> p.y; pts.push_back(p); } int K = 5; int IT = 10000; double best = 9999999; for (int i=0; i<20; i++) { double h = hill_climb(K, IT); cout << h << endl; if (h < best) { best = h; best_sol.clear(); for (Pt s : sol) { best_sol.push_back(s); } } } cout << endl; cout << "Best: " << best << endl; for (Pt p : best_sol) { cout << p.x << " " << p.y << endl; } return 0; }