算法

PID模块(含常用改进算法和例程)--C源码

為{幸葍}努か 提交于 2020-02-15 10:11:44
大家经常会用到PID算法,虽然算法简单,但实际应用中往往要考虑很多细节,而且往往普通的PID算法不能很好的应对大家的需求,为了能在打代码的时候节省点时间,这里作者提供一个自己写好的PID模块,可以让各位在工程中应用。 下载地址: 百度云:链接:https://pan.baidu.com/s/1PI6EuMif5Y_67c4VWE1x7A 提取码:yhmi Github:连接:https://github.com/diceTZ/pid.git PID模块除了普通PID还加入了常用的几个改进PID算法: 1、积分分离PID 2、抗积分饱和PID 3、变速积分PID – 由于需求不一样,这个需要用户自行修改 4、不完全微分PID 5、微分先行PID 注:该PID模块为位置型PID 以下为.h代码和例程代码 pid.h(由于篇幅过长pid.c在上述下载地址中存放) //@作者 :tou_zi //@编写时间 :2019年4月6日 //@修改时间 :2019年4月6日 //@文件名 :pid.h //@描述 :pid模块库,可实现pid的计算 # ifndef _PID_H # define _PID_H # ifndef u8 # define u8 unsigned char # endif # define INTEGRAL_NORMAL 0 //普通积分 # define

分布式---Paxos算法

左心房为你撑大大i 提交于 2020-02-15 09:04:32
5.Paxos   Paxos算法解决的问题是 一个分布式系统如何就某个值(决议)达成一致 。一个典型的场景就是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。Paxos算法就是一种 基于消息传递模型的一致性算法 。 主要有三类节点: 提议者 (Proposer):提议一个值; 接受者 (Acceptor):对每个提议进行投票; 告知者 (Learner):被告知投票的结果,不参与投票。 执行过程   规定一个提议包含两个字段: [n,v] ,其中 n为序号 (具有唯一性), v为提议值 。 1.Prepare阶段   下图演示了两个proposer和三个acceptor的系中运行该算法的初始过程, 每个proposer都会向所有的acceptor发送prepare请求 。   当acceptor接受到一个prepare请求,包含的提议为[n1,v1],并且之前还未接受过prepare请求,那么 发送一个prepare响应 ,设置当前接受到的提议为[n1,v1],并且 保证以后不会接受序号小于n1的提议 。   如下图,Acceptor X 在收到 [n=2, v=8] 的 Prepare 请求时

模拟退火算法

好久不见. 提交于 2020-02-15 07:08:53
本篇为关于模拟退火算法的个人笔记。因为网上的资料不够综合,所以自己写了一份。会根据自己的见解持续更新。 名称来源 退火指物体逐渐降温冷却的物理现象。温度越低,物体的能量越低,在结晶状态时系统的能量状态到达最低。在自然中,缓慢降温(退火)可以导致结晶,而与之相对的快速降温(淬火)会导致不是最低能态的非晶体形态。 该算法的名称借用了这个说法。 符号说明 $E$ 物体的能量 $T$ 物体的温度 $k$ 玻尔兹曼常数 物理含义 根据热力学的原理,在温度为$T$时,出现能量差为$dE$的降温的概率为$p(dE)$,表示为: $$p(dE) = e^{\frac{dE}{kT}}$$ 温度越高,出现一次能量差为$dE$的降温的概率就越大;温度越低,则出现降温的概率就越小。 基本思想 模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而有效避免陷入局部最优并最终趋于全局最优的优化算法。 即不同于只考虑局部最优的贪心算法,模拟退火算法会以一定的概率 p 接受比当前差的解,因此有可能跳出局部的最优解,到达全局最优解。 一般认为该概率 p 以 $e^{- \frac{\Delta E}{kT}}$ 时最优,即: $$p = \left\{ \begin{aligned} &e^{\frac{E(x_{new})-E(x_{old})}{kT}} & E(x_{new})> E(x_

kmp算法总结

安稳与你 提交于 2020-02-15 05:44:12
转载分享,是我看到的最好懂的kmp讲解了!!谢谢原作,贴上链接 原作链接 KMP算法 KMP算法是一种线性时间复杂度的字符串匹配算法,它是对BF(Brute-Force,最基本的字符串匹配算法)的改进。对于给定的原始串S和模式串T,需要从字符串S中找到字符串T出现的位置的索引。KMP算法由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为Knuth–Morris–Pratt算法,简称KMP算法。在讲解KMP算法之前,有必要对它的前身–BF算法有所了解,因此首先将介绍最朴素的BF算法。 一:BF算法简介 如上图所示,原始串S=abcabcabdabba,模式串为abcabd。(下标从0开始)从s[0]开始依次比较S[i] 和T[i]是否相等,直到T[5]时发现不相等,这时候说明发生了失配,在BF算法中,发生失配时,T必须回溯到最开始,S下标+1,然后继续匹配,如下图所示: 这次立即发生了失配,所以继续回溯,直到S开始下表增加到3,匹配成功。 容易得到,BF算法的时间复杂度是O(n*m)的,其中n为原始串的长度,m为模式串的长度。BF的代码实现也非常简单直观,这里不给出,因为下一个介绍的KMP算法是BF算法的改进,其时间复杂度为线性O(n+m),算法实现也不比BF算法难多少。 二:KMP算法 前面提到了朴素匹配算法,它的优点就是简单明了

遗传算法在TSP问题中的应用

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-14 21:59:35
遗传算法在TSP问题中的应用 什么是TSP问题? TSP问题是典型的组合优化问题,其也是遗传算法界中最为经典的优化问题之一。在遗算法成熟之前也一直困扰着科研人员,TSP问题又称为名旅行商问题,其定义为设有N个城市,推销员要从某一个城市前往另外N-1个城市,每个城市能去的次数有且仅有一次,最终回到出发的城市,要寻找的便是该推销人员走过的最短路径,也可以理解为给N个数目的城市附上一个加权完全图,每个城市都用一个顶点代替,每两个顶点之间一条无向加权边[2]。最终求解此无向加权完全图的最小哈米尔顿回路。 研究意义? TSP问题不仅仅是解决了TSP问题,其可以延伸到了许多其他问题当中,如下城市市区下水管道的铺设路径,物流公司物流配送货物等实际与生活息息相关的问题,这些问题的求解方法都可以应用于很多现实生活中的组合优化问题,是都是相当经典的组合问题,遗传算法是一种全局随机搜索的算法,对于解决各种组合优化问题都有着十分有效的作用,因此用遗传算法来解决这两个经典组合优化问题(本人在毕业论文的另外一个组合优化问题是有关营销利润的,有兴趣的可以私聊或者评论)是一种不错的选择。 算法在TSP中的实际应用步骤 (1)设定N个城市,每个城市用一个自然数代替,每个城市之间的距离制定成加权数据,对所有定义的城市进行随机编码,TSP问题中的编码,科研人员往往采用的时二进制字符编码和实数编码; (2)确定好各类参数

加权图与狄克斯特拉算法|Python实现

丶灬走出姿态 提交于 2020-02-14 20:16:21
在前面,我们讨论了图与广度优先搜索,解决了一个“找朋友”的问题。现在,让我们想一想,我们把问题换成了“找地方”——我们想从一个地方到达另一个地方,也按照最短路径到达——这样的问题中,我们使用图来建立模型时,会发现连接——也就是两个地方之间的路——是有权重,或者说长度的。这种情况下,广度优先搜索就不起作用了——它只能保证我们找到走过最少的连接数,而没有考虑这些连接有长度的情况。下面我们来考虑这个问题。 1. 两个术语 (1).加权图 就像上面所说,广度优先搜索适用于“连接没有长度值”的图,我们称之为非加权图。而连接存在长度值时,我们使用狄克斯特拉算法,此时的图称为加权图,连接的长度值称为权重。比如: 6 1 2 5 3 起点 A 终点 B (2).有向无环图 之前我们介绍过有向图和无向图,其实无向图就是一个环: 起点 终点 也就是无向意味着两个节点相互指向对方。 当环这个结构存在于图中,并且终点不在环中时,环只会徒劳的增加权重。我们要讨论的狄克斯特拉算法适用于有向无环图( DAG )。 2. 狄克斯特拉算法 前面示例展示的那个图过于简单,无法体现这个算法的所有细节。所以,这里我们搭建一个复杂一点的图,并且解释这个图的现实意义——这会让我们发现狄克斯特拉算法的用处之大。 5 0 15 20 30 35 20 10 乐谱 唱片 海报 吉他 鼓 钢琴 这里,节点的意思很明确:某件乐器

什么是结构化算法,为什么要提倡结构化算法。

前提是你 提交于 2020-02-14 16:05:08
结构化的算法:由三种基本结构构成的算法结构是结构化的算法。 2.为什么提倡结构化的算法:因为该算法所得程序便于编写、阅读、修改和维护,这样就减少了程序出错的机会,提高了程序的可读性,保证了程序的质量。 来源: CSDN 作者: 杜小前 链接: https://blog.csdn.net/Du798566/article/details/104311198

数据结构之算法分析

梦想与她 提交于 2020-02-14 14:16:16
重要结论 如果 \(T_1(N) = 0(f(N))\) 且 \(T_2(N)=O(g(N))\) 那么 a. \(T_1(N) + T_2(N) = O(f(N) + g(N))\) b. \(T_1(N) * T_2(N) = O(f(N)*g(N))\) 如果 T(N) 是一个 k 次多项式,则 \(T(N) = O(N^k)\) 3. 对于任意常数k, \(log^kN = O(N)\) 表示,对数增长的非常缓慢 运算时间计算 时间单元的计算 一次赋值 一个时间单元一次四则运算 一个时间单元初始化 i、测试 i<=N,和对 i 的自增运算隐含着开销。所有这些总的开销是初始化一个时间单元 2. 一般法则 法则1 - for循环 一个 for 循环运行时间至少是该 for 循环内部那些语句(包含测试)的运行时间乘以迭代的次数 法则2 - 嵌套的 for 循环 从里向外分析这些循环,在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积 法则3 - 顺序语句 将各个语句的运行时间求和即可,其中的最大值就是所得到的运行时间如果 O(N) + O(N^2) 则 总量是 O(N^2) 法则4 - if/else 语句 一个 if/else 语句的运行时间从不超过判断的运行时间再加上 S1 和 S2中运行时间长者的总的运行时间。 例子

2020预备春招BAT面试题汇总:Java 相关、Android 基础、Android Framework、三方源码、算法与数据结构

﹥>﹥吖頭↗ 提交于 2020-02-14 11:03:27
前言: 本文收集整理了各大厂常见面试题N道,你想要的这里都有内容涵盖:Java 相关、Android 基础、Android Framework、三方源码、算法与数据结构、等技术栈,希望大家都能找到适合自己的公司,开开心心的撸代码。 目录: 由于题量较多,篇幅的限制,文章中的面试题分享没有全部附上详细的解析,但是整理成了一份详细的PDF文档可分享给大家,文末获取免费领取方式 Android面试指导 看面试题可以是为了面试,也可以是对自己学到的东西的一种查漏补缺,更加深刻的去了解一些核心知识点 1、Java 相关 容器(HashMap、HashSet、LinkedList、ArrayList、数组等) 需要了解其实现原理,还要灵活运用,如:自己实现 LinkedList、两个栈实现一个队列,数组实现栈,队列实现栈等。 内存模型 垃圾回收算法(JVM) 类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要) 反射 多线程和线程池 HTTP、HTTPS、TCP/IP、Socket通信、三次握手四次挥手过程 设计模式(六大基本原则、项目中常用的设计模式、手写单例等) 断点续传 2、Android 基础 自定义 View(参考链接: 自定义View,有这一篇就够了 - 简书 、 Android 自定义 View ) 事件拦截分发( Android事件分发机制,大表哥带你慢慢深入 -

内存管理:如何避免内存溢出和频繁的垃圾回收?

老子叫甜甜 提交于 2020-02-14 01:41:54
自动内存管理机制的实现原理 做内存管理,主要需要考虑 申请内存和内存回收 这两个部分。 申请内存的逻辑非常简单: 1、计算要创建对象所需要占用的内存大小; 2、在内存中找一块儿连续并且是空闲的内存空间,标记为已占用; 3、把申请的内存地址绑定到对象的引用上,这时候对象就可以使用了。 内存回收 内存回收需要做这样两件事儿: 1、先是要找出所有可以回收的对象,将对应的内存标记为空闲 2、整理内存碎片。 采用GC算法找出可回收对象,此类算法大多采用 “标记-清除“ 算法或其变种,此类算法分为标记和清除两阶段: 标记阶段:从 GC Root 开始,你可以简单地把GC Root 理解为程序入口的那个对象,记所有可达的对象,因为程序中所有在用的对象一定都会被这个 GC Root 对象直接或者间接引用。 清除阶段:遍历所有对象,找出所有没有标记的对象。这些没有标记的对象都是可以被回收的,清除这些对象,释放对应的内存即可。 缺点: 效率不高、空间问题、在执行标记和清除过程中,必须把进程暂停(Stop the world)。 java虚拟机中常见的垃圾收集器及其对应垃圾收集算法: 垃圾收集器 1、 Serial收集器。 (虚拟机运行在Client模式下的默认新生代收集器) 单线程收集器,在进行垃圾收集时,必须暂停所有其他的工作线程,直至结束。 2、 ParNew收集器 Serial收集器的多线程版本