基于numpy的帕累托前沿指数

2024-10-06 13:59:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图标记一些numpy向量(matrixm),以便标签显示Pareto前沿索引。在

例如,非支配向量集(v0)将用Pareto前沿指数0标记,非支配向量集v1v1=M-v0)将用索引1标记,非支配向量的下一个集合/边界v2v2=M-v0-v12等,直到矩阵M的所有向量都被标记。在

我已经把一些测试用例放在一起,但是不管我提出什么,要么效率极低(目前不太在意),要么就是不起作用。在

mat1 = np.asarray([
    [1, 2, 3, 4, 5, 7],
    [1, 2, 3, 4, 5, 6],
    [1, 2, 3, 4, 5, 6],
])

calc_fronts(mat1) == [0, 1, 1]

mat2 = np.asarray([
    [1, 2, 3, 4, 5, 7],
    [1, 2, 3, 4, 5, 6],
    [1, 22, 3, 4, 5, 6],
])

calc_fronts(mat2) == [0, 1, 0]


mat3 = np.asarray([
    [1, 2, 3, 4, 5, 7],
    [1, 2, 3, 4, 5, 5],
    [1, 2, 2, 4, 5, 4],
])

calc_fronts(mat3) == [0, 1, 2]


mat4 = np.asarray([
    [0, 2, 3, 4, 5, 7],
    [1, 2, 3, 4, 5, 6],
    [1, 22, 2, 4, 5, 6],
])

calc_fronts(mat4) == [0, 0, 0]

如果x中的每个a,y中的b:a>;=b中至少存在一个aa>;b的向量x支配y。在

这是我的尝试:

^{pr2}$

Tags: 标记gtnpcalc向量v2v1asarray
1条回答
网友
1楼 · 发布于 2024-10-06 13:59:47

这是我的一个相当繁重的尝试,希望能给你一些新的想法。但是要知道,创建了一个(m,m,n)temp数组(当M是(m,n)形状时)。在

import numpy as np

def calc_fronts(M):
    i_dominates_j = np.all(M[:,None] >= M, axis=-1) & np.any(M[:,None] > M, axis=-1)
    remaining = np.arange(len(M))
    fronts = np.empty(len(M), int)
    frontier_index = 0
    while remaining.size > 0:
        dominated = np.any(i_dominates_j[remaining[:,None], remaining], axis=0)
        fronts[remaining[~dominated]] = frontier_index

        remaining = remaining[dominated]
        frontier_index += 1
    return fronts

演示:

^{pr2}$

相关问题 更多 >