自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 Socket编程——TCP通信与UDP通信

TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol ,用户数据报协议)都属于TCP/IP协议簇。其中,TCP是面向连接的协议,在数据传输之前必须通过"三次握手"与对方建立可靠的连接,当数据传输完毕后通过"四次挥手"与服务端断开连接,这样可以保证数据传输的可靠性。也正是其的可靠性,TCP通信经常用于需要保证网络通信内容完整性的情况,比如网页HTTP、QQ文件传输等过程。

2022-12-19 21:41:51 937 1

原创 设计模式【23】——解释器模式(Interpreter模式)

一些应用提供了内建(Build-In)的脚本或者宏语言来让用户可以定义他们能够在系统中进行的操作。Interpreter模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过解释器来解释语言中的句子。Interpreter模式提供了一个实现语法解释器的框架。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

2022-12-09 22:00:03 463

原创 设计模式【22】——迭代器模式(Iterator 模式)

Iterator 模式十分常见。当我们开发cpp文件时,经常会使用STL里面的容器,如vector、map、set等,对容器进行遍历的时候就用到了里面提供的Iterator来遍历数据结构。Iterator模式也正是用来解决对一个聚合对象的遍历问题。其将对聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。Iterator 模式中迭代器简化了聚合类,支持以不同的方式遍历一个聚合对象。而且增加新的聚合类和迭代器类都很方便,无须修改原有代码。

2022-12-09 21:13:27 544

原创 设计模式【21】——责任链模式(Chain of Responsibility 模式)

在我们请假的过程中,需要进行一些列的流程:先找部门负责人报备签字、再找部门领导签字,最后再找总经理签字。这个流程本质就是Chain of Responsibility 模式。本质上就是为请求创建了一个接收者对象的链,将对请求的发送者和接收者进行解耦,避免了请求发送者与接收者耦合。当有多个对象可以处理一个请求,哪个对象处理该请求运行时自动确定。而且客户也不清楚具体是那个对象处理请求,采用责任链模式最好。Chain of Responsibility 模式降低了耦合性。

2022-12-08 20:33:54 365

原创 设计模式【20】——访问者模式( Visitor模式)

在系统开发设计过程,经常会遇到需求变更的情况,经常我们做好的一个设计、实现了一个系统原型,咱们的客户又会有了新的需求。因此不得不去修改已有的设计,最常见就是解决方案就是给已经设计、实现好的类添加新的方法去实现客户新的需求,这样就陷入了设计变更的梦魇:不停地打补丁,其带来的后果就是设计根本就不可能封闭、编译永远都是整个系统代码。然而,Visitor 模式则提供了一种解决方案:将新需求实现封装到一个类中,并由待更改类提供一个接收接口,这样就可以实现接收新需求的添加。Visitor模式中,在 Visitor 模

2022-12-07 17:11:13 291

原创 设计模式【19】——命令模式(Command模式)

日常生活中,我们去饭馆吃饭一般都是找服务员点菜,而不是直接给厨师下菜单?其实,这种点菜的方式就是命令模式:我们点的菜单就是一个个请求,点菜员记录的菜单就是将请求生成的对象,点菜员不需要关心怎么做菜、谁来做,他只要把菜单传到后厨即可,由后厨统一调度。简而言之,命令模式就是把请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。Command 模式中,将请求的接收者(Reciever)放到 Command 的具体子类ConcreteCo

2022-12-07 13:34:01 520

原创 设计模式【18】——中介者模式( Mediator 模式)

在系统的设计开发过程中,对象之间的交互和通信是最常见的,因为对象间的交互本身就是一种通信。当系统规模变大,对象的大量增加会引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式。Mediator 模式提供将对象间的交互和通讯封装在一个类中,使各对象不需要显式地相互引用,实现了耦合松散,而且可以独立地改变它们之间的交互。Mediator模式中,每个Colleague维护一个 Mediator,当要进行交互,例如图中Co

2022-12-06 12:44:06 1052

原创 设计模式【17】——备忘录模式(Memento 模式)

备忘录模式用于保存和恢复对象的状态。备忘录模式在游戏中非常常见,比如在玩老头环进入新关卡时,我们通常会把游戏存档一下。即使在新关卡内死亡,我们也会在读档点复活,能读取当时保存的状态完整地恢复到当时的环境。我们在进行软件系统的设计时候是要给用户后悔的权利(实际上可能也是用户要求的权利:)),我们对一些关键性的操作肯定需要提供诸如回退的操作。那这个后悔药就是 Memento 模式提供的。Memento 模式的关键就是要在不破坏封装性的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作。M

2022-12-04 17:24:44 847

原创 设计模式【16】——观察者模式(Observer模式)

在现实世界中,许多对象是互相联系的。当其中一个对象的状态发生改变,可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时,其上游和下游产品也都会相应的变化;当我们开车通过交叉路口时,红灯j就要停,遇到绿灯会行。Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统

2022-12-03 12:52:55 354

原创 设计模式【15】——状态模式(State模式)

每个人、事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State)。最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正确你就可以 ok,否则就不让你通过。通常我们在实现这类系统会使用到很多的Switch/Case 语句,Case 某种状态,发生什么动作,Case 另外一种状态,则发生另外一种状态。但是这种实现方式也存在部分缺点:1)当状态数目不是很多的时候,Switch/Case 可能可以搞定。

2022-12-02 17:46:43 462

原创 设计模式【14】——策略模式( Strategy 模式)

Strategy 模式和 Template 模式要解决的问题是相同的,都是为了给业务逻辑具体实现和抽象接口之间的解耦。Strategy 模式将逻辑封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。继承:易于修改和扩展那些被复用的实现。

2022-12-01 17:09:56 240

原创 设计模式【13】——模板模式(Template 模式)

在系统的设计开发过程中经常会遇到:对于某一个业务逻辑的算法实对于不同的对象中有着不同的内部细节实现,但是整体的逻辑运行框架是相同的。Template 提供了这种情况的一个实现框架。Template 模式采用继承的方式实现,其将逻辑框架放在抽象基类中,并定义好具体接口,然后在子类中实现具体运算细节。Template 模式是很简单模式,也是应用很广的模式。具体而言,Template 采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。

2022-12-01 12:38:39 463

原创 设计模式【12】——代理模式(Proxy 模式)

在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。至少在以下集中情况下可以采用 Proxy 模式解决问题:1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理。

2022-11-30 21:47:31 436

原创 设计模式【11】——外观模式( Facade 模式)

实际上在软件系统开发的过程中经常会遇到这样的情况:可能你实现了一些接口(或者不同的功能模块),而这些接口(模块)都分布在几个类中(比如 A 和 B、C、D):A 中实现了一些接口,B 中实现一些接口(或者 A 代表一个独立模块,B、C、D 代表另一些独立模块)。然后你的客户(并不清楚你的具体接口到底是在哪个类中实现的,而且他们绝大多数的需求只是简单的组合: A、B、C、D 四个接口的组合,而且并不关心这些结果的内部细节。因此,在设计开发中可以通过一个叫做 Façade 的模式来解决上面的问题。

2022-11-30 21:23:35 288

原创 设计模式【10】——享元模式( Flyweight 模式)

创建对象的过程在面向对象系统的设计中是最经常用到的设计方法。但是,如果在设计过程中创建了太多的对象,会造成存储空间的巨大开销或者浪费。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为没有字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000 次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同),在这种情况我们可以为将对象的状态分为“

2022-11-29 21:16:10 368

原创 一篇看懂VINT编码

使用VINT编码后,对于不同的整数可以使用动态变化的字节来表示,特别是在小数占比较大的情况下,数据压缩效率十分明显。至此,VINT的相关知识介绍完毕。

2022-11-27 20:59:12 882

原创 设计模式【9】——组合模式(Composite 模式)

Composite(组合模式)是一种管理树形结构的抽象方式。其是将对象组合成树形结构,从而构成表示“部分 - 整体” 的层次结构。这种层次关系在日产生活中十分常见。如在公司组织关系中,可能分为部门与人,其中人属于部门,有的人有下属,有的人没有下属。假如将部门、人等都抽象成为一个节点(不用关心当前节点是部门还是人,两者有公共的基类),这样的话公司的组织架构就十分清晰,而且某个部门下有多少人、财务数据等这些数据也容易统计。除了公司外,在操作系统中也普遍应用,其中的文件夹与文件。

2022-11-27 17:49:48 415

原创 设计模式【8】——装饰器模式(Decorator 模式)

在系统程序设计与开发过程中,会经常遇到需要为一个已经定义好的类添加新的功能或者操作,通常的情况下我们可以定义一个新类继承自定义好的类。但是这样会带来一个问题:当具体子类要添加新的功能函数时,就必须向其父类添加一个相应的功能函数的抽象接口,否则无法通过父类指针实现调用功能。因此,处于高层的父类就承载了太多的抽象接口,而且所有继承自父类的子类都不可避免继承了这些接口,但是部分功能可能并不是该子类所需要的。另一方面,通过继承的方式解决的话还增加了系统的复杂性。

2022-11-26 16:39:54 454

原创 设计模式【7】——适配器模式(Adapter 模式)

实际上在软件系统设计和开发中,经常会遇到:我们为了完成某项工作购买了一个第三方的库来加快开发。这就带来了一个问题:我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter 模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。Adapter 模式正好可以解决这种问题,相当于对接口进行包装,起到一个适配器的作用。类模式和对象模式。这里我们主要介绍类模式。

2022-11-25 21:54:20 661

原创 设计模式【6】——桥接模式(Bridge 模式)

在开发过程中大家肯定都遇到过这样的问题:1)客户给了你一个需求,于是使用一个类来实现(A);2)客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1 和 A2);3)客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类(A00 和 A01,其中 A00 表示原来的类 A)实现不同操作系统上的客户需求,这样我们就有了一共 4 个类。

2022-11-23 21:10:52 1085

原创 设计模式【5】——原型模式( Prototype 模式)

Prototype 模式提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在 C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。Prototype 模式的结构和实现都很简单,其关键就是(C++中)拷贝构造函数的实现方式,这也是 C++实现技术层面上的事情。由于在示例代码中不涉及到深层拷贝。

2022-11-22 21:34:13 205

原创 设计模式【4】——建造者模式(Builder 模式)

生活中有着很多的Builder的例子,个人觉得大学生活就是一个Builder模式的最好体验:要完成大学教育,一般将大学教育过程分成 4 个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这 4 年的(4 个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同)。Builder 模式要解决的也正是这样的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合。

2022-11-21 22:32:07 155

原创 设计模式【3】——单例模式(Singleton 模式)

Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现。Singleton 模式的实现需要说明的是,Singleton 不可以被实例化,因此我们将其构造函数声明为 protected 或者直接声明为 private。

2022-11-20 20:18:18 624

原创 设计模式【2】——抽象工厂模式( AbstactFactory 模式)

假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心。理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。

2022-11-20 14:46:24 780

原创 设计模式【1】——工厂模式(Factory 模式)

在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们通常会抽象出类的公共接口以形成抽象基类或者接口。基于此,我们可以通过定义一个指向基类的指针来指向实际的子类实现,达到了多态的目的。但是,当有许多的子类继承自抽象基类,我们每次要用到子类式就需要重新定义子类,诸如 new ×××的代码。这样处理会带来两个问题 :1.客户程序员必须知道实际子类的名称(当系统复杂后,命名可能就出现了问题);2.程序的扩展性和维护变得越来越困难。

2022-11-20 11:52:27 685

从0开始实现目标检测-原理篇

本系列文章共两篇,总结记录了一个计算机视觉小白,如何一步一步完成这个任务的过程,分为原理篇和实践篇,包括目标检测的原理和算法的学习;模型选择并在公开的数据集合上体验;利用模型在自己的数据集上训练、调试参数、训练加速、结果衡量等过程。 要想学透东西,我认为最好的办法还是亲自动手做一遍,解决遇到的每个问题。就像我国一首古诗所写:纸上得来终觉浅,绝知此事要躬行。

2023-07-27

可视化SLAM算法详解,非常详细

同步定位和映射(SLAM)技术,由Smith于1986年首次提出,用于广泛的应用,特别是在增强现实 (AR) 领域和机器人。SLAM 过程旨在映射未知环境,并通过传感器提供的信号同时定位该环境中的传感器系统。在机器人技术中,地图的构建是一项至关重要的任务,因为它允许地标的可视化,促进环境的可视化。此外,它还可以帮助机器人的状态估计,重新定位它,并减少重新访问注册区域时的估计误差。 地图构建还附带另外两个任务:定位和路径规划。根据斯塔赫尼斯的说法,映射问题可以通过考虑机器人视角的三个问题来描述:世界是什么样子的?我在哪里?和 如何到达给定位置?第一个问题由映射任务澄清,该任务搜索以构建地图,即环境模型。为此,它需要观察到的地标的位置,即定位任务提供的第二个问题的答案。定位任务搜索以确定机器人的姿势,即其方向和位置,从而在地图上定位机器人。根据前两个任务,路径规划清除了最后一个问题,并试图估计机器人到达给定位置的轨迹。它依赖于定位任务提供的当前机器人姿势和映射任务提供的环境特征。SLAM 是一种集成了映射和本地化任务的解决方案。

2023-07-25

遗传算法遗传算法之路径规划matlab代码(栅格地图)含详细注释

常见的图形算法主要有以下几种:栅格法,拓扑法,自由空间法和可视法。栅格法根据特定分辨率将外部环境离散为相同大小的网格。每个栅格由状态表示,即占用状态和空闲状态,指示栅格位置是否是障碍物。路径规划算法占用一个栅格,并通过搜索自由栅格并避开障碍物来规划由多个栅格组成的路径。拓扑方法将机器人的工作环境图规划成几个小空间,并通过小空间之间的连接线建立拓扑网络结构,路径规划算法搜索拓扑网络以规划由拓扑连接线组成的路径。自由空间法将实际环境规划成两个区域,即可移动区域和不可移动障碍区域。组合连接可移动区域中每个线段的中点形成地图模型,移动机器人在其中进行路径规划。视觉方法将初始位置,障碍的各个转折点和目的地两两相连,组成多线段路径结构。通过路径规划算法,可以在这些线段上规划从起始位置到目的地的完整路径。

2023-07-25

[二维装箱问题]二维装箱问题之BL法修正版附MATLAB代码

二维装箱问题顾名思义就是将若干个矩形物品装进矩形箱子中,并且在装箱的过程中不允许将矩形物品斜着放(PS:下图就是不允许的装箱操作),同时在装箱过程中允许将物品旋转90度放置(但是为了简单地求解问题,我们规定不允许将物品旋转90度),一般来说求解的目标是最小化箱子的使用数目。 02 | 算法描述 BL法全称是bottom-up left-justified,通俗点来说将一个要装箱的物品1先紧靠在箱子的右上角,然后将物品1向下移动一直移动到再也不能向下移动为止,于是就如下图所示。 在上图基础上,再将物品向左移动到再也不能移动为止,然后再向下移动,然后再向左移动,……,一直到不能移动为止,最终物品1就装箱完成(PS:这个图可能看不出来,案例解析中会充分体现这一思想)。

2023-07-24

【混合粒子群算法】混合粒子群算法求解TSP问题matlab代码

标准粒子群算法通过追随个体极值和群体极值完成极值寻优,虽然操作简单,且能够快速收敛,但是随着迭代次数的不断增加,在种群收敛集中的同时,各粒子也越来越相似,可能在局部最优解周围无法跳出。混合粒子群算法摒弃了传统粒子群算法中的通过跟踪极值来更新粒子位置的方法,而是引进了遗传算法中的交叉和变异操作,通过粒子同个体极值和群体极值的交叉以及粒子自身变异的方式来搜寻全局最优解。 旅行商问题(traveling salesman problem,TSP)又称为推销员问题、货郎担问题,该问题是最基本的路线问题。该问题寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到起点的最小路径成本。最早的旅行商问题的数学模型是由Dantzig(1959)等人提出的。旅行商问题是车辆路线问题(VRP)的特例,已证明旅行商问题是NP难题。

2023-07-24

【动态粒子群算法】基于动态粒子群算法的动态环境寻优算法 MATLAB代码

粒子群算法的思想源于对鸟群觅食行为的研究,鸟群通过集体的信息共享使群体找到最优的目的地。如下图,设想这样一个场景:鸟群在森林中随机搜索食物,它们想要找到食物量最多的位置。但是所有的鸟都不知道食物具体在哪个位置,只能感受到食物大概在哪个方向。每只鸟沿着自己判定的方向进行搜索,并在搜索的过程中记录自己曾经找到过食物且量最多的位置,同时所有的鸟都共享自己每一次发现食物的位置以及食物的量,这样鸟群就知道当前在哪个位置食物的量最多。在搜索的过程中每只鸟都会根据自己记忆中食物量最多的位置和当前鸟群记录的食物量最多的位置调整自己接下来搜索的方向。鸟群经过一段时间的搜索后就可以找到森林中哪个位置的食物量最多(全局最优解)。

2023-07-24

蚂蚁算法基于蚁群算法的二维路径规划附matlab代码

在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法。其中, 模拟蚁群觅食过程的蚁群优化算法(Ant Colony Optimization, A CO) 和模拟鸟群运动方式的粒子群算法(ParticleS warm Optimization,PSO) 是两种最主要的群智能算法。 蚁群算法是一种源于大自然生物世界的新的仿生进化算法,由意大利学者M.Dorigo, V.Mani ezzo和A.Color ni等人于20世纪90年代初期通过模拟自然界中蚂蚁集体寻径行为而提出的一种基于种群的启发式随机搜索算法[1].蚂蚁有能力在没有任何提示的情形下找到从巢穴到食物源的最短路径,并且能随环境的变化,适应性地搜索新的路径,产生新的选择。其根本原因是蚂蚁在寻找食物时,能在其走过的路径上释放一种特殊的分泌物――信息素2,随着时间的推移该物质会逐渐挥发,后来的蚂蚁选择该路径的概率与当时这条路径上信息素的强度成正比。

2023-07-24

聚类算法聚类算法代码附MATLAB & python代码

K-Means(K均值)聚类 算法步骤: (1) 首先我们选择一些类/组,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置。这需要我们提前预知类的数量(即中心点的数量)。 (2) 计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划分到哪一类中。 (3) 计算每一类中中心点作为新的中心点。 (4) 重复以上步骤,直到每一类中心在每次迭代后变化不大为止。也可以多次随机初始化中心点,然后选择运行结果最好的一个。

2023-07-24

【量子遗传算法】量子遗传算法附matlab代码

量子遗传算法(quantum genetic algorithm,QGA)是量子计算与遗传算法相结合的产物,是一种新发展起来的概率进化算法。 遗传算法是处理复杂优化问题的一种方法,其基本思想是模拟生物进化的优胜劣汰规则与染色体的交换机制,通过选择、交叉、变异三种基本操作寻找最优个体。由于GA不受问题性质、优化准则形式等因素的限制,仅用目标函数在概率引导下进行全局自适应搜索,能够处理传统优化方法难以解决的复杂问题,具有极高鲁棒性和广泛适用性,因而得到了广泛应用并成为跨学科研究的热点。但是,若选择、交叉、变异的方式不当,GA会表现出迭代次数多、收敛速度慢、易陷入局部极值的现象。 量子计算中采用量子态作为基本的信息单元,利用量子态的叠加、纠缠和干涉等特性,通过量子并行计算可以解决经典计算中的NP问题。1994年Shor提出第一个量子算法,求解了大数质因子分解的经典计算难题,该算法可用于公开密钥系统RSA;1996年Grover 提出随机数据库搜索的量子算法,在量子计算机上可实现对未加整理的数据库 量级的加速搜索。量子计算正以其独特的计算性能迅速成为研究的热点。

2023-07-24

免疫算法基于免疫优化算法的物流配送中心选址问题附Matlab代码

物流是将货物从仓库运输至需求地的运送过程,包括多种基本功能如装卸、搬运、运输、流通、加工等。所需运输的货物从生产地运至需求地的过程,需要建立一个中心场地来进行货物的集中分配,建立中心场地的目的就是使货物高效快捷的到达需求地,这个中心场地就是物流分配中心,物流分配中心选址受到物资的分布、运输情况等多方面因素的影响,考虑各方面因素来合理规划配送中心的具体位置对物流行业的发展起着至关重要的作用。本文研究的重点就是通过构建数学模型,利用智能软件科学规划物流配送中心的位置。 免疫算法是一种智能算法,它是受到生物免疫系统调制的启发推出的一种智能优化算法。免疫优化算法是一种既有生成又包含检测迭代过程的高级智能化优化算法。

2023-07-24

【模拟退火算法】模拟退火算法(SA)求解配送中心选址问题附MATLAB代码

多配送中心选址问题可以描述为:某个地区内有若干个需求点,已知各个需求点的需求量,现欲在该区域内若干个配送中心备选点中选择一部分,建立配送中心,以满足该地区需求点的需求,并使得包括固定费用、运输费用以及存储费用在内的总费用最少。 为了简化问题,我们先做出如下假设: 1)仅在给定的配送中心备选点中选择一部分建立配送中心。 2)运输费用与运量成正比。 3)配送中心容量足够大,可以满足所有需求。 4)各需求点的需求量已知。 模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其冷却。加温时,固体内部粒子随温升变为无序状,内能增大;而冷却时粒子渐趋有序,在每个温度上都达到平衡态,最后在常温时达到基态,内能减为最小。

2023-07-24

【RF时序预测】基于随机森林算法的时间序列预测附matlab代码

随机森林算法是一种集成学习方法,通过组合多个决策树来进行分类和回归。 算法的原理如下: 建立多个决策树:随机森林由多个决策树组成,每个决策树都是独立地从训练数据中随机采样得到的。这种随机采样可以通过自助法(bootstrap)或者随机子集法(random subspace)进行。 随机特征选择:在每个决策树的节点上,只考虑部分特征进行分裂。这样可以增加决策树之间的差异性,提高整体模型的准确性。常用的特征选择方法有全特征选择和随机特征选择。 决策树的构建:根据选定的特征进行划分,使得每个子节点上的样本尽量属于同一类别或具有相似的回归值。通常使用信息熵、基尼系数等指标来评估划分质量。重复这个过程直到达到预定的停止条件。 集成投票/平均:对于分类问题,随机森林通过投票机制来确定最终的预测结果。每个决策树对样本进行分类,最后选择得票最多的类别作为整个随机森林的预测结果。对于回归问题,随机森林通过平均每个决策树的预测值来得到最终的预测结果。 随机森林算法具有很好的鲁棒性和泛化能力,能够有效地处理高维数据和大规模数据集,并且对于特征的缺失和噪声有较好的容错性。

2023-07-24

RF分类基于随机森林算法的数据分类附matlab代码

随机森林(Random Forest)是一种集成学习算法,用于解决分类和回归问题。它由多个决策树组成,每个决策树都是通过对训练数据进行自助采样(bootstrap)得到的。 基于随机森林的数据分类步骤如下: 准备数据集:将数据集划分为特征矩阵(X)和目标变量(y)。 随机选择样本:对于每个决策树,从样本集中随机选择一部分样本进行训练,这样每个决策树都使用了不同的样本。 构建决策树:使用训练样本集构建决策树模型。在每个节点上,通过选择最佳特征和划分标准来划分数据。 重复步骤2和3:重复步骤2和3,构建多个决策树。 进行预测:对于分类问题,通过投票或多数表决来确定最终的分类结果。对于回归问题,通过取平均值来确定最终的预测值。

2023-07-24

蚁群算法蚁群算法求解TSP问题附Python代码

当有很多蚂蚁觅食时,刚开始每个蚂蚁会随机选择一条路径,并在该路径中释放信息素,路径短的蚂蚁要比路径长的更先到达目的地,往返的频率也更快,所有该路径上的信息素更浓。信息素也会随着时间会有部分挥发。当下一代蚂蚁觅食时,下一代蚂蚁会选择信息素浓度高的路径走,而选择该路径的蚂蚁最多,又会释放更多的信息素,因此由大量蚂蚁组成的蚁群集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。蚁群算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。

2023-07-20

蚁群算法蚁群算法求解TSP问题附matlab代码

蚁群算法简介:蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此指导自己的运动方向。 当有很多蚂蚁觅食时,刚开始每个蚂蚁会随机选择一条路径,并在该路径中释放信息素,路径短的蚂蚁要比路径长的更先到达目的地,往返的频率也更快,所有该路径上的信息素更浓。信息素也会随着时间会有部分挥发。当下一代蚂蚁觅食时,下一代蚂蚁会选择信息素浓度高的路径走,而选择该路径的蚂蚁最多,又会释放更多的信息素,因此由大量蚂蚁组成的蚁群集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。蚁群算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。

2023-07-20

RRT算法基于采样的运动规划算法-RRT求解机器人路径规划附Matlab代码

RRT是Steven M. LaValle和James J. Kuffner Jr.提出的一种通过随机构建Space Filling Tree实现对非凸高维空间快速搜索的算法。该算法可以很容易的处理包含障碍物和差分运动约束的场景,因而广泛的被应用在各种机器人的运动规划场景中。RRT*算法的核心在于两个过程:重新选择父节点和重布线。这两个过程相辅相成,重新选择父节点使新生成的节点路径代价尽可能小,重布线使得生成新节点后的随机树减少冗余通路,减小路径代价。

2023-07-20

【概率路图算法】概率路图法(PRM)路径规划算法附Matlab完整代码

概率路图法很好的解决了在高维空间中构造出有效路径图的困难。该算法通过在构形空间中进行采样、对采样点进行碰撞检测、测试相邻采样点是否能够连接来表示路径图的连通性。此方法的一个巨大优点是,其复杂度主要依赖于寻找路径的难度,跟整个规划场景的大小和构形空间的维数关系不大。 然而当规划的路径需要通过密集的障碍物或者需要经过狭窄的通道时,PRM方法的效率变的低下。    路线图算法(probabilistic roadmap method,PRM)主要分为两个阶段,离线学习阶段中随机采样大量的机器人位姿点,为每个节点搜索邻居节点并建立连接,构建出路标地图;在线查询阶段中根据起始点,目标点,路标地图信息,采用启发式搜索算法从路标图搜索出一条可行路径。路线图算法可以有效避免对位姿空间中障碍物进行精确建模,能够有效解决复杂的运动动力学约束下的路径规划问题。

2023-07-20

路径规划基于遗传算法实现机器人栅格地图路径规划附Matlab代码

遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法 则,它最初由美国Michigan大学的J. Holland教授于1967年提出。 • 遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一 定数目的个体(individual)组成。因此,第一步需要实现从表现型到基因型的映射即编码工作。初代种群产生之后,按照 适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度 (fitness)大小选择个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉和变异,产生出代表新 的解集的种群。这个过程将导致种群像自然进化一样,后生代种群比前代更加适应于环境,末代种群中的最优个体经过解 码(decoding),可以作为问题近似最优解。

2023-07-20

路径规划基于模糊逻辑算法实现机器人路径规划附Matlab代码

模糊逻辑算法 模糊逻辑算法是在模糊控制理论的基础上产生、发展而来的优化算法。应用模糊逻辑算法解决路径规划问题的原理是将源于生理学中生物机体内在反应机制的“感知—-—动作—–行为”与模糊控制先天所带有的强鲁棒性相融合,设计一个描述对象输入输出动态行为的模糊控制器,根据对传感器感知、获取的信息的分析,预测机器人未来的输出即下一步控制移动方向,从而达到路径规划的效果。模糊逻辑算法操作简单,路径规划时无需构建精确、系统的数学模型,而且鲁棒性强,有很好的容错能力,但是实际应用中算法存在着“对称无法确定”的现象。

2023-07-20

【双向RRT算法】基于改进双向RRT*的移动机器人路径规划算法附Matlab源码

针对复杂环境下移动机器人的局部最优路径规划,提出一种基于目标偏置扩展和Cantmull-Rom样条插值的双向RRT*路径规划算法.双向RRT*算法同时创建两颗搜索树,交替进行相向搜索,同时以一定的概率进行随机点的目标偏置选择,以提高算法的整体收敛效率;再对当前节点重选父节点和重布线,以增强算法对环境的敏感程度.为确保路径安全可行,对环境中的障碍物进行膨胀处理,再对初始路径进行碰撞检测;修剪冗余节点,缩短可行路径长度,再利用Cantmull-Rom样条插值法平滑路径.在Matlab仿真平台和ROS机器人仿真平台分别进行2D和3D的对比实验,验证了改进双向RRT*算法的有效性和优越性.

2023-07-20

A*算法机器人路径规划之A*算法附Matlab语言源码

A*(念做:A Star)算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度。本文在讲解算法的同时也会提供Python语言的代码实现,并会借助matplotlib库动态的展示算法的运算过程。 A*算法最初发表于1968年,由Stanford研究院的Peter Hart, Nils Nilsson以及Bertram Raphael发表。它可以被认为是Dijkstra算法的扩展。 由于借助启发函数的引导,A*算法通常拥有更好的性能。 广度优先搜索 为了更好的理解A*算法,我们首先从广度优先(Breadth First)算法讲起。 正如其名称所示,广度优先搜索以广度做为优先级进行搜索。 从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点。 这种算法就像洪水(Flood fill)一样向外扩张。

2023-07-20

【人工势场法】机器人路径规划-人工势场法(Artificial Potential Field)附完整代码

986 年 Khatib 首先提出人工势场法,并将其应用在机器人避障领域, 而现代汽车可以看作是一个高速行驶的机器人,所以该方法也可应用于汽车的避障路径规划领域。 人工势场法的基本思想是在障碍物周围构建障碍物斥力势场,在目标点周围构建引力势场,类似于物理学中的电磁场 被控对象在这两种势场组成的复合场中受到斥力作用和引力作用,斥力和引力的合力指引着被控对象的运动,搜索无碰的避障路径。 更直观而言, 势场法是将障碍物比作是平原上具有高势能值的山峰, 而目标点则是具有低势能值的低谷。

2023-07-20

【K-means聚类】K-means聚类与DBSCAN原理及代码实现

在机器学习算法中,按照学习方式来划分,分为有监督学习、无监督学习、半监督学习、强化学习。其中,在无监督学习(supervised learning)中,训练的样本的标记信息是未知的,我们的目标是对无标记训练样本的学习来揭示输入数据的内在性质和规律,从而可对数据进行下一步的分析。K-means聚类与DBSCAN原理及代码实现 “聚类算法”是无监督学习中经常使用的算法,因此今天我们来聊聊两种典型聚类算法:K-means聚类算法及DBSCAN聚类算法。 通常来说,聚类是将数据集中的样本划分为若干个不相交的子集,每个子集称为一个簇(cluster),并且每个子集可能都对应于一些潜在的类别。但我们需要注意的是,这些类别,或者说聚类产生的子集的概念,对于聚类算法而言事先是未知的。 聚类过程仅能自动形成簇结构,簇所对应的概念语义需要人为的把握和命名。聚类算法既能够作为一个单独的过程,用于寻找数据内在的分布结构,也可作为分类等其他学习任务的前驱过程。

2023-07-20

蚁群算法蚁群算法求解三维路径规划问题附MATLAB完整代码

蚁群算法(Ant Colony Algorithm,ACA)于1992年在首次提出,该算法模拟了自然界中蚂蚁的觅食行为。蚂蚁在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素。信息素浓度的大小表征路径的远近,信息素浓度越高,表示对应的路径距离越短。    通常,蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,以增强该条路径上的信息素浓度,这样,会形成一个正反馈。最终,蚂蚁能够找到一条从巢穴到食物源的最佳路径,即距离最短。 用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。    路径较短的蚂蚁释放的信息素量较多,随着时间的推进,较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也愈来愈多。    最终,整个蚂蚁会在正反馈的作用下集中到最佳的路径上,此时对应的便是待优化问题的最优解。

2023-07-20

【BP神经网络】基于粒子群优化算法(PSO)的Bp神经网络预测21~22赛季NBA总冠军(附MATLAB代码)

基于粒子群优化算法(PSO)的Bp神经网络为各位预测一下今年的NBA总冠军花落谁家。 1995年,受到鸟群觅食行为的规律性启发,James Kennedy和Russell Eberhart建立了一个简化算法模型,经过多年改进最终形成了粒子群优化算法(Particle Swarm Optimization, PSO) ,也可称为粒子群算法。 粒子群算法的思想源于对鸟群觅食行为的研究,鸟群通过集体的信息共享使群体找到最优的目的地。如下图,设想这样一个场景:鸟群在森林中随机搜索食物,它们想要找到食物量最多的位置。但是所有的鸟都不知道食物具体在哪个位置,只能感受到食物大概在哪个方向。每只鸟沿着自己判定的方向进行搜索,并在搜索的过程中记录自己曾经找到过食物且量最多的位置,同时所有的鸟都共享自己每一次发现食物的位置以及食物的量,这样鸟群就知道当前在哪个位置食物的量最多。在搜索的过程中每只鸟都会根据自己记忆中食物量最多的位置和当前鸟群记录的食物量最多的位置调整自己接下来搜索的方向。鸟群经过一段时间的搜索后就可以找到森林中哪个位置的食物量最多(全局最优解)。

2023-07-19

【分支定界算法】分支定界算法求解0-1背包问题附MATLAB完整加密代码

在分支定界过程中,在剪支后如何从搜索树中剩下的节点(子问题)中选择一个节点继续进行分支也将影响整个分支定界的收敛速度,本文我们将使用深度优先策略。 深度优先含义如下:把分支定界树的层数定义为节点的深度,深度优先策略是选择具有最大深度的节点进行分支,从而快速找到可行解。

2023-07-19

【人工蜂群算法】人工蜂群算法附Python完整代码

整个ABC算法Python代码共包含两个.py文件,即artificial_bee_colony.py和app.py。这里需要注意的是,需要各位自行安装ypstruct库,安装方法可以参考https://pypi.org/project/ypstruct/。

2023-07-19

【混合K-Means蚁群算法】混合K-Means蚁群算法求解CVRP问题附Matlab完整代码

算法分为两个阶段,具体流程如下: 阶段1:改进K-Means聚类 步骤 1:根据需求量总和与车辆载重的比值确定聚类数量; 步骤2:随机选择个需求点坐标,作为各聚类中心的初始值,并设置聚类簇容量为车辆载重; 步骤3:将需求点按照需求量由大至小的顺序排序,依次将需求点分配至相应的簇中。如需求点的具体分配流程如下:计算需求点与各聚类簇的距离,同时判断将需求点分配至距离最小的簇后,簇的剩余容量是否满足,若满足,将需求点分配给簇,否则需求点分配至**距离次优的簇**,并判断是否满足簇的剩余容量,重复以上步骤,直至完成需求点的分配; 步骤4:完成所有需求点的分配后,重新计算个簇的重心,更新各聚类中心坐标; 步骤5:判断新聚类中心坐标与原聚类中心坐标的差值是否大于设定的阈值,若大于,则转至步骤2;否则,保存聚类结果,改进K-Means聚类算法结束。 阶段2:配送路径规划 经过阶段1的聚类后,每个聚类簇内的需求点需求量总和均小于车辆载重,可以分别安排一辆车配送,即通过改进K-Means算法将CVRP转为MTSP。再使用蚁群算法(或其他经典启发式算法) 对每一个聚类簇分别优化配送路径。

2023-07-19

GSK算法性能强悍的自适应GSK算法附Matlab完整代码

讲解Gaining‑sharing knowledge based algorithm(GSK),为什么讲解这个算法呢,因为自适应GSK算法(Adaptive Gaining-Sharing Knowledge Based Algorithm,AGSK)是CEC2020比赛的优胜算法。在讲解性能强悍的AGSK算法前,有必要先理解GSK的基本思想,而后再向深刻理解AGSK算法迈进。 GSK算法的灵感来源于人在一生中获取和共享知识的过程,这个过程分为两个阶段: 1)初级获取和共享知识阶段,即人一生的前中期。在这一阶段,相比于通过大型网络(如工作、社交、朋友等)获取知识,人们更多地会通过小型网络(如家人、邻居、亲戚等)获取知识。虽然这一阶段的人们想法、观点尚未成熟,但是他们努力尝试分享自己的观点。 2)高级获取和共享知识阶段,即人一生的中后期。这一阶段的人们通常会通过大型网络(如工作、社交、朋友等)获取知识,比如,这一阶段的人们通常喜欢成功学,相信成功者的观点,以使他们避免失败。这一阶段的人们思想十分成熟,他们会积极向他人分享自己的观点,期望帮助他人能从自己的分享中受益。

2023-07-19

【BP回归预测】基于BP神经网络的回归预测附matlab完整代码

基于反向传播(Backpropagation, BP)神经网络的回归预测是一种常见的机器学习方法,用于预测连续型变量的值。下面将介绍基于BP神经网络的回归预测的基本原理和步骤。 数据准备:收集回归预测所需的训练数据,包括输入特征和对应的目标变量(连续型值)。 网络结构设计:选择合适的BP神经网络结构,包括输入层、隐藏层和输出层的节点数、层数以及激活函数的选择。网络结构的设计应根据具体问题和数据特点进行调整。 数据预处理:对输入特征和目标变量进行预处理,如归一化或标准化处理,以提高网络训练的效果和准确性。 网络训练:使用训练数据对BP神经网络进行训练,通过反向传播算法来更新网络参数,使得网络的输出逼近目标变量。 网络验证和调整:使用验证数据评估网络的性能,并根据验证结果进行网络结构的调整,如调整隐藏层节点数、增加正则化项等,以提高网络的泛化能力。 网络测试:使用测试数据对训练好的BP神经网络进行性能评估,验证其在未知数据上的预测准确性和鲁棒性。 结果分析:分析网络输出与目标变量之间的差异,评估网络的预测精度和准确性,并根据需要进行进一步优化或改进。

2023-07-19

【RBF时序预测】基于径向基神经网络的时间序列预测附matlab完整代码

基于径向基神经网络(Radial Basis Function Neural Network, RBFNN)的时间序列预测是一种常见的预测方法,下面将介绍基本原理和步骤。 数据准备:将时间序列数据进行预处理,包括去除趋势、平稳化、归一化等操作,以提高预测的准确性。 特征提取:根据具体需求,提取适当的特征用于预测。常见的特征包括时间延迟、滞后项、移动平均值等。 网络结构设计: 输入层:根据选择的特征,设计相应数量的输入节点。 隐含层:使用径向基函数(如高斯函数)作为激活函数,设计适当数量的隐含层节点。 输出层:设计一个输出节点或多个输出节点,用于预测目标变量。 网络训练: 初始化权重和偏置:随机初始化网络的权重和偏置。 前向传播:将输入数据通过隐含层传递到输出层,得到预测结果。 反向传播:计算预测结果与实际值之间的误差,并通过反向传播算法调整权重和偏置。 重复迭代:重复进行前向传播和反向传播,直到达到停止条件(如达到最大迭代次数或误差小于阈值)。

2023-07-19

【CNN时序预测】基于卷积神经网络的CNN时间序列预测matlab完整代码

基于卷积神经网络(CNN)的时间序列预测是一种使用CNN模型来处理时间序列数据并进行预测的方法。相比于传统的基于循环神经网络(RNN)的方法,CNN在处理时间序列数据时具有一些独特的优势。 以下是基于CNN的时间序列预测的基本步骤: 数据准备:将时间序列数据集分为训练集和测试集。训练集用于训练CNN模型,测试集用于评估模型的预测性能。 数据转换:由于CNN是基于图像处理的模型,需要将时间序列数据转换为二维图像数据。常用的方法有滑动窗口法和傅里叶变换法等。 CNN模型构建:构建一个包含卷积层、池化层和全连接层的CNN模型。卷积层用于提取时间序列数据中的特征,池化层用于降低特征维度,全连接层用于输出预测结果。 模型训练:使用训练集对CNN模型进行训练。通过反向传播算法更新模型的权重和偏置,以最小化预测误差。 模型预测:使用训练好的CNN模型对测试集进行预测。输入测试集的图像数据,通过前向传播算法得到预测结果。 模型评估:使用预测结果与测试集的真实值进行比较,计算预测误差、均方根误差等指标,评估模型的预测性能。

2023-07-19

【LSTM时序预测】基于长短期记忆网络的时间序列预测附matlab完整代码

LSTM的核心思想是通过三个门控单元(input gate、forget gate、output gate)来控制记忆单元中的信息流动,从而灵活地控制信息的存储和遗忘。下面是LSTM的基本原理: 输入门(Input Gate):输入门控制新的输入信息进入记忆单元。通过对输入数据和上一个时间步的隐藏状态进行操作,得到一个介于0和1之间的数值,表示是否接受新的输入。 遗忘门(Forget Gate):遗忘门控制何时遗忘之前的记忆。通过对输入数据和上一个时间步的隐藏状态进行操作,得到一个介于0和1之间的数值,表示是否保留之前的记忆。 记忆单元(Memory Cell):记忆单元负责存储和传递长期依赖信息。它根据输入门和遗忘门的控制,决定是否更新和保留记忆。 输出门(Output Gate):输出门控制从记忆单元输出的信息。通过对输入数据和上一个时间步的隐藏状态进行操作,得到一个介于0和1之间的数值,表示输出的权重。 LSTM的计算过程可以简单地概括为以下几个步骤。

2023-07-19

蚁群算法求解三维路径规划问题(附MATLAB代码)

我们在蚁群算法通俗讲解(附MATLAB代码)和基于蚁群的二维路径规划算法(附MATLAB代码)这两篇推文中讲解到蚁群算法的精髓就是信息素,接下来围绕着缩小搜索空间、转移至下一点概率、信息素更新这三个方面详细进行讲解。 01 | 缩小搜索空间 在进行环境建模时,我们已经把整个搜索空间离散为一系列的三维离散点,这些离散点为蚁群算法需要搜索的节点。我们先回到图3,假设用22个等间距切面沿着边AB把空间ABCD-A1B1C1D1进行等分。因为边AB长度为21km,所以切面之间的间距为1km。 因此,从起点(1,10,800)到终点(21,8,1200)寻找一条路径的过程实际上可分解为在第2~20的切面上寻找另外的19个点。那么这19个点如何确定呢? 首先我们需要明确每个切面上的所有离散点是否都被考虑为转移点?答案是否定的。因为如果一个切面上的所有离散点都被考虑的话,会极大增加算法的求解时间。 因此,我们需要根据上一点的坐标(x1,y1,z1)来缩小下一切面中被考虑的离散点数量。缩小方式如下,我们认为机器人在y方向和z方向上移动的范围有限,即机器人在y方向移动范围为Δy,在z方向移动范

2023-03-20

文化算法(Cultural Algorithm,CA)

不同于遗传算法只有种群进化空间,文化算法包含信念空间、种群空间两个进化空间,因此,文化算法是一种双层进化系统。既然存在两个进化空间,那么这两个进化空间之间有何联系显然是第一个需要考虑的问题。 下图为文化算法的基本结构,该图清晰地展示了信念空间与种群空间是通过接收函数(accept())和影响函数(influence())进行联系的。 通过上图实际上可以看出,种群空间和信念空间是各自保存自己群体的两个相对独立的进化过程,并各自独立演化。但是,种群空间定期贡献精英个体给信念空间,信念空间不断进化自己的精英群体来影响种群空间群体。

2023-03-20

模拟退火算法(SA)求解多配送中心选址问题

从物流发展的趋势来看,配送中心不仅执行一般的物流职能,而且要越来越多地执行指挥调度、处理信息等职能,是整个物流网络的关键所在,受到各方面的广泛重视,因此,物流配送中心的合理选择是企业发展的战略决策问题。 一个成功的配送中心选址方案,可以缩短配送距离,加快配送速度,降低配送成本,提高服务质量,还可以促进生产和消费的有机协调与衔接,使整个物流系统处于平衡发展的状态。配送中心选址决策就是要确定配送中心的数量、位置及每个配送中心服务的客户群体。 配送中心的选择要遵循经济性原则,即要找到成本最低的地方,所以通常我们建立的配送中心选址模型的目标函数基本上都是总费用最低。为了建模方便以及简化计算,文献中通常会做出若干假设,从而简化总费用的计算,如现有文献中基本上都只考虑固定建设费用和运输费用,不考虑货物周转费用。 在实际的选址过程中,存储费用是影响配送中心运行效益的一个重要因素。存储费用是物资在库存过程中发生的费用,一般与存储数量和存储时间成正比关系,存储费用包括仓库保管费用、存货损坏费用等。仓库保管费用是指仓库的保险费、税金等,存货损坏费用是指存货的陈旧贬值及过时削价损失等。由于不同仓库存储

2023-03-20

分支定界算法求解0-1背包问题(附MATLAB代码)

分支定界算法求解0-1背包问题(附MATLAB代码)

2023-03-20

Gaining‑sharing knowledge based algorithm(GSK)算法

GSK算法的灵感来源于人在一生中获取和共享知识的过程,这个过程分为两个阶段: 1)初级获取和共享知识阶段,即人一生的前中期。在这一阶段,相比于通过大型网络(如工作、社交、朋友等)获取知识,人们更多地会通过小型网络(如家人、邻居、亲戚等)获取知识。虽然这一阶段的人们想法、观点尚未成熟,但是他们努力尝试分享自己的观点。 2)高级获取和共享知识阶段,即人一生的中后期。这一阶段的人们通常会通过大型网络(如工作、社交、朋友等)获取知识,比如,这一阶段的人们通常喜欢成功学,相信成功者的观点,以使他们避免失败。这一阶段的人们思想十分成熟,他们会积极向他人分享自己的观点,期望帮助他人能从自己的分享中受益。

2023-03-20

混合K-Means蚁群算法求解CVRP问题(附Matlab代码)

1.算法设计步骤 算法分为两个阶段,具体流程如下: 阶段1:改进K-Means聚类 步骤 1:根据需求量总和与车辆载重的比值确定聚类数量; 步骤2:随机选择个需求点坐标,作为各聚类中心的初始值,并设置聚类簇容量为车辆载重; 步骤3:将需求点按照需求量由大至小的顺序排序,依次将需求点分配至相应的簇中。如需求点的具体分配流程如下:计算需求点与各聚类簇的距离,同时判断将需求点分配至距离最小的簇后,簇的剩余容量是否满足,若满足,将需求点分配给簇,否则需求点分配至**距离次优的簇**,并判断是否满足簇的剩余容量,重复以上步骤,直至完成需求点的分配; 步骤4:完成所有需求点的分配后,重新计算个簇的重心,更新各聚类中心坐标; 步骤5:判断新聚类中心坐标与原聚类中心坐标的差值是否大于设定的阈值,若大于,则转至步骤2;否则,保存聚类结果,改进K-Means聚类算法结束。 阶段2:配送路径规划 经过阶段1的聚类后,每个聚类簇内的需求点需求量总和均小于车辆载重,可以分别安排一辆车配送,即通过改进K-Means算法将CVRP转为MTSP。再使用蚁群算法(或其他经典启发式算法) 对每一个聚类簇分别优化配送路径

2023-03-20

人工蜂群算法MATLAB源码

蜜蜂是一种群居生物,生物学家研究发现蜜蜂以跳舞的方式来交换蜜源信息。根据分工的不同,蜜蜂被分为三个工种:引领峰、跟随蜂、侦察蜂。 侦察蜂的职责是侦察蜜源(即蜜蜂的食物),一旦某一个侦察蜂找到蜜源后,实际上它的角色就切换为引领蜂了。 找到蜜源后的引领峰以跳舞的方式向同伴传递自己找到食物的信息,这时候一些饥饿的、没有找到食物的蜜蜂就会沿着引领峰指明的方向去寻找食物,这些相信引领峰传递的信息的蜜蜂实际上就是跟随蜂。这实际上属于招募蜜蜂的行为。 当引领峰寻找了多次蜜源后,发现再也找不到吃起来更香的蜜源后,引领峰说话的信服力会降低,于是跟随蜂也逐渐不相信引领峰传递的信息。 引领峰痛定思痛,决心转变角色,做回侦察蜂。直到再次找到高质量的蜜源后,再做回引领峰,然后再带着大伙吃香的、喝辣的。这实际上属于放弃蜜源的行为。 综上,蜂群实现群体智慧的最小搜索模型包括蜜源、引领蜂、跟随蜂和侦察蜂共4个组成要素,以及招募蜜蜂和放弃蜜源2种基本的行为。

2023-03-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除