AGENS算法c++实现

news2025/1/13 3:16:29

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

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

struct	Point
{
	double x;
	double y;
};

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

vector<vector<int>> agens(const vector<Point>& data,int k)
{
	int n = data.size();
	vector<vector<int>> cluster;
	for (int i = 0; i < n; i++)
	{
		cluster.push_back({ i });
	}

	while (cluster.size() > k)
	{
		int index_i = 0;
		int index_j = 1;
		double min = distance(data[cluster[0][0]], data[cluster[1][0]]);
		for (int i = 0; i < cluster.size(); i++)						//找出距离最近的两个簇
		{
			for (int j = i + 1; j < cluster.size(); j++)
			{
				double dis = distance(data[cluster[i][0]], data[cluster[j][0]]);	
				if (dis < min)
				{
					index_i = i;
					index_j = j;
					min = dis;
				}
			}
		}
		cluster[index_i].insert(cluster[index_i].end(), cluster[index_j].begin(), cluster[index_j].end());
		cluster.erase(cluster.begin() + index_j);
	}
	return cluster;

}

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);
			}
			/*if (iss >> x >> y)
			{
				data.push_back({ x, y });
			}*/

		}
	}
	else
	{
		cout << "open fail";
	}
	file.close();
	return data;
}
int main()
{
	//vector<Point> Data = { {1, 1}, {1, 2}, {2, 1}, {2,2}, {3, 4},{3,5} ,{4,4} ,{4,5} };
	vector<Point> Data = ReadData("data2.txt");
	int k;
	cin >> k;
	vector<vector<int>> labels;
	labels=agens(Data, k);
	for (const vector<int>& row : labels)
	{
		cout << "{";
		int size = row.size();
		for (int i = 0; i < size; i++)
		{
			cout << row[i] + 1;
			if (i != size - 1)
			{
				cout << ",";
			}
		}
		cout << "}";
	}

}

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

结果:

数据1:注释部分

数据2:data2.txt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux小程序——进度条

1.前置知识说明 ①回车换行 首先我们需要知道&#xff0c;回车与换行是两个概念&#xff0c;在C语言中使用"\n"时&#xff0c;默认使用的是回车换行&#xff0c;举一个简单的例子&#xff0c;在以前写作文时&#xff0c;我们在某一行写到最后一个字时&#xff0c;我…

Linux C语言开发-D9输入输出

C语言无I/O语句&#xff0c;I/O操作由函数实现 #include <stdio.h> 字符输出函数:putchar(c) 参数&#xff1a;c为字符常量、变量或表达式 功能&#xff1a;把字符c输出到显示屏上 返回值&#xff1a;正常&#xff0c;为显示的代码值 格式输出函数:printf("格式控…

10.25verilog复习,代码规范复盘,触发器复习

verliog复习 1.模块的输入输出(reg与wire) 输入是线性&#xff0c;wire, 输出较复杂需要之前的状态&#xff0c;不仅仅是由当下输入来的信号的与或非组合而成的&#xff0c;需要保存之前状态的&#xff0c;输出类型是reg。 比如计数器&#xff0c;需要在之前计数的基础上再…

排列数字(深度优先搜索) C++实现

题目 代码 #include<iostream> using namespace std; const int N1010; int path[N],n; bool flag[N];void dfs(int u){if(un){for(int i0;i<n;i) printf("%d ",path[i]);puts("");return ;}for(int i1;i<n;i){if(!flag[i]){path[u]i;flag[i…

Postman的高级使用,傻瓜式学习【下】

目录 前言 1、全局变量、环境变量 1.1、概念&#xff1a; 1.2、如何设置全局变量、环境变量 1.3、获取全局变量、环境变量 1.4、案例1&#xff1a;手动设置变量&#xff0c;请求参数获取 1.5、案例2&#xff1a;代码设置变量&#xff0c;代码获取变量 2、Postman读取外部…

jvm摘要

第 2 章 Java 内存区域与内存溢出异常 2.2 运行时数据区域 程序计数器-线程私有:是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 程序计数器是唯一一个没有规定任何OutOfMemoryError 情况的区域。 Java 虚拟机栈-线程私有:用于执行Java …

设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《适配器模式》 下一篇《装饰器模式》 简介&#xff1a; 桥接模式&#xff0c;它是一种结构型设计模式&#xff0c;它的主要目的是将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化。…

【码银送书第九期】《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》

计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术&#xff0c;也在不断地影响和改变着各个行业。 如今&#xff0c;我们正在见证人工智能技术的…

九方面解读国家数据局成立,可交易数据的五大特性探讨

​ 10月25日&#xff0c;国家数据局正式揭牌&#xff0c;标志着我国数据管理进入了新的阶段。国家数据局负责协调推进数据基础制度建设&#xff0c;统筹数据资源整合共享和开发利用&#xff0c;统筹推进数字中国、数字经济、数字社会规划和建设等&#xff0c;由国家发展和改革…

LeetCode刷题---简单组(四)

文章目录 &#x1f352;题目一 27. 移除元素&#x1f352;解法一&#x1f352;题目二 28. 找出字符串中第一个匹配项的下标&#x1f352;解法一&#x1f352;题目三 35. 搜索插入位置&#x1f352;解法一 &#x1f352;题目一 27. 移除元素 给你一个数组 nums 和一个值 val&…

MyBatis-Plus代码自动生成

前言 这是一段使用 MyBatis-Plus 自动生成代码的示例代码。MyBatis-Plus 是一个优秀的 ORM 框架&#xff0c;它在 MyBatis 的基础上进行了扩展和增强&#xff0c;提供了更加便捷、高效的数据库操作方式。在实际开发中&#xff0c;我们通常需要编写大量的 CRUD 操作代码&#x…

OpenCV官方教程中文版 —— 2D 直方图

OpenCV官方教程中文版 —— 2D 直方图 前言一、介绍二、OpenCV 中的 2D 直方图三、Numpy 中 2D 直方图四、绘制 2D 直方图 前言 本节我们会学习如何绘制 2D 直方图&#xff0c;我们会在下一节中使用到它。 一、介绍 在前面的部分我们介绍了如何绘制一维直方图&#xff0c;之…

TeamViewer

爱情就像两个拉皮筋的人&#xff0c;受伤的总是不愿放手的那一个&#xff01; TeamViewer – 远程连接软件 点击下载 电脑版就下载电脑 安卓版就下载安卓 苹果版就下苹果

bug:Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题

bug&#xff1a;Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题 1 解决 先说解决办法&#xff1a; 将下载的crx重命名为xxx.zip&#xff0c;然后解压打开chrome的开发者模式 点击加载已解压的应用程序&#xff0c;然后选择我们解压后的文件夹即可 安装成…

MyBatisPlus自动填充

文章目录 MyBatisPlus自动填充应用场景在实体类里面规定要填充的字段写处理器测试 MyBatisPlus自动填充 应用场景 我们往数据库里面插入一条记录&#xff0c;或者是更新一条记录的时候&#xff0c;往往需要有插入时间和更新时间&#xff0c;如果每条sql语句里面都这样写&…

Spring使用注解进行注入

目录 前言 一、属性注入 1.1 属性注入的优缺点分析 二、Setter注入 2.1 Setter注入优缺点分析 三、构造方法注入 3.1 构造注入的优缺点 四、Qualifier注解 五、Resource注解 六、Resource注解与Autowired注解的区别 前言 在之前我们就已经了解过了Spring依赖注入的方式&#x…

word页脚设置,页脚显示第几页共有几页设置步骤

word页脚设置&#xff0c;页脚显示第几页共有几页设置步骤&#xff1a; 具体步骤&#xff1a; 步骤1&#xff1a; 步骤1.1选择页脚---空白页脚 步骤1.2&#xff0c;在"[在此处键入]"&#xff0c;直接输入你需要的格式&#xff0c;如 “第页/共页” 步骤1.3选择第“…

基于ssm服装购物系统

功能如图所示 摘要 基于SSM框架的服装购物系统研究在当今数字化时代具有更为广泛的重要意义。首先&#xff0c;电子商务已成为商业领域的重要发展方向&#xff0c;尤其在全球范围内&#xff0c;服装零售商面临着不断增长的在线购物需求。这种研究能够帮助服装零售商迅速适应市场…

Failed to prepare the device for development

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

班级管理神器

哈喽&#xff0c;亲爱的小红书教育朋友们&#xff01;今天来分享一个重磅好物&#xff1a;班级查询系统&#xff01;是的&#xff0c;你没有听错&#xff0c;让我们的孩子们告别信息混乱&#xff0c;告别手动统计&#xff0c;迎接高效、智能的班级管理新时代&#xff01; 班级查…