C#实现最大最小距离算法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
namespace Arithmetic
{
///
/// 最大最小距离算法(又称小中取大距离算法)
///
public class SpaceCalculate
{
int[,] x = new int[100, 3]; //x[,]:输入点坐标集合; int[,] z = new int[100, 3]; //z[,]:标记第几个聚类中心; int[] b = new int[100]; //b[]用于记录与聚类中心最大距离的点标号;
int i, j, h, N, flag, k = 1, f = 1; //f:聚类中心个数;
double[,] w = new double[100, 100]; //w[,]用于标记各点到聚类中心距离最小值
double[,] dd = new double[100, 100]; //dd[,]:在循环体中记录各点与聚类中心距离
double Q, max1, max2;
double[] distance = new double[100]; //distance[]:记并求出录第二个聚类点
const double C = 0.5;
///
/// 主方法
///
/// 坐标数
/// 坐标点集合
/// 所有执行结果信息
public string method(int _N, int[,] _X)
{
StringBuilder strSpace = new StringBuilder();
b[0] = 0;
N = _N;
x = _X;
#region 暂时没用
//printf(" 最大最小距离分类法
");
//printf("请输入坐标数N :");
// scanf("%d",&N);
//printf("请输入各点的坐标:
");
//for (i = 0; i
//{
// x[i, 0] = i + 1;//x[0[0]=1,x[1][0]=2...
// for (j = 1; j
// {//x数组为三列数组,其中第一列用来编号记录个点,编号从1开始,x1,x2。如:x[3][3]={{1,0,0},{2,3,8},{3,2,2}}
// //scanf("%d", &x[i,j]);
// }
//}
//printf("输入的点为:
");
//for (i = 0; i
//{
// //printf("x%d:", x[i,0]);
// //printf("{%d,%d} ", x[i,1], x[i,2]);
//}
#endregion
//假设第一个点位第一个聚类中心
z[0, 0] = x[0, 0];
z[0, 1] = x[0, 1];
z[0, 2] = x[0, 2];
strSpace.Append(string.Format("
*取输入的第一个点为第一聚类中心z{0}:[{1},{2}]
", x[0, 0], x[0, 1], x[0, 2]));
//各点到聚类的距离
DotToCluster(strSpace);
max1 = distance[0];
for (j = 0; j
{
if (distance[j] > max1)
{
max1 = distance[j];
flag = j;
}
}
b[f] = flag;
strSpace.Append(string.Format("
*到z{0}[{1},{2}]距离最远的点(既聚类点) 是:({3},{4})
", z[0, 0], z[0, 1], z[0, 2], x[flag, 1], x[flag, 2])); Q = C * max1;
strSpace.Append("
*阈值Q 是:" + Q + "
");
while (k != 0)
{
//各点到各聚类中心距离
Center(strSpace);
//点到聚类中心距离的最小值
Min(strSpace);
}
return strSpace.ToString();
}
///
/// 各点到聚类的距离
///
///
private void DotToCluster(StringBuilder strSpace)
{
for (i = 0; i
{
distance[i] = Math.Sqrt((x[i, 1] - z[0, 1]) * (x[i, 1] - z[0, 1]) + (x[i, 2] - z[0, 2]) * (x[i, 2] - z[0, 2]));
strSpace.Append(string.Format(" 第{0}个点({1},{2})到z{3}({4},{5})的距离是:{6}
", (i + 1), x[i, 1], x[i, 2], z[0, 0], z[0, 1], z[0, 2], distance[i]));
}
}
///
/// 各点到各聚类中心距离
///
///
private void Center(StringBuilder strSpace)
{
for (j = 0; j
{
strSpace.Append("
*各点到各聚类中心距离为:
"); for (i = 0; i
{
for (j = 0; j
{
//开平方
dd[i, j] = (float)Math.Sqrt((x[i, 1] - x[b[j], 1]) * (x[i, 1] - x[b[j], 1]) + (x[i, 2] - x[b[j], 2]) * (x[i, 2] - x[b[j], 2]));
strSpace.Append(" " + dd[i, j] + "
");
}
strSpace.Append("
");
}
}
}
///
/// 点到聚类中心距离的最小值
///
///
private void Min(StringBuilder strSpace)
{
for (i = 0; i
{
w[i, 0] = dd[i, 0];
for (j = 0; j
{
if (w[i, 0] >= dd[i, j])//if(w[i,0]>dd[i,j]不对,这样会导致最后打印不出第一类的各点;
{
w[i, 0] = dd[i, j];
w[i, 2] = j;
}
}
w[i, 1] = i;
}
strSpace.Append("
*各坐标点到聚类中心最小距离是:
"); for (i = 0; i
{
strSpace.Append(" " + w[i, 0] + "
"); }
max2 = w[0, 0];
for (i = 0; i
{
if (max2
{
max2 = w[i, 0];
h = i;
}
}
if (max2 > Q)
{
f = f + 1;
b[f] = h;
strSpace.Append("
*由于到聚类中心距离中有比阈值大的,新聚类中心产生:
");
strSpace.Append(string.Format(" x{0}:[{1},{2}]
", h + 1, x[h, 1], x[h, 2]));
}
else
{
strSpace.Append("
*各坐标点到聚类中心距离均小于阈值" + Q + ",分类结束
");
k = 0;
strSpace.Append("
*一共产生" + (f + 1) + " 类聚类中心
");
for (i = 0; i
{
strSpace.Append("
*第" + (i + 1) + "类聚类中心包含坐标有:
");
for (j = 0; j
{
if (w[j, 2] == i)
{
strSpace.Append(string.Format(" x{0}:({1},{2}) ", j + 1, x[j, 1], x[j, 2]));
}
}
strSpace.Append("
");
}
}
}
}
}