前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >干货 | 人工鱼群算法 超详细解析附JAVA代码

干货 | 人工鱼群算法 超详细解析附JAVA代码

作者头像
用户1621951
发布于 2019-06-06 03:15:47
发布于 2019-06-06 03:15:47
1.4K00
代码可运行
举报
文章被收录于专栏:数据魔术师数据魔术师
运行总次数:0
代码可运行

写在前面

说到这个人工鱼群算法,又想起了小编的卢浮宫……在今年年初的美赛中,小编用的就是这个算法,只不过……参加今年美赛的同学都懂的。

好了不扯了,本着学习的心态,还是想把这个算法写一写,给大家科普一下的吧。

01 人工鱼群算法

人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到启发而阐述的仿生学优化方案。

1.1 定义

在一片水域中,鱼往往能自行或尾随其他鱼找到营养物质多的地方,因而鱼生存数目最多的地方一般就是本水域中营养物质最多的地方,人工鱼群算法就是根据这一特点,通过构造人工鱼来模仿鱼群的觅食、聚群及追尾行为,从而实现寻优。

人工鱼拥有以下几种典型行为:

(1)觅食行为:一般情况下鱼在水中随机地自由游动,当发现食物时,则会向食物逐渐增多的方向快速游去。

(2)聚群行为: 鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群,鱼聚群时所遵守的规则有三条:

分隔规则:尽量避免与临近伙伴过于拥挤;

对准规则:尽量与临近伙伴的平均方向一致;

内聚规则:尽量朝临近伙伴的中心移动。

(3)追尾行为:当鱼群中的一条或几条鱼发现食物时,其临近的伙伴会尾随其快速到达食物点。

(4)随机行为:单独的鱼在水中通常都是随机游动的,这是为了更大范围地寻找食物点或身边的伙伴。

1.2 算法具体过程

人工鱼群算法实现的步骤:

1. 初始化设置,包括种群规模N每条人工鱼的初始位置、人工鱼的视野Visual、步长step、拥挤度因子δ、重复次数Trynumber;

2. 计算初始鱼群各个体的适应值,取最优人工鱼状态及其值赋予给公告牌;

3. 对每个个体进行评价,对其要执行的行为进行选择,包括觅食Pray、聚群Swarm、追尾Follow和评价行为bulletin;

4. 执行人工鱼的行为,更新自己,生成新鱼群;

5. 评价所有个体。若某个体优于公告牌,则将公告牌更新为该个体;

6. 当公告牌上最优解达到满意误差界内或者达到迭代次数上限时算法结束,否则转步骤3。

1.3 算法流程图

1.4 算法伪代码

结合上面的流程图,伪代码很容量理解了。

02 参数解析

人工鱼群算法有5个基本参数:群规模N、人工鱼的视野Visual、步长Step、拥挤度因子δ、重复次数Trynumber。

2.1 视野Visual

动物的观察力是及其深奥的,它可以很快的洞察到周边的物体,鱼类的视野中分为连续型视野和离散型视野两类。应用如下方法实现虚拟人工鱼的视觉:

图2.1(a)表示具有连续型视野的一条假设的人工鱼个体,它能看到的区域 Visual 为以现在位置 Xi为圆心一定距离为半径的圆形区域,地点 Xj为它在一个时候巡视到的视点种另一地方,如果这个地点的食物量比之前地方的多,就决定去这个地方前进步长的随机数达到地点 Xnext;

人工鱼的离散型视野为与节点位置 Xi 相邻且相通的所有节点,如图 2.1(b)所示,根据判断边的代价来选择下一步位置 Xnext。

由于视野对算法中个行为都有较大影响,因此,它的变化对收敛性能影响也比较复杂。

当视野范围较小时,人工鱼的觅食行为和随机行为比较突出;视野范围较大时,人工鱼的追尾行为和聚群行为将变得比较突出,相应的算法的复杂度也会有所上升。

总的来说:视野越大,越容易使人工鱼发现全局最优解并收敛。

2.2 步长Step

对于固定步长,随着步长的增加,收敛的速度得到了一定的加速,但在超过一定的范围后,有使得收敛速度减缓,步长过大时会出现震荡现象而大大影响收敛速度

采用随机步长的方式在一定程度上防止了震荡现象的发生,并使得该参数的敏感度大大降低了,但最快的收敛速度还是最优固定步长的收敛速。

所以,对于特定的优化问题,我们可以考虑采用合适的固定步长或者变尺度方法来提高收敛速度。

2.3 群规模N

人工鱼的数目越多,跳出局部最优解的能力越强,同时,收敛的速度也越快。

当然,付出的代价就是算法每次迭代的计算量也越大,因此,在使用过程中,满足稳定收敛的前提下,应当尽可能的减少个体数目。

2.4 尝试次数Trynumber

尝试次数越多,人工鱼的觅食行为能力越强,收敛的效率也越高。

在局部极值突出的情况下,应该适当的减少以增加人工鱼随机游动的概率,克服局部最优解。

2.5 拥挤度因子δ

在求极大值问题中,δ=1/(αnmax),α∈(0,1]δ=1/(αnmax),α∈(0,1];在求极小值问题中,δ=αnmax,α∈(0,1]δ=αnmax,α∈(0,1]。其中α为极值接近水平, nmax为期望在该邻域内聚集的最大人工鱼数目。

拥挤度因子与nf相结合,通过人工鱼是否执行追尾和聚群行为对优化结果产生影响。以极大值为例(极小值的情况正好与极大值相反),δ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优解的能力越强;但是收敛速度会有所减缓,这主要因为人工鱼在逼近最优解的同时,会因避免过分拥挤而随机走开或者受其他人工鱼的排斥作用,不能精确逼近极值点。

可见,虽然δ的引入避免了人工鱼过度拥挤而陷入局部最优解,但是另一方面,该参数会使得位于极值点附件的人工鱼之间存在相互排斥的影响,而难以想极值点精确逼近。

所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快算法的收敛速度和提高结果的精确程度。

2.6 小结

1.群规模:N越大收敛越快,越容易寻得全局最优解,但是计算量越大;

2.感知范围:视野越大,越易发现全局最优解;

3.步长:决定收敛速度;

4.拥挤因子:适当选择可避免局部最优

5.重复次数:越大收敛越快,可调整随机游走概率,克服局部最优解。

03 四种基本行为

人工鱼有四种基本行为,包括觅食Pray、聚群Swarm、追尾Follow和评价行为bulletin。

3.1 觅食行为

这是鱼趋向食物的一种活动,一般认为它是通过视觉或味觉来感知水中的食物量或食物浓度来选择行动的方向。

设置人工鱼当前状态,并在其感知范围内随机选择另一个状态,如果得到的状态的目标函数大于当前的状态,则向新选择得到的状态靠近一步,反之,重新选取新状态,判断是否满足条件。

选择次数达到一定数量后,如果仍然不满足条件,则随机移动一步。

3.2 聚群行为

大量或少量的鱼聚集成群,进行集体觅食和躲避敌害,这是它们在进化过程中形成的一种生存方式。

人工鱼探索当前邻居内的伙伴数量,并计算伙伴的中心位置,然后把新得到的中心位置的目标函数与当前位置的目标函数相比较,如果中心位置的目标函数优于当前位置的目标函数并且不是很拥挤,则当前位置向中心位置移动一步,否则执行觅食行为。

鱼聚群时会遵守两条规则:一是尽量向邻近伙伴的中心移动,二是避免过分拥挤。

3.3 追尾行为

当某一条鱼或几条鱼发现食物时,它们附近的鱼会尾随而来,导致更远处的鱼也会尾随过来。

人工鱼探索周围邻居鱼的最优位置,当最优位置的目标函数值大于当前位置的目标函数值并且不是很拥挤,则当前位置向最优邻居鱼移动一步,否则执行觅食行为。

3.4 随机行为

它是觅食行为的一个缺省行为,指人工鱼在视野内随机移动。当发现食物时,会向食物逐渐增多的方向快速的移动。

04 行为选择

公告牌是记录最优人工鱼个体状态的地方。每条人工鱼在执行完一次迭代后将自身当前状态与公告牌中记录的状态进行比较,如果优于公告牌中的状态则用自身状态更新公告牌中的状态,否则公告牌的状态不变

当整个算法的迭代结束后,公告牌的值就是最优解。

行为评价是用来反映鱼自主行为的一种方式,在解决优化问题时选用两种方式评价:一种是选择最优行为执行;另一种是选择较优方向。

对于解决极大值问题,可以使用试探法,即模拟执行群聚、追尾等行为,然后评价行动后的值选择最优的来执行,缺省的行为为觅食行为。

一般通过试探法,模拟执行上述几种行为,评价后选择最大者实行;

05 终止条件

迭代终止条件:

1. 通常的方法是判断连续多次所得值得均方差小鱼允许的误差;

2. 或判断聚集于某个区域的人工鱼的数目达到某个比例;

3. 或连续多次所得的均值不超过已寻找的极值;

4. 或限制最大迭代次数。

若满足终止条件,则输出公告牌的最优记录;否则继续迭代。

06 实现代码JAVA

以下代码是实现求解一个二元函数最优值问题的。代码下载移步留言区。

主函数测试类

代码语言:javascript
代码运行次数:0
运行
复制
 1package AFAS_PACK;
 2
 3import java.io.IOException;
 4
 5public class mainTest {
 6
 7    /**
 8     * @param args
 9     * @throws IOException
10     * @author sun 
11     */
12    public static void main(String[] args) throws IOException {
13        //int fishNum, int tryTime, int dim, double step, double delta, double visual   
14        System.out.println("begin");
15        AFAS run = new AFAS(10,5,2,5,0.2,10);
16          run.doAFAS(40 );//括号内为迭代次数
17    }
18
19}

人工鱼类

代码语言:javascript
代码运行次数:0
运行
复制
 1package AFAS_PACK;
 2
 3import java.io.IOException;
 4
 5public class Fish {
 6    public int dim;                   //每条鱼的维度
 7    public int[] x;                //每条鱼的具体多维坐标
 8    public double fit;                //鱼的适应值,浓度
 9    public int visaul;             //每条鱼的视野
10    public final double[] H = new double[256];
11    public final double[] W = new double[256];
12
13
14    public Fish(int dim, int visaul) throws IOException {
15        super();
16        this.dim = dim;
17        this.visaul = visaul;
18        x = new int[dim];
19        for(int i=0;i<dim;i++)
20            x[i] = (int) Math.floor(256*Math.random());
21        fit = 0;
22        //init();
23    }
24    /*getfit = newfunction(this.x[0],this.x[1]);*/
25
26
27    public double distance(Fish f)
28    {
29        double a = 0;
30        for(int i=0;i<dim;i++)
31        {
32            if(this.x[i]-f.x[i]==0)
33                a = 0.00001;
34            else 
35                a += (this.x[i]-f.x[i])*(this.x[i]-f.x[i]);
36        }
37        return Math.sqrt(a);
38    }
39
40
41    public  double newfunction(int[] w) throws IOException {          
42
43        return -(w[0]*w[0]-160*w[0]+640+w[1]*w[1]-260*w[1]+16900);
44
45    }
46}

人工鱼群算法类

代码语言:javascript
代码运行次数:0
运行
复制
  1package AFAS_PACK;
  2
  3
  4import java.io.IOException;
  5import java.util.Date;
  6
  7
  8
  9public class AFAS {
 10    //鱼群数目
 11        private int fishNum;
 12        //尝试次数
 13        private int tryTime;
 14        //维度
 15        private int dim;
 16        //人工鱼移动步长
 17        private int step;
 18        //拥挤度因子
 19        private double delta;
 20        //视野范围
 21        private int visual;
 22        //人工鱼群、范围内最佳鱼,遍历时的下一条鱼
 23        Fish[] fish;
 24        Fish bestfish;
 25        Fish[] nextfish;
 26        //遍历索引
 27        int index;
 28        double[][] vector;
 29        private int[] choosed;
 30        //范围内鱼群数目 fishCount
 31        public int scopelength;
 32
 33        public AFAS(){
 34
 35        }
 36        public AFAS(int fishNum, int tryTime, int dim, int step, double delta, int visual) throws IOException 
 37        {
 38            super();
 39            this.fishNum = fishNum;
 40            this.tryTime = tryTime;
 41            this.dim = dim;
 42            this.step = step;
 43            this.delta = delta;
 44            this.visual = visual;
 45            fish = new Fish[fishNum];
 46            nextfish = new Fish[3];
 47            vector = new double[fishNum][dim];
 48            choosed = new int[fishNum];
 49            index = 0;
 50            init();
 51        }
 52        public void doAFAS(int num) throws IOException 
 53        {  
 54            long startTime = new Date().getTime();
 55            double a = 0.0;
 56            int count = 1;                          //计算查找次数
 57            int len = 0;
 58            while(count<=num)
 59            {
 60
 61                 for(int i=0; i<fishNum; i++)
 62                 {
 63                     prey(i);
 64                     swarm(i);
 65                     follow(i);
 66                     bulletin(i);
 67                     System.out.println("第"+count+"遍第"+i+"条鱼结束");
 68                 }    
 69                 System.out.println(count+"当前最优值:"+bestfish.fit);
 70                 for(int i=0; i<dim; i++)
 71                 {
 72                     System.out.print("位置"+(i+1)+":  "+bestfish.x[i]);  
 73                 }
 74                 System.out.println();
 75                 count++;
 76                 System.out.println("step:"+step+"    visaul:"+visual);
 77
 78            }
 79            System.out.println("最优值:"+bestfish.fit);
 80            for(int i=0; i<dim; i++)
 81            {
 82                System.out.print("位置"+(i+1)+":  "+bestfish.x[i]);  
 83            }
 84            long endTime = new Date().getTime();
 85            System.out.println("本程序运行计时: "+(endTime-startTime)+" 毫秒。");
 86        }
 87
 88        private void bulletin(int i) throws IOException {
 89            Fish maxfish = new Fish(dim,visual);
 90            maxfish = nextfish[0];
 91            for(int j=0;j<3;j++)
 92            {
 93                if(nextfish[j].fit>maxfish.fit && nextfish[j].x[0]!=0 && nextfish[j].x[1]!=0)
 94                {
 95                    maxfish = nextfish[j];
 96                }
 97            }
 98            if(maxfish.fit<fish[i].fit)
 99            {
100                return ;
101            }
102            fish[i] = maxfish;
103            if(maxfish.fit>bestfish.fit)
104                bestfish = maxfish;
105        }
106        private void follow(int i) throws IOException {
107            nextfish[2] = new Fish(dim,visual);
108            Fish minfish = new Fish(dim,visual);                    // 中心位置
109            minfish = fish[i];
110            Fish[] scope = getScopefish(i);
111            int key = i;
112            if(scope!=null)
113            {
114                for(int j=0;j<scope.length;j++)
115                {
116                    if(scope[j].fit<minfish.fit)
117                    {
118                        minfish = scope[j];
119                        key = j;
120                    }
121                }
122                if(minfish.fit>=fish[i].fit)
123                    prey(i);
124                else{
125                    Fish[] newScope = getScopefish(key);
126                    if(newScope!=null)
127                    {
128                        if(newScope.length*minfish.fit<delta*fish[i].fit)
129                        {
130                            double dis = fish[i].distance(minfish);
131                            for(int k=0;k<dim;k++)
132                            {
133                                nextfish[2].x[k] = (int) (fish[i].x[k]+(minfish.x[k]-fish[i].x[k])*step*Math.random()/dis);                                 
134                            }
135                            nextfish[2].fit = nextfish[2].newfunction(nextfish[2].x);
136                        }
137                        else prey(i);
138                    }
139                    else prey(i);
140                }
141            }
142            else prey(i);
143
144        }
145        private void swarm(int i) throws IOException {                               //swam  start
146            nextfish[1] = new Fish(dim,visual);
147            int[] center = new int[dim];                    // 中心位置
148            for(int j=0;j<dim;j++)
149                center[j] = 0;
150            Fish[] scope = getScopefish(i);
151            if(scope!=null)
152            {
153                for(int j=0;j<scope.length;j++)                     // 计算人工鱼的中心位置
154                {
155                    for( i=0; i<dim; ++i )
156                        center[i] += scope[j].x[i];
157                }
158                for( i=0; i<dim; i++ )
159                    center[i] /= scope.length;                               // 人工鱼的中心位置
160                //满足条件
161                double dis=0.0;
162                Fish centerfish = new Fish(dim,visual);
163                centerfish.x = center;
164                centerfish.fit = centerfish.newfunction(centerfish.x);
165                dis = fish[i].distance(centerfish);
166                if(centerfish.fit>fish[i].fit && scope.length*centerfish.fit<delta*fish[i].fit)
167                {
168                    for(int j=0;j<dim;j++)
169                    {
170                        nextfish[1].x[j] = (int) (fish[i].x[j]+(centerfish.x[j]-fish[i].x[j])*step*Math.random()/dis);
171
172                    }
173                    nextfish[1].fit = nextfish[1].newfunction(nextfish[1].x);
174                }
175                else  prey(i); 
176            }
177            else  prey(i); 
178        }                                               //swam  end
179
180
181
182        private void prey(int i) throws IOException  {                      //prey start
183
184            Fish newfish = new Fish(dim,visual);
185            newfish.fit = 0;
186            nextfish[0] = new Fish(dim,visual);
187            for(int k=0; k<tryTime; k++ )           // 进行try_number次尝试
188            {
189                for(int j=0; j<dim; j++ )
190                {
191                    newfish.x[j] = (int) ((2*(Math.random())-1)*visual);
192
193                }
194                newfish.fit = newfish.newfunction(newfish.x);
195
196                if( newfish.fit > fish[i].fit )
197                {
198                    double dis = fish[i].distance(newfish);
199                    for(int j=0; j<dim; j++ )
200                    {
201
202                        nextfish[0].x[j] = (int) (fish[i].x[j]+(newfish.x[j]-fish[i].x[j])*step*Math.random()/dis);
203
204                    }
205                    nextfish[0].fit =nextfish[0].newfunction(nextfish[0].x); 
206                }
207                else
208                {
209
210                    for(int j=0; j<dim; j++)
211                    {
212                        nextfish[0].x[j] = (int) (fish[i].x[j]+visual*(2*(Math.random())-1));
213
214                        nextfish[0].fit = nextfish[0].newfunction(nextfish[0].x);
215
216                    }
217
218                }
219            }
220        }
221        private Fish[] getScopefish(int i) {
222            int num = 0;
223            for(int j=0;j<fishNum;j++)
224            {
225                choosed[j] = -1;
226                if(fish[i].distance(fish[j])<visual)
227                {
228                    choosed[j] = i;
229                    num++;
230                }
231            }
232            if(num!=0)
233            {
234                Fish[] scope = new Fish[num];
235                int k = 0;
236                for(int j=0;j<fishNum;j++)
237                {
238                    if(choosed[j]!=-1)
239                        scope[k++] = fish[choosed[j]];
240                }
241                return scope;
242            }
243            return null;
244        }                                                    //prey  end
245        private void init() throws IOException {
246            for(int i=0;i<fishNum;i++)
247            {
248                fish[i] = new Fish(dim,visual);
249                fish[i].fit = fish[i].newfunction(fish[i].x);
250            }
251            bestfish = new Fish(dim,visual);
252            bestfish.fit = -999999;
253        }
254}

---The End---

文案 && 编辑:邓发珩

指导老师: 秦时明岳(华中科技大学管理学院)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据魔术师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
大佬你好,请问有带有生存机制和竞争机制的鱼群算法代码吗,非常感谢了!
大佬你好,请问有带有生存机制和竞争机制的鱼群算法代码吗,非常感谢了!
回复回复点赞举报
推荐阅读
又一个高颜值适合多场景的开源监控工具问世
致力于打造兼具美学设计与功能实用性的监控解决方案。该工具采用容器化部署方案,支持x86/x64与ARM架构设备,具备以下核心价值:
IT运维技术圈
2025/05/09
2450
又一个高颜值适合多场景的开源监控工具问世
Uptime-Kuma 一个花哨的开源监控工具
大家好,我是等天黑, 今天介绍一个开源免费的监控工具 Uptime Kuma, 简单实用, 主要用来监控 Web 和网络, 和 Prometheus 不一样的是, 它是轻量的, 基于Node.js 和 Vue 3 开发, 你可以在 github 找到它
全球技术精选
2021/12/11
7.9K0
Uptime-Kuma 一个花哨的开源监控工具
Uptime-Kuma 一个花哨的开源监控工具
大家好,我是等天黑, 今天介绍一个开源免费的监控工具 Uptime Kuma, 简单实用, 主要用来监控 Web 和网络, 和 Prometheus 不一样的是, 它是轻量的, 基于Node.js 和 Vue 3 开发, 你可以在 github 找到它
jwangkun
2021/12/23
7560
Uptime-Kuma 一个花哨的开源监控工具
轻量级服务器监控新星:Beszel——支持Docker、多设备整合的开源监控平台
欢迎大家在评论区留言评论自己想了解的工具、方向或职业等互联网相关内容,点赞和推荐多的,波哥会优先安排解答!
IT运维技术圈
2025/02/19
7490
轻量级服务器监控新星:Beszel——支持Docker、多设备整合的开源监控平台
推荐一个非常轻便的ssl监控工具
如果大家有需要帮忙推荐的工具、框架、应用、脚本可以在文章下方留言,留言中被点赞、推荐回复较多的,波哥就会帮各位提前安排哦!
IT运维技术圈
2024/11/23
1570
推荐一个非常轻便的ssl监控工具
千万别错过!这个国产开源项目彻底改变了你的域名资产管理方式,收藏它相当于多一个安全专家!
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
小华同学ai
2025/06/06
390
千万别错过!这个国产开源项目彻底改变了你的域名资产管理方式,收藏它相当于多一个安全专家!
实战 Prometheus 搭建监控系统
Prometheus 是一款基于时序数据库的开源监控告警系统,说起 Prometheus 则不得不提 SoundCloud,这是一个在线音乐分享的平台,类似于做视频分享的 YouTube,由于他们在微服务架构的道路上越走越远,出现了成百上千的服务,使用传统的监控系统 StatsD 和 Graphite 存在大量的局限性,于是他们在 2012 年开始着手开发一套全新的监控系统。Prometheus 的原作者是 Matt T. Proud,他也是在 2012 年加入 SoundCloud 的,实际上,在加入 SoundCloud 之前,Matt 一直就职于 Google,他从 Google 的集群管理器 Borg 和它的监控系统 Borgmon 中获取灵感,开发了开源的监控系统 Prometheus,和 Google 的很多项目一样,使用的编程语言是 Go。
Spark学习技巧
2021/03/05
1.3K0
实战 Prometheus 搭建监控系统
“你感受过被监控的恐惧吗?”
这就是Prometheus 随着容器技术的迅速发展,Kubernetes已然成为大家追捧的容器集群管理系统。Prometheus作为生态圈 Cloud Native Computing Foundation(简称:CNCF)中的重要一员,其活跃度仅次于 Kubernetes, 现已广泛用于 Kubernetes 集群的监控系统中。 本文带领大家体验如何使用Prometheus开始收集系统指标,以便开发人员和云平台运维人员可以快速的掌握 Prometheus。 上图是Grafana看板的监
腾讯云TStack
2019/07/12
1.4K0
“你感受过被监控的恐惧吗?”
kubernetes(k8s) Prometheus+grafana监控告警安装部署
主机数据的采集是集群监控的基础;外部模块收集各个主机采集到的数据分析就能对整个集群完成监控和告警等功能。一般主机数据采集和对外提供数据使用cAdvisor 和node-exporter等工具。
sunsky
2020/08/20
4.7K0
kubernetes(k8s) Prometheus+grafana监控告警安装部署
推荐一款专为Nginx设计的图形化管理工具: Nginx UI!
Nginx UI是一款专为Nginx设计的图形化管理工具,旨在简化Nginx的配置与管理过程,提高开发者和系统管理员的工作效率。
测试开发技术
2024/10/21
3K0
推荐一款专为Nginx设计的图形化管理工具: Nginx UI!
1.Prometheus监控入门之介绍整体架构及安装
[TOC] 0x00 前言简述 0.学习导读 Q: 什么是监控? 描述: 一般的将这类可操作的计算机系统归纳为以下四个特征; 1.告警: 掌握故障的发生时间并通知相应人员(监控的重要目标)。 2.调
全栈工程师修炼指南
2022/09/29
7820
1.Prometheus监控入门之介绍整体架构及安装
推荐一个非常酷炫的一体化配置和容器管理工具
Squirrel Servers Manager (SSM) 像一位技术管家,把原本需要命令行操作的 Ansible 和 Docker 复杂流程变成了可视化操作。这个开源工具特别适合折腾家庭实验室的技术爱好者、中小企业运维团队以及需要快速部署测试环境的开发者们。项目地址在 这里,截至2025年5月的数据显示,已经有668位开发者点亮了小星星,22个技术团队fork了代码库。
IT运维技术圈
2025/05/17
1160
推荐一个非常酷炫的一体化配置和容器管理工具
Java 开发、全自研的开源监控组件来了,让 openGauss 更香 | Q推荐
2011 年,马克·安德森(网景公司创始人、硅谷著名风险投资人)留下一句经典名言——软件正在吞噬世界。这句看似耸人听闻的论断,现今早已为人习以为常。过去 10 年,在互联网浪潮下,IT 技术飞速发展,软件、开源、云计算、云原生掀起一波又一波的高潮,创新技术不断涌现。
深度学习与Python
2021/12/10
4110
Java 开发、全自研的开源监控组件来了,让 openGauss 更香 | Q推荐
运维必看!10分钟学会部署Uptime Kuma并实现远程监控服务器
本篇文章介绍如何在本地部署Uptime Kuma,并结合cpolar内网穿透实现公网远程访问。
YY的秘密代码小屋
2024/12/05
1.5K0
运维必看!10分钟学会部署Uptime Kuma并实现远程监控服务器
CI/CD界一颗冉冉升起的新星,主打一个各种可以
在云计算与容器化技术高速发展的当下,多服务器环境下的软件构建与部署效率已成为开发者亟待突破的瓶颈。Komodo作为开源工具领域的革新者,凭借其高度灵活性、无限扩展潜力及人性化设计,为DevOps团队与独立开发者提供了全链路的解决方案。这款工具以"🦎 a tool to build and deploy software on many servers 🦎"为核心理念,其命名灵感源自科莫多巨蜥——这种顶级掠食者的强大适应能力,恰如其分地体现了该工具在复杂部署环境中的卓越表现。
IT运维技术圈
2025/04/22
1510
CI/CD界一颗冉冉升起的新星,主打一个各种可以
重磅上线:腾讯云应用性能监控 APM 实现多语言应用秒级接入
前言:本文通过挖掘 APM 的发展史并着重介绍腾讯云新推出的 Operator 方案,实现多语言应用一键接入。
小腾资讯君
2024/06/12
2960
重磅上线:腾讯云应用性能监控 APM 实现多语言应用秒级接入
做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
不过大公司会专门做某一部分,例如应用运维不需要关注测试和安全等方面,但建议都学学,触类旁通有好处。 有这些基础,进到公司就可以去完成基础的建设工作了。比如会安排你搭建服务,整理资产报表,清理一些日志,这些基本工作可以帮助你了解公司当前有哪些服务,各种服务之间是如何运作的,之后再慢慢参与到业务中,薪资一线城市可以达到6-10k左右。
iginkgo18
2020/12/23
6.6K0
做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
进击消息中间件系列(二十一):Kafka 监控最佳实践
Kafka搭建好投入使用后,为了运维更便捷,借助一些管理工具很有必要。Kafka社区似乎一直没有在监控框架方面投入太多的精力,目前Kafka监控方案看似很多,然而并没有一个"大而全"的通用解决方案,各家框架也是各有千秋。很多公司和个人都自行着手开发 Kafka 监控框架,其中并不乏佼佼者。今天我们就来全面地梳理一下常用监控指标与主流的监控框架。
民工哥
2023/08/22
1.7K0
进击消息中间件系列(二十一):Kafka 监控最佳实践
容器平台与最佳实践参考
这是一张三年前总结的示意图,描绘了一个Kubernetes集群环境中的各种组件和它们之间的关系。图中从左到右展示了一个从基础资源角度到应用程序发管理角度的脑图。解释图中的主要组成部分:
行者深蓝
2023/12/11
6400
打造企业级自动化运维平台系列(十七):链路追踪工具 SkyWalking 详解
skywalking 是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 ,2017年加入 apache 孵化器。
民工哥
2024/01/18
10K2
打造企业级自动化运维平台系列(十七):链路追踪工具 SkyWalking 详解
推荐阅读
相关推荐
又一个高颜值适合多场景的开源监控工具问世
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验