【问题标题】:Algorithm to find the optimal group of compatible elements寻找最优兼容元素组的算法
【发布时间】:2015-11-04 17:20:10
【问题描述】:

我有一组实体,我需要将这些实体分组到称为specie 的组中。定义的所有物种集合调用Universe,并且一个实体必须属于一个且仅属于一个物种。为此,我有一个名为f 的布尔不传递函数,如果通过参数传递的两个实体兼容,则返回该函数。 specie 由一组相互兼容的实体定义,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);
    }
}

【问题讨论】:

  • 顺便说一句:物种的单数就是物种。 Specie 是一个完全不同的词。
  • 不幸的是,您的解决方案是O(n^3),而我的解决方案是O(n^4)。如果性能对您来说是个问题,我可能会想到一种更快的计算方法。
  • 你能提供什么是输入,什么是输出。复杂性应该是多少。
  • 不幸的是,我的解决方案是错误的。看来这个问题比我还难。我认为它是 NP 难的,所以唯一可能的精确算法将是指数的......

标签: java algorithm grouping combinations combinatorics


【解决方案1】:

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

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

因此,求最小物种数的问题等价于用最小的团数覆盖图。这个问题被称为minimum clique cover 并且是NP-complete。

【讨论】:

  • 这也相当于Graph Colouring,如果你把每条边都变成非边,反之亦然。 (如果有人想找到求解器实现,我会提到这一点......)
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 2010-09-11
  • 2014-04-19
  • 2011-07-23
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多