Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161811
  • 博文数量: 76
  • 博客积分: 1513
  • 博客等级: 上尉
  • 技术积分: 755
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-25 15:15
文章分类

全部博文(76)

文章存档

2012年(2)

2011年(74)

我的朋友

分类: Java

2011-11-27 14:34:55

  1. package KJ;
  2. public class Point {
  3.     int x;
  4.     int y;
  5.     Point(){}
  6.     Point(int x,int y)
  7.     {
  8.     this.x=x;
  9.     this.y=y;
  10.     }

  11. }
  12. public class Particle {
  13.         double x;
  14.         double y;
  15.         Particle(){}
  16.         Particle(double x,double y){
  17.         this.x=x;
  18.         this.y=y;
  19.         }
  20. }
  21. public class K {
  22. static Point a[]=new Point[10];
  23. static Point k[][]=new Point[2][10];
  24. static Particle e0[]=new Particle[2];
  25. static Particle e1[]=new Particle[2];
  26. static double d0,d1;
  27. static int n;
  28. static int m[]=new int[2];
  29. public static void main(String[] args)
  30. {
  31.    K result=newK();
  32.    result.random();
  33.    System.out.println("随机生成的十个点:");
  34.    for(int i=0;i<a.length;i++)
  35.    {
  36.     System.out.print("("+a[i].x+","+a[i].y+")");
  37.    }
  38.    result.k();//将随机生成的10个点分到二维数组中
  39.   
  40.    for(int i=0;i<2;i++)
  41.    {
  42.     e0[i]=new Particle(0.0,0.0);
  43.     e1[i]=new Particle(0.0,0.0);
  44.    }
  45.    m[0]=a.length/2;
  46.    m[1]=a.length/2;
  47.         for(int i=0;i<a.length/2;i++)
  48.         {
  49.         e0[0].x+=a[i].x;
  50.         e0[0].y+=a[i].y;
  51.         e0[1].x+=a[i+a.length/2].x;
  52.         e0[1].y+=a[i+a.length/2].y;
  53.         }
  54.         e0[0].x/=m[0];
  55.         e0[0].y/=m[0];
  56.         e0[1].x/=m[1];
  57.         e0[1].y/=m[1];
  58.        System.out.println(e0[0].x+","+e0[0].y);
  59.        System.out.println(e0[1].x+","+e0[1].y);
  60.        do{
  61.         System.out.println("经过第"+(++n)+"次循环,得到结果如下:");
  62.            for(int i=0;i<2;i++)
  63.            {
  64.                System.out.print("\n 第"+i+"类:");
  65.                for(int j=0;j<k[0].length;j++)
  66.                {
  67.                 System.out.print("("+k[i][j].x+","+k[i][j].y+")");
  68.                }
  69.                System.out.println("点的个数:"+m[i]+"聚类中心为:"+"("+e0[i].x+","+e0[i].y+")");
  70.            }
  71.    e1[0]=new Particle(0.0,0.0);
  72.    e1[1]=new Particle(0.0,0.0);
  73.         result.run();
  74.       for(int i=0;i<2;i++)
  75.    {
  76.     for(int j=0;j<10;j++)
  77.     {
  78.      e1[i].x+=k[i][j].x;
  79.      e1[i].y+=k[i][j].y;
  80.     }
  81.    }
  82.    e1[0].x/=m[0];
  83.    e1[0].y/=m[0];
  84.    e1[1].x/=m[1];
  85.    e1[1].y/=m[1];
  86.    //result.run();
  87.    if(e1[0].x==e0[0].x&&e1[1].x==e0[1].x&&e1[0].y==e0[0].y&&e1[1].y==e0[1].y)
  88.    {
  89.     System.out.println("\n聚类结束,前后两次聚类中心重合!\n");
  90.     break;
  91.    }

  92.    e0[0]=e1[0];
  93.    e0[1]=e1[1];
  94.        }while(true);
  95.     System.out.println("经过第"+(++n)+"次循环,得到结果如下:");
  96.        for(int i=0;i<2;i++)
  97.        {
  98.            System.out.print("\n 第"+i+"类:");
  99.            for(int j=0;j<k[0].length;j++)
  100.            {
  101.             System.out.print("("+k[i][j].x+","+k[i][j].y+")");
  102.            }
  103.            System.out.println("点的个数:"+m[i]+"聚类中心为:"+"("+e0[i].x+","+e0[i].y+")");
  104.        }
  105. }
  106. public void random()
  107. {
  108.    for(int i=0;i<a.length;i++)
  109.    {
  110.     a[i]=new Point();
  111.     a[i].x=(int)(Math.random()*100+1);
  112.     a[i].y=(int)(Math.random()*100+1);
  113.     for(int j=0;j<i;j++)
  114.      if(a[j]==a[i])
  115.       i--;
  116.    }
  117. }
  118. private void k()
  119. {
  120.    for(int i=0;i<2;i++)
  121.     for(int j=0;j<k[i].length;j++)
  122.     {
  123.      k[i][j]=new Point(0,0);
  124.     }
  125.    for(int j=0;j<a.length;j++)
  126.    {
  127.     if(j<a.length/2)
  128.     {
  129.      k[0][j]=a[j];
  130.     }
  131.     else
  132.     {
  133.      k[1][j]=a[j];
  134.     }
  135.    }
  136. }
  137.     public void run()
  138.     {
  139.       for(int i=0;i<2;i++)
  140.            for(int j=0;j<k[i].length;j++)
  141.            {
  142.             if(k[i][j].x==0&&k[i][j].y==0)
  143.              continue;
  144.              d0=Math.sqrt((k[i][j].x-e0[0].x)*(k[i][j].x-e0[0].x)+(k[i][j].y-e0[0].y)*(k[i][j].y-e0[0].y));
  145.              d1=Math.sqrt((k[i][j].x-e0[1].x)*(k[i][j].x-e0[1].x)+(k[i][j].y-e0[1].y)*(k[i][j].y-e0[1].y));
  146.                if(d0>d1&&(i==0))
  147.                {
  148.                       k[1][j]=k[i][j];
  149.                       k[i][j]=new Point(0,0);
  150.                       m[1]++;
  151.                       m[0]--;
  152.                }
  153.                if(d0<d1&&(i==1))
  154.            {
  155.                    k[0][j]=k[i][j];
  156.                   k[i][j]=new Point(0,0);
  157.                   m[0]++;
  158.                   m[1]--;
  159.             }
  160.            }
  161.     }
  162. }
阅读(866) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~