smpso解决离散问题:

初学者可以在网上找到各类遗传算法或粒子群算法的模板,这里提供一个比较基础简单的例子,用离散的粒子群来解决自己的问题,供大家参考


jMetalPy框架:

jMetalPy提供了很多算法的模板,都能在它的官网找到
粒子群:OMOPSO、SMPSO
其他遗传进化算法:GDE3、HYPE、MOCell、MOEA/D、NSGA-Ⅱ、NSGA-Ⅲ、SPEA2
官网有很多实现的例子,这里只展示“实现smpsoProblem类”的方法

SMPSO简介:


SMPSO算法流程如下:
1、初始化操作:包括种群大小、存档大小、迭代次数、每个粒子的速度为0.0,粒子位置(一般都是随机生成),历史最优pbest为其本身
2、根据目标函数的评估在决策空间中随机初始化得到粒子群初始化存档(存储最优解)gbest在其中根据一定的方法选取
3、更新速度、更新位置
4、对每个粒子增加的一些变异操作
5、根据目标函数对每一个粒子做评估操作得到新的粒子群
6、更新存档,更新gbest和pbest
位置更新公式:

速度更新公式:

w是惯性权重,r1、r2是[0,1]均匀分布的随机数,C1、C2是控制pbest和gbest影响的参数(其中w =0.1,1.5< C1,C2<2.5)

引入压缩因子(用于控制粒子的更新速度):


此后进一步限定每个变量j的累积速度,使用以下速度收缩方程:

实现Problem:

官网有提供Problem的模板,其中需要我们实现和修改的有:
1、一些的初始化:如约束个数、变量个数等
2、根据自身需要而设计的目标函数
3、evaluate函数
4、约束(如果需要约束的话)

def evaluate(self, solution: FloatSolution) -> FloatSolution:#一些变量variable1 = np.array([[0, 1, 0, 1, 1],[1, 0, 0, 1, 0],[0, 0, 0, 0, 1],[1, 1, 0, 0, 0],[1, 0, 1, 0, 0]])variable2 = np.array([[0, 20, 0, 10, 13],[20, 0, 0, 8, 0],[0, 0, 0, 0, 9],[10, 8, 0, 0, 0],[13, 0, 9, 0, 0]])variable3 = np.array([5, 4, 7, 3, 1])variable4 = np.array([0.3, 0.4, 0.5, 0.7, 0.1])variable5 = 2#目标函数结果result1 = self.function1(variable1,solution.variables)result2 = self.function2(variable2,solution.variables)result3 = self.function3(variable3, variable4, variable5)solution.objectives[0] = result1solution.objectives[1] = result2solution.objectives[2] = result3self.__evaluate_constraints(solution)return solution

evaluate函数会返回一个Solution,用于后续的计算,可选不同的类型如FloatSolution、IntegerSolution等。(注意:在实现SmpsoProblem类的时候需要传入一个Problem,若传入的是IntegerProblem则最终会返回一个IntegerSolution)

def __evaluate_constraints(self, solution: FloatSolution) -> None:constraints = [0.0 for _ in range(self.number_of_constraints)]x = solution.variables# x0+x1+x2+x3+x4>=1constraints[0] = x[0]+x[1]+x[2]+x[3]+x[4]-1solution.constraints = constraints

在更新外部存档的时候,需要求支配关系,这时会自动调用evaluate_constrains进行检查,若有约束关系,需要提前设置好,否则结果会出错。这里设置的约束是所有变量的和要大于等于1。

离散的smpso:

离散的粒子群的速度更新公式不变,而位置更新公式有所改变:它采取概率映射方式,采用sigmoid函数将速度映射到 [0, 1] 区间作为概率,这个概率就是粒子下一步取值为1的概率。


rand()是[0,1]中均匀分布的随机数

jMetalPy提供的包里包含了smpso.py,为了方便修改,可以将其单独提出来,这里需要修改的是位置更新的部分。

def update_position(self, swarm: List[FloatSolution]) -> None:for i in range(self.swarm_size):particle = swarm[i]for j in range(particle.number_of_variables):#离散粒子群的位置更新p = 1 / (1 + np.exp(-self.speed[i][j]))rand = random.random()if(rand < p):particle.variables[j] = 1else:particle.variables[j] = 0if particle.variables[j] < self.problem.lower_bound[j]:particle.variables[j] = self.problem.lower_bound[j]self.speed[i][j] *= self.change_velocity1if particle.variables[j] > self.problem.upper_bound[j]:particle.variables[j] = self.problem.upper_bound[j]self.speed[i][j] *= self.change_velocity2

此处为简化演示,最直接粗暴的计算p和获取随机数rand

前面也有提到,若传入的是IntegerProblem,其返回的也是IntegerSolution。但是我们在速度、位置更新等过程中需要的是Float类型的变量(jMetalPy包装的比较好,后续直接使用Solution进行计算)而为了解决离散型的问题,我们的变量x0、x1…又需要是Integer类型,所以这里直接重写了一个IntegerProblem。

class IntegerProblem(Problem[FloatSolution], ABC):def __init__(self):super(IntegerProblem, self).__init__()self.lower_bound = Noneself.upper_bound = Nonedef create_solution(self) -> FloatSolution:new_solution = FloatSolution(self.lower_bound,self.upper_bound,self.number_of_objectives,self.number_of_constraints)#随机生成离散变量new_solution.variables = \[int(random.uniform(self.lower_bound[i] * 1.0, self.upper_bound[i] * 1.0))for i in range(self.number_of_variables)]return new_solution

主要重写的是对变量进行初始赋值的部分,保证我们的x0、x1、....是Integer类型,返回的还是FlostSolution


例子比较简单可以根据实际需要来修改,本人也是新手,上述都是是自己对着代码文档加上自己理解完成的,若有错误欢迎指出!

smpso解决离散问题相关推荐

  1. 微星h61m主板jsp1接线图_微星主板jspi1怎么接,jspi1怎么接线

    微星主板jspi1怎么接,jspi1怎么接线 时间:2018-10-23 09:20:41 作者:知网查重入口 阅读:次 高考网权威发布江苏警官学院:http://www.jspi.cn,更多江苏警官 ...

  2. 蜜蜂采蜜最短路径c语言算法,粒子群算法解最短路径.doc

    摘要 粒子群优化算法(Particle Swarm Optimization,PSO)是由美国的Eberhart和Kennedy在1995年提出的一种高效的并行优化算法.由于该算法具有深刻的智能背景, ...

  3. 使用森林优化算法的特征选择

    转自:FeatureselectionusingForestOptimizationAlgorithm Manizheh Ghaemi a,n, Mohammad-RezaFeizi-Derakhsh ...

  4. 遗传算法(Genetic Algorithms)的全面讲解及python实现

    一.主要思想 遗传算法的工作方式源自于生物学,是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法.其主要特点是直接对结构对象进行操作,不存 ...

  5. javaEE面试重点

    Hibernate工作原理及为什么要用? 原理: 1. 读取并解析配置文件 2. 读取并解析映射信息,创建SessionFactory 3. 打开Sesssion 4. 创建事务Transation ...

  6. 解决全局优化和离散问题的二进制多宇宙算法

    Binary multi‑verse optimization algorithm for global optimization and discrete problems 1.摘要 多宇宙算法已经 ...

  7. “人工智能的数理基础”主题论坛,五位学者从数学角度解决AI问题

    导语:来自北京大学的五位学者参加了"人工智能的数理基础"主题论坛,他们从数学.统计和计算的角度做了学术报告. 智东西5月9日消息,围绕当前人工智能面临的可计算性.可解释性.泛化性. ...

  8. PyTorch-09 循环神经网络RNNLSTM (时间序列表示、RNN循环神经网络、RNN Layer使用、时间序列预测案例、RNN训练难题、解决梯度离散LSTM、LSTM使用、情感分类问题实战)

    PyTorch-09 循环神经网络RNN&LSTM (时间序列表示.RNN循环神经网络.RNN Layer使用.时间序列预测案例(一层的预测点的案例).RNN训练难题(梯度爆炸和梯度离散)和解 ...

  9. MOPSO算法总结,包括OMOPSO,SMPSO,dMOPSO,CMPSO,DDMOPSO,MMOPSO等

    MOPSO学习小结: 一些基本的定义 1. 一般化的多目标优化问题即多目标优化问题的数学模型:(分最小化和最大化问题)决策空间和目标空间,不等和等式约束条件: 2. Parto支配关系,非劣解:(决策 ...

最新文章

  1. 删除index.php,从URL中删除index.php - Codeigniter 2
  2. JBPM回退功能的实现
  3. 迁移 Express 到函数计算
  4. TEG Cheers | 腾讯技术工程运维技术沙龙精彩回顾(内置现场视频)
  5. kafka partition分配_Kafka架构原理,也就这么回事
  6. C语言试题五十七之假定输入的字符串中只包含字母和*号。请编写函数function,它的功能是:删除字符串中所有*号。在编写函数时,不得使用c语言提供的字符串函数。
  7. dos命令查看oracle_home,Oracle - OraDb10g_home1配置方法+DOS命令
  8. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
  9. windows mysql备份与恢复_windows下Mysql自动备份与恢复说明
  10. 3-汇编语言中与内存访问相关的寄存器/操作(DS+数据段+SS/SP+栈相关操作)
  11. logstash zip linux安装,centos7.4安装测试logstash6.5.0
  12. 产品 电信nb接口调用_NB-IoT 平台对接常见问题(中国电信)
  13. 语义相似度(实践篇)
  14. throw e 和 return 的浅显理解
  15. How to debug Windows bugcheck 0x9F, parameter 3
  16. JetBrain Clion下载安装及配置环境
  17. 线性非齐次微分方程的求解套路
  18. Python不是大蟒蛇,是个 BBC 电视剧?编程语言都是如何命名的?
  19. asterisk、pbx、sip等基本概念
  20. 【STM32技巧】ADC模拟量采集的几种用法

热门文章

  1. Java 基本数据类型以及封装类
  2. java闹钟_闹钟程序隔30分钟提醒一次 再隔5分钟提醒一次 JAVA如何实现?
  3. 办公软件小课堂: 怎么设置Office为默认打开方式
  4. 音视频开发6. 搭建 ffmpeg Linux远程开发环境
  5. linux执行使分区生效的命令,Linux/Unix命令:partprobe 系统不重启而使新的磁盘分区生效...
  6. 实例讲解node.js解析URL并获取绝对路径和格式化
  7. 心怀美好,每天多一点微笑
  8. Grabcut算法详解
  9. Web网站模板-教育培训响应式网站模板(HTML+CSS+JavaScript)(1)
  10. Flask Cookies