- 浏览: 612258 次
- 来自: ...
-
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
一、什么是并查集
并查集:即不相交集合。一种简单的用途广泛的集合,实现了较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。
并查集实现方法:
每个集合用一棵“有根树”表示;
定义数组 int[] father
int[] rank
father[i]=i,则i表示本集合且i是集合对应的树的根
father[i]=j,则表示j是i的父节点
rank[i]代表集合i的秩(比如子孙的多少或树的高度等),用于合并集合,秩小的合并到秩大的。
二、并查集的精髓(即它的三种操作):
1、Make_Set() 把每一个元素初始化为一个集合
初始化后每一个元素的父亲节点是它本身。
void Make_Set() {
for(int i=0;i<father.length;i++){
father[i] = i; //根据实际情况指定的父节点可变化
rank[i] = 0; //根据实际情况初始化秩也有所变化
}
}
2、Find_Set(x) 查找一个元素所在的集合
查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!
判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。
合并两个集合,也是使一个集合的祖先成为另一个集合的祖先
//递归实现找祖先
int Find_Set(int x){
if (x != father[x]){
father[x] = Find_Set(father[x]);//这个回溯时的压缩路径是精华,将查找路径的所有节点都指向根节点
}
return father[x];
}
//循环实现找祖先
int Find_Set(int x)
{
int root=x;
while(father[root]!=root)
root=father[root];
return root;
}
//循环实现找祖先,路径压缩
//每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快
//第一步,找到根节点;第二步,修改查找路径上的所有节点,将它们都指向根结点
int Find_Set(int x){
int k,root;
root=x;
while(root!=father[root]) //循环找x的根
root=father[root];
while(x!=root)//本循环修改查找路径中的所有节点使其指向根节点---压缩
{
k=father[x];
father[x]=root;//指向根节点
x=k;
}
return x;
}
路径压缩示意图:
3、Union(x,y) 合并x,y所在的两个集合
合并两个不相交集合操作很简单:
利用Find_Set找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。
void Union(int x, int y){//合并集合的条件要试具体问题而定,这里将秩小的合并到秩大的。
x = Find_Set(x);
y = Find_Set(y);
if (x == y) return;
if (rank[x] > rank[y]) {
father[y] = x;
} else if (rank[x] < rank[y]) {
father[x] = y;
} else {
rank[y]++;
father[x] =y;
}
}
三、并查集的优化
1、Find_Set(x)时路径压缩
寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢?
答案是肯定的,这就是路径压缩,即当我们经过"递推"找到祖先节点后,"回溯"的时候顺便将它的子孙节点都直接指向祖先,
这样以后再次Find_Set(x)时复杂度就变成O(1)了。
2、Union(x,y)时按秩合并
即合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会相对较小。
实例一:判断亲戚关系.
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
先输入10个人(编号从1-10)及7组亲戚关系,然后输入3组数据,问这三组数据是不是亲戚关系?
输入
10 7
2 4
5 7
1 3
8 9
1 2
5 6
2 3
3
3 4
7 10
8 9
输出
Yes
No
Yes
分析:其实本题只是一个对分离集合(并查集)操作的问题。我们可以给每个人建立一个集合,集合的元素值有他自己,表示最开始时他不知道任何人是它的亲戚。以后每次给出一个亲戚关系a, b,则a和他的亲戚与b和他的亲戚就互为亲戚了,将a所在集合与b所在集合合并。
最后我们得到3个集合{1,2,3,4}, {5,6,7}, {8,9},于是判断两个人是否亲戚的问题就变成判断两个数是否在同一个集合中的问题。
实例二:
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。
Input
输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。
Output
对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
Sample Input
6 8 5 3 5 2 6 4
5 6 0 0
8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0
3 8 6 8 6 4
5 3 5 6 5 2 0 0
-1 -1
Sample Output
Yes
Yes
No
解题思路:题目意思是判断是不是连通无环的图,使用并查集合并所有顶点.
1》判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。
2》判断连通的时候,只要判断根节点数为1即可。
注意:当输入的这组数据只有 0 0 时,依然是满足条件的,即应输出 "Yes"。
并查集:即不相交集合。一种简单的用途广泛的集合,实现了较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。
并查集实现方法:
每个集合用一棵“有根树”表示;
定义数组 int[] father
int[] rank
father[i]=i,则i表示本集合且i是集合对应的树的根
father[i]=j,则表示j是i的父节点
rank[i]代表集合i的秩(比如子孙的多少或树的高度等),用于合并集合,秩小的合并到秩大的。
二、并查集的精髓(即它的三种操作):
1、Make_Set() 把每一个元素初始化为一个集合
初始化后每一个元素的父亲节点是它本身。
void Make_Set() {
for(int i=0;i<father.length;i++){
father[i] = i; //根据实际情况指定的父节点可变化
rank[i] = 0; //根据实际情况初始化秩也有所变化
}
}
2、Find_Set(x) 查找一个元素所在的集合
查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!
判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。
合并两个集合,也是使一个集合的祖先成为另一个集合的祖先
//递归实现找祖先
int Find_Set(int x){
if (x != father[x]){
father[x] = Find_Set(father[x]);//这个回溯时的压缩路径是精华,将查找路径的所有节点都指向根节点
}
return father[x];
}
//循环实现找祖先
int Find_Set(int x)
{
int root=x;
while(father[root]!=root)
root=father[root];
return root;
}
//循环实现找祖先,路径压缩
//每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快
//第一步,找到根节点;第二步,修改查找路径上的所有节点,将它们都指向根结点
int Find_Set(int x){
int k,root;
root=x;
while(root!=father[root]) //循环找x的根
root=father[root];
while(x!=root)//本循环修改查找路径中的所有节点使其指向根节点---压缩
{
k=father[x];
father[x]=root;//指向根节点
x=k;
}
return x;
}
路径压缩示意图:

3、Union(x,y) 合并x,y所在的两个集合
合并两个不相交集合操作很简单:
利用Find_Set找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。
void Union(int x, int y){//合并集合的条件要试具体问题而定,这里将秩小的合并到秩大的。
x = Find_Set(x);
y = Find_Set(y);
if (x == y) return;
if (rank[x] > rank[y]) {
father[y] = x;
} else if (rank[x] < rank[y]) {
father[x] = y;
} else {
rank[y]++;
father[x] =y;
}
}
三、并查集的优化
1、Find_Set(x)时路径压缩
寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢?
答案是肯定的,这就是路径压缩,即当我们经过"递推"找到祖先节点后,"回溯"的时候顺便将它的子孙节点都直接指向祖先,
这样以后再次Find_Set(x)时复杂度就变成O(1)了。
2、Union(x,y)时按秩合并
即合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会相对较小。
实例一:判断亲戚关系.
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
先输入10个人(编号从1-10)及7组亲戚关系,然后输入3组数据,问这三组数据是不是亲戚关系?
输入
10 7
2 4
5 7
1 3
8 9
1 2
5 6
2 3
3
3 4
7 10
8 9
输出
Yes
No
Yes
分析:其实本题只是一个对分离集合(并查集)操作的问题。我们可以给每个人建立一个集合,集合的元素值有他自己,表示最开始时他不知道任何人是它的亲戚。以后每次给出一个亲戚关系a, b,则a和他的亲戚与b和他的亲戚就互为亲戚了,将a所在集合与b所在集合合并。
最后我们得到3个集合{1,2,3,4}, {5,6,7}, {8,9},于是判断两个人是否亲戚的问题就变成判断两个数是否在同一个集合中的问题。
import java.util.Scanner; public class Main{ int[] father; int[] rank; public Main(){ } public void go(){ Scanner in=new Scanner(System.in); int n=in.nextInt(); int m=in.nextInt(); father=new int[n+1]; rank=new int[n+1]; Make_Set(); for(int i=1;i<=m;i++){ int a=in.nextInt(); int b=in.nextInt(); int x=Find_Set(a); int y=Find_Set(b); Union(x,y); } //for(int i=1;i<=n;i++) // System.out.print("father["+i+"]="+father[i]+" "); int k=in.nextInt(); for(int i=1;i<=k;i++){ int x=in.nextInt(); int y=in.nextInt(); if(Find_Set(x)==Find_Set(y)) System.out.println("Yes"); else System.out.println("No"); } } private void Make_Set() { for(int i=0;i<father.length;i++){ father[i] = i; //根据实际情况指定的父节点可变化 rank[i] = 0; //根据实际情况初始化秩也有所变化 } } private int Find_Set(int x){ if (x != father[x]){ father[x] = Find_Set(father[x]);//这个回溯时的压缩路径是精华,将查找路径的所有节点都指向根节点 } return father[x]; } void Union(int x, int y){ int f1 = Find_Set(x); int f2 = Find_Set(y); if(f1!=f2) father[f1]=f2; } public static void main(String args[]){ Main m=new Main(); m.go(); } }
实例二:
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。

Input
输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。
Output
对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
Sample Input
6 8 5 3 5 2 6 4
5 6 0 0
8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0
3 8 6 8 6 4
5 3 5 6 5 2 0 0
-1 -1
Sample Output
Yes
Yes
No
解题思路:题目意思是判断是不是连通无环的图,使用并查集合并所有顶点.
1》判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。
2》判断连通的时候,只要判断根节点数为1即可。
注意:当输入的这组数据只有 0 0 时,依然是满足条件的,即应输出 "Yes"。
import java.util.Scanner; import java.io.*; public class Main { private final static int max = 100001; private int[] f; private int[] set; private int[] height; private int flag; public Main(){ set = new int[max]; height = new int[max]; f = new int[max]; flag = 1; } // 初始化集合 private void init() { for (int i = 1; i < max; i++) { set[i] = i; f[i] = 0; height[i] = 1; } } // 查找x属于哪个集合,循环实现,防暴栈. private int find(int x) { while (set[x] != x) x = set[x]; return x; } // 合并集合 private void merge(int a, int b) { if (height[a] < height[b]) set[a] = b; else if (height[a] > height[b]) set[b] = a; else { set[b] = a; height[a]++; } } public void go() { Scanner in= new Scanner(System.in); while (true) { int a =in.nextInt(); int b = in.nextInt(); if (a == -1 && b == -1)break; if (a == 0 && b == 0) {System.out.println("Yes");continue;} init(); f[a] = f[b] = 1;//标记a,b已使用 flag=1; a = find(a); b = find(b); if (a != b) merge(a, b);//合并 else //存在环 flag = 0; while (true) { a = in.nextInt(); b =in.nextInt(); if (a == 0 && b == 0) break; a = find(a); b = find(b); if(a!=b) merge(a, b); else //存在环 flag = 0; f[a] = f[b] = 1; } int k = 0; for (int i = 1; i < max; i++) {//统计树根的数目 if (f[i]==1 && set[i] == i) k++; if(k>1){flag = 0;break;} } if (flag==1) System.out.println("Yes"); else System.out.println("No"); } } public static void main(String args[]){ Main m=new Main(); m.go(); } }
发表评论
-
龙抬头
2014-11-10 15:06 668... -
求推箱子的最小步数(java)
2014-05-06 08:32 3816题目(poj1475):推箱子,要求箱子移动步骤最小。如图:T ... -
图的深搜+回溯练习题:POJ2197
2013-01-18 15:53 1710POJ 2197题意: 给定n个城市及其之间的距离,以及距 ... -
求二叉树上任意两个节点的最近公共父节点
2013-01-09 10:24 2432北大百练题2756: 如上图所示,由正整数1, 2 ... -
JAVA判断二叉树是否是二叉平衡树
2013-01-07 18:59 2005import java.util.*; ... -
田忌赛马: POJ 2287(贪心解法)
2013-01-03 19:24 3093POJ 2287问题描述: 你一定听过田忌赛马的故事吧? ... -
图的练习题(有解答)
2012-12-27 22:23 26841. 填空题 ⑴ 设无向图G ... -
大顶堆应用:POJ2010
2012-12-23 20:59 1943POJ2010题意: 奶牛学校招生,c头奶牛报名,要选 ... -
二维树状数组学习之二:练习POJ 1195
2012-12-12 21:40 1413接前文:二维树状数组学习之一:彻底理解http://128kj ... -
二维树状数组学习之一:彻底理解
2012-12-12 20:54 2520当要频繁的对数组元素进行修改,同时又要频繁的查询数组内 ... -
邻接表实现图的广搜和深搜(java模板)
2012-12-11 17:04 2481//邻接表实现图的广搜和深搜(java模板) impor ... -
图的深搜+树状数组练习 POJ 3321(JAVA)
2012-12-11 11:13 1879关于树状数组:参看:http://128kj.iteye.co ... -
邻接矩阵实现图的广搜和深搜(java模板)
2012-12-10 20:37 1957经常要用到,放到这里备用!! //邻接矩阵实现图的广搜和深搜 ... -
树状数组练习:POJ 3067
2012-12-09 17:10 1885关于树状数组,参看:http://128kj.iteye.co ... -
树状数组练习:POJ 2481(JAVA)
2012-12-08 18:11 1840关于树状数组,请参考:http://128kj.iteye.c ... -
初步了解树状数组
2012-12-07 14:18 1823一、树状数组是干什么的? 平常我们会遇到一些对数组进 ... -
线段树求逆序数(离散化)POJ 2299
2012-12-06 08:25 2157POJ2299题意: 给出长度为n的序列,每次只能交换 ... -
利用线段树求逆序数(JAVA)
2012-12-04 22:46 2628设A[1…n]是一个包含n个不同数的数组。如果在i< ... -
线段树入门学习(三)懒操作(兼解POJ1823) JAVA
2012-12-02 15:37 2172继续上文"线段树入门学习(二)" ht ... -
线段树入门学习(二)(兼解POJ3468) JAVA
2012-11-30 16:55 2598继续上文http://128kj.iteye. ...
相关推荐
内容概要:本文详细介绍了COMSOL软件中三种常用的焊接热源模型:双椭球热源、高斯旋转体热源和柱状体热源。双椭球热源适用于电弧焊,通过将热源分为前后两个半椭球,能够更好地模拟熔池的温度梯度变化;高斯旋转体热源适合激光焊,采用旋转对称的高斯函数描述热流密度分布;柱状体热源则用于电阻焊等均匀加热场景,尽管物理上不够精确,但计算速度快。文中还提供了具体的MATLAB代码实现,并分享了参数调试的经验和注意事项。 适合人群:从事焊接仿真研究的技术人员、研究生以及相关领域的研究人员。 使用场景及目标:帮助用户选择合适的热源模型进行焊接仿真,确保仿真结果的准确性。同时,提供实用的参数调试技巧,避免常见错误,提高仿真的效率和可靠性。 其他说明:强调了不同热源模型的特点及其适用场景,提醒用户根据实际情况灵活调整参数,并结合实验数据进行验证。
带你去认识RFID技术
内容概要:本文深入探讨了开关磁阻电机(SRM)的仿真方法和技术细节,涵盖了从Matlab仿真模型搭建到Maxwell有限元仿真的全过程。首先介绍了SRM的基本参数设置及其在Simulink中的电磁关系建模,接着详细讲解了两种常见的控制策略:电流斩波控制(CCC)和角度位置控制(APC)。随后讨论了Maxwell中SRM几何结构的精确建模、材料属性设置及网格划分技巧,并阐述了转矩分配函数(TSF)和直接转矩控制(DTC)的具体实现。最后分享了一些实用的仿真优化建议,如响应面法和遗传算法的应用。 适合人群:从事电机控制系统设计的研发工程师、高校师生及相关领域的研究人员。 使用场景及目标:适用于希望深入了解SRM工作原理并掌握其仿真技能的专业人士;旨在帮助读者构建高效的SRM仿真平台,提高电机性能,降低开发成本。 其他说明:文中提供了大量MATLAB代码片段和Maxwell建模指导,便于读者理解和实践。此外,还提到了许多实际操作中的注意事项和常见错误,有助于避免不必要的弯路。
一键打开或关闭Windows 10 Enterprise G 麦克风或摄像头
https://github.com/AlfredXiangWu/LightCNN 预训练模型
内容概要:本文深入探讨了电-气-热综合能源系统的节点能价计算方法,重点介绍了如何将碳排放成本纳入系统优化中。作者通过复现论文中的模型,展示了电、气、热潮流的耦合实现,并提出了以综合能源系统总运行成本和碳排放成本最小为目标函数的优化调度模型。文中详细解释了模型的关键组成部分,如目标函数的设计、多能流优化以及节点能价的计算方法。通过多个实例验证,证明了该模型的有效性和通用性。 适合人群:对综合能源系统建模感兴趣的科研人员和技术开发者,尤其是希望深入了解电-气-热耦合系统及碳排放成本优化的人群。 使用场景及目标:适用于需要进行综合能源系统优化的研究和工程项目,旨在降低碳排放并优化能源系统的总成本。具体应用场景包括但不限于电力系统、天然气系统和热力系统的联合优化调度。 其他说明:文章不仅提供了详细的代码实现和模型解析,还讨论了模型的实际应用效果和潜在改进方向。通过具体的案例分析,展示了模型在不同规模和类型的能源系统中的表现,为后续研究提供了宝贵的参考。
前端分析-2023071100789s+12
内容概要:本文详细介绍了如何在MATLAB环境中构建一个结合卷积神经网络(CNN)、长短时记忆网络(LSTM)以及SE注意力机制的混合模型用于时序数据分类。首先进行数据预处理,确保输入数据符合模型要求。接着,通过CNN提取空间特征,再由SE模块评估特征的重要性,最后交给LSTM处理时间序列信息。文中提供了完整的代码实现步骤,并针对可能出现的问题给出了优化建议。实验结果显示,在EEG信号分类和其他工业应用场景中,该模型相较于传统方法能够提高分类精度。 适合人群:有一定机器学习基础并对深度学习感兴趣的科研工作者和技术开发者。 使用场景及目标:适用于需要处理带有时间和空间相关性的多维时序数据的任务,如医疗健康监测、金融趋势预测、机械故障预警等领域。目的是为了获得更高的分类准确性,同时增强模型的可解释性和鲁棒性。 其他说明:作者强调了在实际应用过程中应注意的一些细节,例如正确设置输入数据的维度、选择合适的超参数(如学习率、批大小)、以及考虑是否添加正则化项来避免过拟合等问题。此外,还提到了一些实用的小贴士,像使用动态学习率调度器加快收敛速度等。
内容概要:本文介绍了利用Matlab/Simulink进行风电调频与风储联合仿真的方法。针对传统时域仿真耗时的问题,提出了一种基于频域模型的方法,实现了快速高效的仿真。文中详细描述了虚拟惯性控制和储能下垂控制的具体实现方式及其对系统频率稳定性的影响。通过频域模型,将复杂的微分方程转化为简单的矩阵运算,显著提高了仿真速度。同时,加入了SOC(荷电状态)管理和滑动平均滤波,确保了储能系统的安全可靠运行。实验结果显示,在相同的硬件条件下,频域模型的仿真速度比传统时域模型快了近十倍,且频率偏差明显减小。 适合人群:从事电力系统仿真、风电调频研究的专业人士和技术爱好者。 使用场景及目标:适用于需要快速验证风电调频控制策略的研究人员和工程师。主要目标是在保证仿真精度的同时大幅提高仿真速度,为风电并网提供技术支持。 其他说明:本文提供的模型专注于调频性能分析,不涉及风机内部动态细节。对于更详细的风机模型,作者提供了进一步的参考资料。
内容概要:本文探讨了小模型在AI行业中逐渐展现出与大模型相媲美性能的现象,分析了大模型和小模型各自的优劣势。大模型虽然在准确性、通用性上有优势,但也面临高成本、低效性、隐私保护等问题;小模型则以高效性、低成本、强隐私保护和高可解释性等优点崭露头角。文中列举了微软Phi-3系列、Google Gemma、Anthropic Claude 3 Haiku和Meta Llama 3等小模型的成功案例,展示了小模型在不同领域的应用潜力。随着技术进步、应用需求增长及政策推动,AI行业正逐步向轻量化转型,但仍需面对性能瓶颈、数据获取等挑战。文章最后展望了小模型与大模型结合的发展趋势,并强调了AI技术发展中伦理和法律问题的重要性。; 适合人群:对AI技术发展趋势感兴趣的从业者、研究人员、企业决策者以及相关领域的学生。; 使用场景及目标:①了解AI行业中大模型与小模型的特点和发展现状;②掌握小模型在各个领域的具体应用场景及其优势;③思考AI技术轻量化转型对企业和社会的影响。; 其他说明:文章指出AI行业的轻量化时代已经悄然来临,小模型凭借其独特的优势将在更多领域发挥作用。同时提醒读者关注AI技术发展中的伦理和法律问题,鼓励大家积极参与到这一变革中来。
内容概要:本文详细介绍了基于西门子S7-1200 PLC的物料分拣系统的设计与仿真。系统采用三个光电传感器进行物料检测和颜色识别,两个推料气缸用于分拣,以及一个传送带电机驱动物料传输。核心逻辑由梯形图和SCL语言编写,涵盖初始化、传感器处理、气缸动作控制和WinCC动画同步等功能。文中强调了急停连锁、颜色传感器信号保持时间和气缸动作延迟等关键细节,并提供了详细的代码片段和调试建议。此外,还介绍了WinCC动画的实现方法,确保仿真效果逼真。 适合人群:初学者和有一定经验的PLC程序员,尤其是希望深入了解PLC控制系统设计和仿真的技术人员。 使用场景及目标:①帮助读者掌握PLC编程的基本技能,特别是S7-1200系列PLC的应用;②提供完整的物料分拣系统仿真案例,便于理解和实践;③通过WinCC动画展示,增强对工业自动化系统的直观认识。 其他说明:本文提供的程序包可在GitHub上获取,建议使用TIA Portal V17打开。仿真过程中应注意变量绑定和时间参数的调整,以确保系统稳定性和动画同步。
内容概要:本文详细介绍了基于邻域粗糙集(NRS)、引力搜索算法(GSA)和支持向量机(SVM)的变压器故障诊断方法。首先,邻域粗糙集用于特征约简,减少数据维度并提高后续算法的效率。其次,引力搜索算法用于优化SVM的参数,找到最优的惩罚因子C和核函数参数gamma。最后,使用优化后的SVM对变压器故障进行分类诊断。这种方法显著提升了变压器故障诊断的准确性和效率,为电力系统的稳定运行提供了有力保障。 适合人群:从事电力系统维护、数据分析以及机器学习领域的研究人员和技术人员。 使用场景及目标:适用于需要高精度变压器故障诊断的电力系统,旨在提高故障检测的准确性,减少误报率,确保电力系统的安全稳定运行。 其他说明:文中提供了具体的Python代码示例,帮助读者更好地理解和应用这些技术。同时强调了特征工程和参数优化的重要性,指出不同的数据分布可能需要调整相关参数以获得最佳效果。
内容概要:本文详细介绍了使用MATLAB 2019b进行双馈风机的最大功率追踪(MPPT)、变速恒频以及直流母线稳压控制仿真的方法和技巧。首先,文章展示了双馈电机通过背靠背变流器连接电网的整体模型架构,分别阐述了转子侧和网侧变流器的功能及其核心控制算法。对于MPPT部分,采用了经典爬山法,并讨论了功率变化方向判断周期和步长参数的影响。接着,深入探讨了变速恒频控制中转子侧变流器的作用,强调了PI参数的选择和解耦补偿的重要性。最后,针对直流母线稳压控制,提出了梯形积分法和前馈补偿的应用,确保电压波动最小化。此外,文中还提供了多个调试技巧和注意事项,如仿真步长、PWM生成、锁相环参数调整等。 适合人群:从事风电领域研究的技术人员、研究生及以上学历的学生,尤其是那些希望深入了解双馈风机控制原理和MATLAB仿真应用的人群。 使用场景及目标:适用于风电系统的开发与优化项目,旨在提高双馈风机的效率和稳定性。具体目标包括实现高效的MPPT算法、稳定的变速恒频控制以及可靠的直流母线稳压机制。 其他说明:文中不仅包含了详细的数学公式和代码片段,还有丰富的实践经验分享,帮助读者更好地理解和解决实际工程中的问题。同时,作者提醒了一些常见的仿真错误,如变流器开关频率设置不当、PWM模块配置失误等,有助于初学者避免类似的问题。
内容概要:本文详细介绍了如何使用Matlab/Simulink构建300kW直驱永磁同步电机的风电并网仿真模型。首先,文章讲解了永磁同步电机的关键参数配置,如定子电阻、d轴和q轴电感、磁链强度以及极对数等。接着,深入探讨了逆变器控制部分的设计,包括锁相环(PLL)的参数设置、双闭环控制结构中的电流环PI参数调整方法。此外,还讨论了并网瞬间的波形处理技巧,如软启动逻辑和直流母线电压的平稳爬升。文中提供了多个调试秘诀,如直流母线电容的选择、坐标变换模块的正确使用等。最后,强调了仿真过程中需要重点关注的三个信号:发电机转矩脉动、网侧电流谐波含量和直流母线电压纹波。 适合人群:具有一定电力电子和控制系统基础知识的研究人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解风电并网系统的原理和实现方式的技术人员。通过构建和优化仿真模型,可以更好地掌握永磁同步电机的工作机制及其在风电领域的应用。 阅读建议:读者可以在阅读过程中跟随作者逐步搭建仿真模型,同时关注各个模块的具体参数设置和调试技巧,以便更好地理解和掌握相关知识点。
项目功能说明 促销管理:零售出库、零售退货 采购管理:采购订单、采购入库、采购退货 销售管理:销售订单、物流信息、销售退货 仓库管理:其它入库、其它出库、调拨出库、组装单、拆卸单 成本核算:收入单、支出单、收款单、付款单、转账单、收预付款 药品溯源:库存状况、账户统计、进货统计、销售统计、入库明细、出库明细、入库汇总、出库汇总、客户对账、供应商对账、库存预警 药品管理:药品类别、药品信息、计量单位、序列号 基本资料:供应商信息、客户信息、会员信息、仓库信息、收支项目、结算账户、经手人管理 系统管理:角色管理、功能管理、机构管理、用户管理、日志管理、系统配置、商品属性、插件管理
内容概要:本文介绍了基于梯度下降的改进自适应短时傅里叶变换(STFT)方法,并展示了其在Jupyter Notebook中的具体实现。传统的STFT由于固定窗口长度,在处理非平稳信号时存在局限性。改进的方法通过梯度下降策略自适应调整窗口参数,从而提高时频分辨率。文中详细解释了算法的工作原理,包括信号生成、窗函数设计、损失函数选择等方面,并给出了具体的Python代码示例。此外,文章还讨论了该方法在多个领域的广泛应用,如金融时间序列、地震信号、机械振动信号、声发射信号、电压电流信号、语音信号、声信号和生理信号等。 适合人群:从事信号处理、数据分析及相关领域研究的专业人士,尤其是对时频分析感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要处理非平稳信号的研究和应用场景,旨在提高信号处理的精度和效率。具体目标包括但不限于:改善金融市场的预测能力、提升地震监测系统的准确性、增强机械设备故障诊断的效果、优化语音识别和合成的质量等。 其他说明:该方法不仅限于特定类型的信号,而是可以通过调整参数灵活应用于不同的信号类型。文中提供的代码可以在Jupyter Notebook环境中直接运行,便于实验和验证。
内容概要:本文详细介绍了VMD(变分模态分解)与NGO(北方苍鹰优化算法)结合形成的最优变分模态优化算法。该算法通过嵌套多种损失函数,尤其是包络熵,实现了对复合信号在频域上的最优拆分。文中不仅解释了算法的工作原理,还提供了具体的Python代码示例,展示了如何通过调整参数来优化信号拆分过程。此外,文章强调了该算法在特征工程领域的巨大价值,特别是在提高数据预测准确性方面的作用。通过实例演示,证明了VMD+NGO算法在处理非平稳信号、音频处理、图像处理等领域中的优越性能。 适合人群:从事信号处理、数据分析、机器学习等相关领域的研究人员和技术人员,尤其是那些希望深入了解并应用先进信号处理技术的人。 使用场景及目标:适用于需要从复杂复合信号中提取有用信息的各种应用场景,如工业设备状态监测、故障诊断、时间序列预测等。主要目标是提高信号处理的精度和效率,进而改善基于这些信号的预测模型的表现。 其他说明:文章提供了详细的代码片段和理论背景,有助于读者更好地理解和实施该算法。同时提醒读者注意某些实现细节,如参数的选择和优化策略的应用。
基于51单片机protues仿真的鱼缸环境监测系统(仿真图、源代码,AD原理图、流程图) 1、测量鱼缸水温、PH值、有害物质等,并显示 2、可以通过串口遥控控制制氧机和加热器的启停【没有自动控制功能】; 3、仿真图、源代码,AD原理图、流程图
内容概要:本文档《kotlin从入门到精通.pdf》详细介绍了Kotlin编程语言的核心概念和特性,内容涵盖了基本语法、类型系统、类与对象、继承、接口、泛型、扩展函数、委托属性、控制流、异常处理、注解、反射、动态类型等多个方面。文档不仅讲解了Kotlin的基本语法和特性,还深入探讨了其与Java和Scala的互操作性和对比。此外,文档还提供了关于如何在不同构建工具(如Maven、Ant、Gradle)中使用Kotlin的具体指导。 适合人群:适合有一定编程基础,特别是熟悉Java的开发人员,尤其是工作1-3年的研发人员。 使用场景及目标: 1. 学习Kotlin的基础语法和特性,了解其与Java的互操作性; 2. 理解Kotlin的高级特性,如扩展函数、委托属性、内联函数等; 3. 掌握Kotlin在不同构建工具中的配置和使用方法; 4. 比较Kotlin与其他语言(如Java、Scala)的优缺点,帮助开发者做出合适的技术选型。 阅读建议:由于Kotlin与Java有着良好的互操作性,且文档内容详尽,建议读者结合实际项目需求逐步学习。对于初学者,可以从基本语法和类型系统入手,逐步深入到高级特性和构建工具的使用。对于有经验的开发者,可以直接跳转到感兴趣的章节,如扩展函数、委托属性等,以提高学习效率。