用两个目标。最小成本和最大满意度用python写出NSGA2精英策略中的快速非支配排序函数和计算拥挤度函数
快速非支配排序函数:
def fast_non_dominated_sort(population):
# Initialize domination count and domination set for each individual
domination_count = [0] * len(population)
dominated_set = [[] for _ in range(len(population))]
frontiers = [[]]
# Update domination count and dominated set for each individual
for i in range(len(population)):
for j in range(len(population)):
if i == j:
continue
if dominates(population[i], population[j]):
dominated_set[i].append(j)
elif dominates(population[j], population[i]):
domination_count[i] += 1
if domination_count[i] == 0:
population[i].rank = 1
frontiers[0].append(i)
# Calculate subsequent frontiers
i = 0
while frontiers[i]:
next_frontier = []
for ind in frontiers[i]:
for j in dominated_set[ind]:
domination_count[j] -= 1
if domination_count[j] == 0:
population[j].rank = i + 2
next_frontier.append(j)
i += 1
frontiers.append(next_frontier)
return frontiers
计算拥挤度函数:
def calculate_crowding_distance(frontier, objectives):
# Initialize crowding distance for each individual
crowding_distance = [0] * len(frontier)
# Calculate crowding distance for each objective
for obj in range(len(objectives)):
# Sort individuals in the frontier based on objective value
sorted_frontier = sorted(frontier, key=lambda x: x.objectives[obj])
# Set boundary points' crowding distance to infinity
crowding_distance[0], crowding_distance[-1] = float('inf'), float('inf')
# Calculate crowding distance for non-boundary points
for i in range(1, len(sorted_frontier)-1):
crowding_distance[i] += (sorted_frontier[i+1].objectives[obj] - sorted_frontier[i-1].objectives[obj]) / (objectives[obj].max - objectives[obj].min)
return crowding_distance
``
原文地址: https://www.cveoy.top/t/topic/ceXt 著作权归作者所有。请勿转载和采集!