DIANA算法c++实现

 第一步对具有最大直径的簇中每个点计算平均相异度找出最大的点放入splinter group,其余放在放入splinter group

第二步 在old party里找出到splinter group中点的最近距离 <= 到old party中点的最近距离的点,并将该点加入splinter group

重复第二步的工作,直到没有新的old party中的点分配给splinter group且满足分裂的簇数k,如果没有到达终止条件,则从分裂好的簇中选一个最大的簇按刚才的分裂方法继续分裂

#include <fstream>
#include <sstream>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

struct Point
{
    double x;
    double y;
};


double distance(const Point& a, const Point& b)
{
    return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}

vector<Point> findmaxC(vector<vector<Point>>& clusters)
{
    double max = 0;
    int index = 0;
    for (int i =0;i< clusters.size(); i++)
    {
        double max1 = 0;
        for (int j = 0; j < clusters[i].size(); j++)
        {
            for (int k = j + 1; k < clusters[i].size(); k++)
            {
                double dis = distance(clusters[i][j], clusters[i][k]);
               
                if (max < dis)
                {
                    max1 = dis;
                }
                
            }
        }
        if (max1 > max)
        {
            max1 = max;
            index = i;
        }
    }
    return clusters[index];
}
int findMaxD(vector<Point> cluster)
{
    double max = 0;
    int maxIndex = 0;
    for (int i = 0; i < cluster.size(); i++)
    {
        double avg = 0;
        double dis = 0;
        for (int j = 0; j < cluster.size(); j++)
        {
            if (i != j)
            {
                dis += distance(cluster[i], cluster[j]);
            }
        }
        avg = dis / (cluster.size() - 1);
        if (avg > max)
        {
            max = avg;
            maxIndex = i;
        }
    }
    return maxIndex;
}

void spilt(vector<Point>& cluster, int k,int maxIndex)
{
    int flag = 0;
    vector<Point> splinter;
    vector<Point> oldParty;
    vector<vector<Point>> sum;
  
    splinter.push_back(cluster[maxIndex]);// splinter.push_back[maxIndex]   +1?
    for (int i = 0; i < cluster.size(); i++)
    {
        if (i != maxIndex)
        {
            oldParty.push_back(cluster[i]); //oldParty.push_back i
        }
    }

    sum.push_back(splinter);
    sum.push_back(oldParty);

    while (sum.size() <= k && flag == 0)
    {
        double min = numeric_limits<double>::max();
        int in = 0;
        for (int i = 0; i < sum[1].size(); i++)
        {
            for (int j = 0; j < sum[1].size(); j++)
            {
                if (j != i)
                {
                    double d = distance(sum[1][i], sum[1][j]);
                    if (d < min)
                    {
                        min = d;
                        in = i;                 //min
                    }
                }
            }
             cout << min << endl;
             double min1 = numeric_limits<double>::max();
             int in1 = 0;
             for (int m = 0;m < sum[0].size(); m++)
             {
                 double ds = distance(sum[0][m], sum[1][in]);
                 if (ds < min1)
                 {
                        min1 = ds;
                            //in1 = i;            
                  }
              }
             cout << min1<<endl;
              if (min1 <= min)
              {
                  sum[0].push_back(sum[1][in]);              //要sum[0]
                  sum[1].erase(sum[1].begin() + in);
               }
        }
        flag = 1;
        
    }
    while (sum.size() < k)
    {
        vector<Point> temp=findmaxC(sum);
        int i=findMaxD(temp);
        vector<Point> re;
        re.push_back(temp[i]);
        sum.push_back(re);
        //未完
    }
    for (int i = 0; i < sum.size(); i++)
    {
        cout << "{";
        for (int j = 0; j < sum[i].size(); j++)
        {
            cout << "(" << sum[i][j].x << ", " << sum[i][j].y << ")" <<",";
        }
        cout<<"}" << endl;
   }

}

vector<Point> ReadData(string filename)
{
    vector<Point> data;
    ifstream file(filename);
    if (file.is_open())
    {
        string line;
        while (getline(file, line))
        {
            istringstream iss(line);
            double x, y;
            string token;
            Point point;
            if (getline(iss, token, ',') && istringstream(token) >> point.x &&
                getline(iss, token, ',') && istringstream(token) >> point.y) {
                data.push_back(point);
            }
        }
    }
    else
    {
        cout << "open fail";
    }
    file.close();
    return data;
}

int main()
{
    vector<Point> dataset = ReadData("data1.txt");
    int index=findMaxD(dataset);
    int k;
    cout << "终止条件为几个簇" << endl;
    cin >> k;
    spilt(dataset, k, index);

}
//{ {1.0, 1.0}, {1.0, 2.0}, {2.0, 1.0}, {2.0, 2.0}, {3.0, 4.0}, {3.0, 5.0}, {4.0, .0}, {4.0, 5.0} };

 data1:

data2:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/108951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用DBSyncer实现增量Mysql到Mysql的数据同步_DBSyncer1.2.4版本---数据同步之DBSyncer工作笔记006

之前都是用来postgresql到mysql的同步,需要配置postgresql的复制槽,对于mysq来说,需要配置: mysql启用binlog: https://gitee.com/ghi/dbsyncer/wikis/%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/%E6%97%A5%E5%BF%97%E9%85%8D%E7%BD%AE%EF%BC%88%E6%95%B0%E6%8D%AE%E6%BA%90%EF%B…

软件测试---等价类划分(功能测试)

能对穷举场景设计测试点-----等价类划分 等价类划分 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分分类&#xff1a; 1&#xff09;有效等价类 2&#xff09;无效等价类步骤&#xff1a;1&#xff09;明确需求 2&#xff09;确定有效和无…

景联文科技提供4D-BEV标注工具:提升自动驾驶感知能力的精准数据支持

4D-BEV标注是一种用于自动驾驶领域的数据标注方法。在3D空间的基础上&#xff0c;加入了时间维度&#xff0c;形成了四个维度。这种方法通过精准地跟踪和记录动态对象&#xff08;如车辆、行人&#xff09;的运动轨迹、姿势变化以及速度等信息&#xff0c;全面理解和分析动态对…

05、Python -- 爬取ts文件格式视频思路

目录 第一步&#xff1a;爬取一段5秒视频找url代码结果 第二步&#xff1a;下载整个视频的所有片段代码&#xff1a;结果&#xff1a; 第三步&#xff1a;合成视频安装模块代码&#xff1a;结果 简洁代码代码&#xff1a;结果&#xff1a; 最终代码简洁前代码简洁后代码 思路&a…

HTTP 之 options预请求 nginx 解决跨域 postman调试跨域问题

一、HTTP一共有八种常见请求方法 get&#xff1a;参数在url上&#xff0c;浏览器长度有限制&#xff0c;不安全post&#xff1a;参数不可见&#xff0c;长度不受限制put&#xff1a;上传最新内容到指定位置delete&#xff1a;删除请求的url所表示的资源head&#xff1a;不返回…

VS2022 C# 读取 excel 2023年

今天是2023年6月26日&#xff0c;我有一个excel表要读数据&#xff0c;然后放到winform程序来处理&#xff0c;网上的资料太旧&#xff0c;很多用不起来&#xff0c;试了一个可以使用&#xff0c;记录一下&#xff1a; 一、excel文件后缀需要小写。 二、用VS2022建一个winform…

通过Vue自带服务器实现Ajax请求跨域(vue-cli)

通过Vue自带服务器实现Ajax请求跨域&#xff08;vue-cli&#xff09; 跨域 原理&#xff1a;从A页面访问到B页面&#xff0c;并且要获取到B页面上的数据&#xff0c;而两个页面所在的端口、协议和域名中哪怕有一个不对等&#xff0c;那么这种行为就叫跨域。注意&#xff1a;类…

Linux两条服务器实现相互免密登录

1.准备两台虚拟机&#xff0c;一台充当服务器端&#xff08;server&#xff09;&#xff0c;一台充当客户端&#xff08;client&#xff09; 服务器端&#xff08;server&#xff09;&#xff1a;192.168.75.139 客户端&#xff08;client&#xff09;&#xff1a;192.168.75…

CGAL+QT

先安装CGAL和QT 安装完QT其中MSVC 这两个没配置 1、x32配置选择的是 x64配置选择的是 2、CGAL 5.4.5 - Manual: Using CGAL on Windows (with Visual C) 参数文章配置一些环境变量 3、 测试 新建build 进行cmake QT、Boost、CGAL都自动匹配上了&#xff08;环境变量已经配…

vue+iView 动态侧边栏菜单保持高亮选中

iview 组件在使用过程中&#xff0c;多多少少有一些小坑&#xff0c;本文简单罗列一二&#xff1a; 避坑指南&#xff1a; 关于iview 侧边栏菜单未能展开高亮选中回显问题 应用场景&#xff1a;iview-admin下接入动态菜单后&#xff0c;刷新或链接跳入时回显失效 简单就是两个方…

进一步了解视频美颜SDK:美颜SDK的技术原理

美颜技术在当今的数字世界中变得越来越流行&#xff0c;尤其是在视频直播、社交媒体和视频通话应用中。用户寻求通过美颜效果增强自己的外观&#xff0c;这种需求催生了众多美颜SDK&#xff08;软件开发工具包&#xff09;的出现。这些SDK使开发者能够轻松地将美颜功能集成到他…

Error: no matching distribution found for tensorflow-cpu==2.6.*

目录 install_tensorflow()安装过程中遇到的问题 查找解决方案过程中&#xff1a; 解决办法&#xff1a; install_tensorflow()安装过程中遇到的问题 在服务器上安装tensorflow时&#xff0c;遇到了一个报错信息&#xff1a; 在网上找到一个类似的错误&#xff08;TensorFlow…

NlogPrismWPF

文章目录 Nlog&Prism&WPF日志模块实现原理添加配置注入服务应用测试其他模块怎么调用&#xff1f; Nlog&Prism&WPF 日志模块 介绍了为WPF框架Prism注册Nlog日志服务的方法 实现原理 无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着…

腾讯云轻量服务器地域选择教程,一篇文章就够了

腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置&#xff0c;如上海、广州和北京等地域&#xff0c;如何选择地域&#xff1f;腾讯云百科txybk.com建议地域选择遵循就近原则&#xff0c;用户距离轻量服务器地域越近&#xff0c;网络延迟越低&#xff0c;速度就越…

66 内网安全-域横向批量atschtasksimpacket

目录 演示案例:横向渗透明文传递at&schtasks 案例2-横向渗透明文HASH传递atexec-impacket案例3-横向渗透明文HASH传递批量利用-综合案例5-探针主机域控架构服务操作演示 传递攻击是建立在明文和hash值的一个获取基础上的攻击&#xff0c;也是在内网里面常见协议的攻击&…

ZKP7.1 Polynomial Commitments Based on Error-correcting Codes (Background)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 7: Polynomial Commitments Based on Error-correcting Codes (Yupeng Zhang) Recall: common paradigm for efficient SNARK A polynomial commitment scheme A polynomial interactive oracle proof (IOP) SNARK for gene…

Spring-声明式事务

声明式事务 一、简介1、准备工作2、测试 二、声明式事务概念1、编程式事务2、声明式事务3、基于注解的声明式事务1.测试无事务情况2.加入事务①Transactional注解标识的位置②事务属性&#xff1a;只读③事务属性&#xff1a;超时④事务属性&#xff1a;回滚策略⑤事务属性&…

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】 课本里章节里所有蓝色字体的思维导图

基于springboot,vue校园社团管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本系…

共用体开发案例

有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一个表格来处理。 #include <stdio.h>struct Person {char name[32];int age;char zhiYe;char addr[32];union {int class;…