找到最佳兼容元素组的算法

时间:2015-11-04 17:20:10

标签: java algorithm grouping combinations combinatorics

我有一组实体,我需要将这些实体分组为specie组。所有物种的集合定义了Universe,实体必须属于一个且只有一个物种。为此,我有一个名为f的布尔不及物函数,如果两个由参数传递的实体兼容,则返回该函数。 specie由一组彼此兼容的实体定义,universe由一组彼此不完全兼容的物种定义,假设两个物种的相容性由所有实体的兼容性。

如何确定包含给定实体集可能的最小物种数的Universe?

我尝试如下,我的函数返回一个有效的宇宙,但不是那个物种数量最少的宇宙。

public class Specie {
    private List<Entity> individuals;

    public Specie() {
        this.individuals = new ArrayList<>();
    }

    public boolean matches(Entity e) {
        for (Entity s : this.individuals) {
            if (!f(s, e)) {
                return false;
            }
        }
        return true;
    }

    public void add(Entity i) {
        this.individuals.add(i);
    }
}

private static int numberOfSpeciesRecursive(List<Entity> entities, List<Specie> universe) {
    if (entities.size() == 0) {
        return 0;
    } else {
        List<Entity> remains = new ArrayList<>();
        Specie specie = new Specie();
        for (Entity e : entities) {
            if (specie.matches(e)) {
                specie.add(e);
            } else {
                remains.add(e);
            }
        }
        universe.add(specie);
        return 1 + numberOfSpeciesRecursive(remains, universe);
    }
}

1 个答案:

答案 0 :(得分:4)

将实体视为图的顶点,如果实体兼容,则在顶点之间添加边。

在此结果图中,您对物种的定义对应于clique的定义。

因此,找到最小数量的物种的问题等同于覆盖具有最小数量的团队的图表。此问题称为minimum clique cover,并且是NP完整的。