✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 具体问题可以私信或扫描文章底部二维码。
(1)针对超多目标优化问题中因目标维数增加导致的选择压力衰退以及种群收敛性与多样性难以平衡的核心难题,本研究首先提出了一种基于向量角度和聚类的多目标进化算法。在超多目标空间中,传统的基于帕累托支配关系的算法失效,大部分个体互不支配。为此,本算法引入环境选择策略,首先通过适应度评估筛选出收敛性较好的个体。随后,利用聚类技术将种群划分为若干个子群,每个子群代表解空间的一个特定区域。在每个聚类内部,采用最大向量角度准则来选择个体,即保留那些与同类中其他个体方向差异最大的解。这种策略有效地防止了种群在某一局部区域的过度聚集,确保了最终解集能够均匀地覆盖整个帕累托前沿。在DTLZ系列测试函数上的仿真表明,该方法在高维目标空间中依然能够保持优异的分布性和收敛性。
(2)为了解决帕累托前沿形状复杂多变导致的评估误差问题,本研究提出了一种基于标量投影和分解的超多目标进化算法。传统的基于参考向量的方法往往假设帕累托前沿是规则的(如单纯形),当面对不规则前沿时效果不佳。本算法创新性地提出了一种前沿形状估算机制,根据种群在进化过程中的分布特征动态拟合前沿面。在此基础上,引入标量投影策略,将高维空间中的个体投影到特定的超平面上,利用投影点之间的欧氏距离来精确度量个体的相似性和拥挤程度。同时,采用分解策略将超多目标问题转化为一组单目标子问题进行协同进化。这种方法极大地提高了对个体相似性评估的准确度,有效地避免了算法在处理具有长尾、断续或退化前沿的问题时陷入局部最优。WFG测试集的实验结果证实,该算法能够精确捕捉帕累托前沿的几何特征,显著提升了求解质量。
(3)针对大规模决策变量与复杂前沿并存的挑战,本研究提出了基于最大向量角度选择与参考向量自适应的进化算法,以及基于问题转换的大规模优化策略。前者通过设计一种动态聚合函数,根据进化阶段自适应调整收敛性(个体到理想点的距离)与多样性(个体与参考向量的夹角)的权重,并让参考向量跟随种群中的精英个体进行自适应更新,从而灵活适应各种扭曲或不规则的帕累托前沿。后者则针对大规模决策变量问题,提出双向搜索方向生成策略,在决策空间中引导种群进化,并通过降维技术将大规模问题转换为低维子问题求解,大幅降低了计算复杂度。在LSMOPs等大规模测试集上的对比实验表明,所提算法在处理成千上万个决策变量时,仍能保持高效的收敛速度和良好的解集分布,验证了双向参考向量和问题转换策略在解决“维数灾难”方面的有效性。
import numpy as np
import math
class MaOEA_Research:
def __init__(self, n_objectives, n_vars, pop_size=100):
self.M = n_objectives
self.D = n_vars
self.pop_size = pop_size
self.ref_vectors = self.generate_ref_vectors()
def generate_ref_vectors(self):
# Simplified generation of reference vectors on a unit simplex
# In practice, use Das and Dennis method
vectors = np.random.rand(self.pop_size, self.M)
row_sums = vectors.sum(axis=1)
return vectors / row_sums[:, np.newaxis]
def cal_vector_angle(self, vec1, vec2):
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
if norm1 == 0 or norm2 == 0:
return 0
cos_theta = np.dot(vec1, vec2) / (norm1 * norm2)
return np.arccos(np.clip(cos_theta, -1.0, 1.0))
def scalar_projection(self, population, ideal_point):
# Project individuals onto a hyperplane for diversity estimation
translated_pop = population - ideal_point
# Simplified projection logic
norms = np.linalg.norm(translated_pop, axis=1)
normalized = translated_pop / norms[:, np.newaxis]
return normalized
def adaptive_reference_update(self, population, current_refs):
# Adjust reference vectors based on current population distribution
# Identifying active reference vectors
new_refs = np.copy(current_refs)
# Logic: if a ref vector has no associated individuals, move it towards dense area
# This is a placeholder for the complex adaptation logic
return new_refs
def environmental_selection(self, population, objectives):
# 1. Convergence check based on distance to ideal point
ideal_point = np.min(objectives, axis=0)
dists = np.linalg.norm(objectives - ideal_point, axis=1)
# 2. Diversity check based on vector angles to reference vectors
# Associate each individual with closest reference vector
association = np.zeros(len(population), dtype=int)
angle_dists = np.zeros(len(population))
normalized_objs = objectives - ideal_point
for i in range(len(population)):
min_angle = float('inf')
best_ref = -1
for j in range(len(self.ref_vectors)):
angle = self.cal_vector_angle(normalized_objs[i], self.ref_vectors[j])
if angle < min_angle:
min_angle = angle
best_ref = j
association[i] = best_ref
angle_dists[i] = min_angle
# Selection logic (simplified APD - Angle Penalized Distance)
scores = dists * (1 + population.shape[1] * angle_dists)
selected_indices = np.argsort(scores)[:self.pop_size]
return population[selected_indices], objectives[selected_indices]
def decompose_problem(self, objectives, weights):
# Tchebycheff decomposition approach
# g = max(w_i * |f_i - z*_i|)
ideal = np.min(objectives, axis=0)
tch_vals = np.max(weights * np.abs(objectives - ideal), axis=1)
return tch_vals
def run_generation(self, population, objectives):
# 1. Variation (Crossover/Mutation) - omitted for brevity
offspring = population + np.random.normal(0, 0.1, population.shape) # dummy variation
offspring_objs = np.abs(offspring[:, :self.M]) # dummy objective calc
combined_pop = np.vstack((population, offspring))
combined_objs = np.vstack((objectives, offspring_objs))
# 2. Update Ideal Point
# 3. Selection
new_pop, new_objs = self.environmental_selection(combined_pop, combined_objs)
# 4. Adapt References
self.ref_vectors = self.adaptive_reference_update(new_pop, self.ref_vectors)
return new_pop, new_objs

如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
2860

被折叠的 条评论
为什么被折叠?



