退火算法求最小包围圆

#include
#include
#include
#include
#include
#include
#include
#define N 1005
#define eps 1e-8
#define INF 1e99
#define delta 0.98
#define T 100
using namespace std;
//int dx[4] = { 0, 0, -1, 1 };
//int dy[4] = { -1, 1, 0, 0 };
struct Point
{
	int x;
	int y;
	int z;
};
Point p[N];
double dist(Point A, Point B)
{
	return sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y)+(A.z-B.z)*(A.z-B.z));
}
//double getsum(Point p[], int n, Point t)
//{
//	double ans = 0;
//	while (n--)
//	{
//		ans += dist(p[n], t);
//	}
//	return ans;
//}
double search(Point p[], int n)
{
	Point s = p[0];
	double t = T;
	double ans = INF;
	while (t > eps)
	{
		//bool flag = 1;
		//while (flag)//在每个t那找到一个最优的点  ,然后退出更新下一个t进行搜索
		//{
		//	flag = 0;
		//	for (int i = 0; i < 4; i++)
		//	{
		//		Point z;
		//		z.x = s.x + dx[i] * t;
		//		z.y = s.y + dy[i] * t;
		//		double tp = getsum(p, n, z);
		//		if (ans>tp)
		//		{
		//			ans = tp;
		//			s = z;
		//			flag = 1;
		//		}
		//	}
		//}
		int k = 0;
		for (int i = 0; i < n; i++)
		{
			if (dist(s, p[i])>dist(s, p[k]))
			{
				k = i;
			}
		}
		double d = dist(s, p[k]);
		ans = min(ans, d);
		s.x += (p[k].x - s.x) / d*t;
		s.y += (p[k].y - s.y) / d*t;
		s.z += (p[k].z - s.z) / d*t;
		t =t*delta;
	}
	return ans;
}
int main()
{
	int n;
	while (cin>>n&&n)
	{
		for (int i = 0; i < n; i++)
		{
			cin >> p[i].x >> p[i].y>>p[i].z;
		}
		cout << search(p, n);

	}
	return 0;
}

你可能感兴趣的:(代码练习)