• AGENS算法c++实现


     cluster二维数组存放数据的编号,每次计算两个簇的距离,找出距离最近的,将其中一个簇的编号加入另一个编号的一维序列中,再将这个编号清除,之后再循环cluster。

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. struct Point
    7. {
    8. double x;
    9. double y;
    10. };
    11. double distance(const Point& a, const Point& b)
    12. {
    13. double x = a.x - b.x;
    14. double y = a.y - b.y;
    15. return sqrt(x * x + y * y);
    16. }
    17. vectorint>> agens(const vector& data,int k)
    18. {
    19. int n = data.size();
    20. vectorint>> cluster;
    21. for (int i = 0; i < n; i++)
    22. {
    23. cluster.push_back({ i });
    24. }
    25. while (cluster.size() > k)
    26. {
    27. int index_i = 0;
    28. int index_j = 1;
    29. double min = distance(data[cluster[0][0]], data[cluster[1][0]]);
    30. for (int i = 0; i < cluster.size(); i++) //找出距离最近的两个簇
    31. {
    32. for (int j = i + 1; j < cluster.size(); j++)
    33. {
    34. double dis = distance(data[cluster[i][0]], data[cluster[j][0]]);
    35. if (dis < min)
    36. {
    37. index_i = i;
    38. index_j = j;
    39. min = dis;
    40. }
    41. }
    42. }
    43. cluster[index_i].insert(cluster[index_i].end(), cluster[index_j].begin(), cluster[index_j].end());
    44. cluster.erase(cluster.begin() + index_j);
    45. }
    46. return cluster;
    47. }
    48. vector ReadData(string filename)
    49. {
    50. vector data;
    51. ifstream file(filename);
    52. if (file.is_open())
    53. {
    54. string line;
    55. while (getline(file, line))
    56. {
    57. istringstream iss(line);
    58. double x, y;
    59. string token;
    60. Point point;
    61. if (getline(iss, token, ',') && istringstream(token) >> point.x &&
    62. getline(iss, token, ',') && istringstream(token) >> point.y) {
    63. data.push_back(point);
    64. }
    65. /*if (iss >> x >> y)
    66. {
    67. data.push_back({ x, y });
    68. }*/
    69. }
    70. }
    71. else
    72. {
    73. cout << "open fail";
    74. }
    75. file.close();
    76. return data;
    77. }
    78. int main()
    79. {
    80. //vector Data = { {1, 1}, {1, 2}, {2, 1}, {2,2}, {3, 4},{3,5} ,{4,4} ,{4,5} };
    81. vector Data = ReadData("data2.txt");
    82. int k;
    83. cin >> k;
    84. vectorint>> labels;
    85. labels=agens(Data, k);
    86. for (const vector<int>& row : labels)
    87. {
    88. cout << "{";
    89. int size = row.size();
    90. for (int i = 0; i < size; i++)
    91. {
    92. cout << row[i] + 1;
    93. if (i != size - 1)
    94. {
    95. cout << ",";
    96. }
    97. }
    98. cout << "}";
    99. }
    100. }

    关键在于理解 distance(data[cluster[i][0]], data[cluster[j][0]]);

    结果:

    数据1:注释部分

    数据2:data2.txt

  • 相关阅读:
    使用mybatis拦截器模糊查询统一处理%_字符
    创建一个用户test且使用testtab表空间及testtemp临时表空间并授予其权限,密码随意
    H3C基本配置
    Dubbo-聊聊Dubbo协议
    【小笔记】当一个算法性能不满意,可能是这几方面的原因
    实验室常用滤器分类
    petite-vue源码剖析-从静态视图开始
    Streamlit 数据科学必备工具
    如何对视频链接进行性能测试
    修饰符.sync的用法
  • 原文地址:https://blog.csdn.net/m0_70732442/article/details/134064438