去年暑假在准备机器人大赛的时候用到了KMeans算法,我们使用该算法来对地图进行分区,该算法的具体步骤如下:
1.随机的选取K个种子点作为初始聚类中心
2.然后求出所有的点到K个聚类中心的距离,找出离每个点最近的聚类中心作为该点的种群中心。
3.经过前两步就形成了K个点群,然后更新K个点群的中心。
4,重复步骤2和3直到满足一定的阈值。
开发环境 VS2012 + easyX
源代码如下:
#include<iostream>
#include<graphics.h>
#include<cmath>
#include<cstdlib>
#include<easyx.h>
#include<vector>
using namespace std;
//随机生成的点的数目
#define POINT_NUM 8000
//窗口的大小
#define WIDTH 600
#define HEIGHT 600
struct point
{
double x; //该点的X坐标
double y; //该点的Y坐标
int cluster; //该店所属聚类的索引
};
/**
绘制每个聚类所用的颜色
**/
COLORREF color[15]=
{
WHITE,YELLOW,RED,BLUE,GREEN,
BROWN,LIGHTCYAN,MAGENTA,LIGHTRED,
CYAN,LIGHTBLUE,LIGHTGREEN, DARKGRAY,
LIGHTMAGENTA,LIGHTGRAY,
};
//初始化聚类点
void initCluster(vector<struct point*>& pointList,int num);
//随机生成聚类中心
void generateCenter(vector<struct point*>& center,int Num);
//画出所有的点
void drawCluster(vector<struct point*>& pointList);
//获得一个聚类的中心
struct point* getCenter(vector<struct point*>& cluster);
//获得两点之间的欧式距离
double getDist