【发布时间】:2018-02-21 01:09:37
【问题描述】:
我有 n=4 个人名为 A、B、C 和 D。有些人可以属于同一组,有些则不能。该信息由以下给出(编码为R)
comparisons = c("A-B", "A-C", "A-D", "B-C", "B-D", "C-D")
areEnemies = c(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE)
从这些数据来看,A 和 D 个人是敌人,不能属于同一个群体。个人C 和D 和敌人也不能属于同一组。所有其他人都是朋友(当你某人不是你的敌人时,那么他就是你的朋友)。
我的目标是创建群组,以便
- 最小化组数
- 个人可以属于一个或多个组(但必须至少属于一个组)
- 如果两个人是敌人,那么他们绝不能属于同一组。如果两个人是朋友(不是敌人),那么他们必须至少在同一组中一次。
- 如果一个人可以属于一个群体,那么它必须!
上述示例的解决方案(使用小写字母作为组名)是
-
A属于组a -
B属于a组和b组 -
C属于组a -
D属于组b
我无法解决这个问题。你能帮我一把吗?
如果您想编写代码,我欢迎 R、C、C++、Java、Bash、Python,但对过程(或伪代码)的口头描述已经非常有帮助。请注意,性能不会受到太大关注,因为我通常只有 5-10 个人,并且不会经常运行此过程。
【问题讨论】:
-
这是一道作业题吗?如果是这样,把它放在那里让其他人知道可能会很好。 :)
-
这不是家庭作业问题(我正在攻读遗传学博士学位,不参加任何课程)。我尝试了一些失败的方法,但在原始问题和此处提供的简化版本之间存在相当大的差距,我需要一些时间来重新格式化我失败的尝试。
-
所以上面的编码中缺少 friends 吗?您的实际实例有多大?
-
@sasha 任何不是敌人和朋友的人。所以所有需要的输入数据都存在于上面的代码中。我通常有大约 5-10 个人。性能是先验的,不会很重要(我打算在
R中编写代码)。 -
鉴于 我通常有大约 5-10 个人。性能是先验的,不会很重要:只需编写一个蛮力求解器。这是非常基本的编程。对于性能关键和更大的实例,我会推荐整数编程、约束编程、SAT 求解:经典的离散优化方法。 编辑 我也对这些规则持怀疑态度。 4的目的是什么?我觉得不够正式。也许有一种情况:给定 G=3 组的解决方案将只有 1 个分组;而另一个 G=3 解决方案可能有 > 1 个分组。