MOEAD原理及Python实现、MOEAD实现、基于分解的多目标进化、 切比雪夫方法-(python完整代码)

本文介绍了MOEAD(多目标进化算法分解法)的原理和实现过程,包括确定解附近点的方法、均匀分布向量的选取,并提供了Python代码实现。作者为湘潭大学的魏雄,详细讲解了Person.py、Objective_Function、Moead_Util.py和实现.py等关键模块,展示了ZDT4测试函数的效果。
摘要由CSDN通过智能技术生成

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

确定某点附近的点

答:每个解对应的是一组权重,即子问题,红点附近的四个点,也就是它的邻居怎么确定呢?由权重来确定,算法初始化阶段就确定了每个权重对应的邻居,也就是每个子问题的邻居子问题。权重的邻居通过欧式距离来判断。取最近的几个。

取均匀分布向量

https://blog.csdn.net/Twobox/p/16408751.html

MOEAD实现

算法理解与流程

https://www.zhihu.com/question/263555181?sort=created其中两个回答都挺好的
1. 输入N m
# N表示取点密度 m表示问题维度
1.1 输入 T
# 表示取最近的T个作为邻居
2. 生成均匀分布权重向量
2.1 计算每个权重向量之间的欧拉距离
3. 权重向量个数即为:初始种群个数
4. 初始化种群,每个个体一一对应权重
4.1 更具权重之间距离,取前T个作为邻居person
5. EP = 空
# 维护成最优前沿
6. 计算最初的全局最优Z
# 把每个带入f1 f2中,取最小值 z1 z2
7. 开始循环N代
 7.1对于每个个体,在领域中选取2个个体进行交叉变异,获得2个新个体
 7.1.1更新全局解z
 7.2在领域中随机选择2个个体,用新个与旧个体进行对比
 # 新个体带入子目标问题,直接对比值即可
 7.3如果更优,则替换旧个体dna
 7.4更新EP
 # 如果有别接收的新解,将新解与EP每一个进行比较,删除被新解支配的,如果新解没有被旧解支配,那么加入EP

代码实现设计

# 分析
需要维护的数据结构:
 某个体最近的T位邻居: 可以考虑采用对象列表即可
 均匀分布的权重向量:一个二维ndarray数组即可
 权重向量与个体对应关系:个体对象,直接保存权重向量数组
 权重向量之间的距离矩阵:开局初始化,不变的
 EP list,里面的个体是对象的引用
 z list
 目标函数集合,F list domain list
 
# 接口设计
class Person
 attribute:
 dns:一维ndarray
 weight\_vector: 一维ndarray
 neighbor: list
 o\_func:Objective\_Function 目标函数
 function:
 mutation
 cross\_get\_two\_new\_dna:返回2段新dna
 compare#与子代比较
 accept\_new\_dna
 choice\_two\_person:p1,p2
​
class Moead\_Util
 attribute:
 N
 M
 T:
 o\_func:Objective\_Function
 pm:变异概率
 
 EP:[dna1,dna2,..]
 weight\_vectors:二维数组
 Euler\_distance:二维数组
 pip\_size
 Z:[] # 这里面元素为一维ndarray数组,即dna,即解
 
 function:
 init\_mean\_vector:二维数组
 init\_Euler\_distance:二维数组
 init\_population:[]
 init\_Z:一维属猪
 
 update\_ep
 update\_Z

class Objective\_Function:
 attribute:
 F:[]
 domain:[[0,1],[],[]]
 function:
 get\_one\_function:Objective\_Function

Person.py
 1 import numpy as np
 2 
 3 
 4 class Person:
 5     def \_\_init\_\_(self, dna):
 6         self.dna = dna
 7         self.weight\_vector =
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MOEA/D(Multi-Objective Evolutionary Algorithm based on Decomposition)是一种多目标优化算法,它通过将多目标问题转化为一组单目标子问题来求解。下面是一个简单的MOEA/D算法的Python代码示例: ```python import numpy as np # 定义问题的目标函数 def obj_func(x): f1 = x[0]**2 f2 = (x[0]-2)**2 return [f1, f2] # 定义MOEA/D算法 def moead(pop_size, max_gen, num_obj, num_var): # 初始化种群 population = np.random.rand(pop_size, num_var) # 初始化权重向量 weights = np.random.rand(pop_size, num_obj) # 迭代进化 for gen in range(max_gen): for i in range(pop_size): # 选择邻居个体 neighbors = select_neighbors(i, population) # 生成子问题的参考点 reference_point = generate_reference_point(neighbors, weights) # 更新个体 offspring = generate_offspring(i, neighbors, reference_point) # 更新种群 population[i] = offspring # 返回最终的非支配解集合 return population # 选择邻居个体 def select_neighbors(index, population): # 根据某种策略选择邻居个体 return neighbors # 生成子问题的参考点 def generate_reference_point(neighbors, weights): # 根据某种策略生成参考点 return reference_point # 生成子代个体 def generate_offspring(index, neighbors, reference_point): # 根据某种策略生成子代个体 return offspring # 示例运行 pop_size = 100 max_gen = 100 num_obj = 2 num_var = 1 result = moead(pop_size, max_gen, num_obj, num_var) print(result) ``` 这段代码实现了一个简单的MOEA/D算法,其中包括了目标函数的定义、种群初始化、邻居个体选择、参考点生成和子代个体生成等步骤。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值