- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我被要求编写一个例程来决定产品配置器中可能组合的数量。
配置器非常简单。即使它具有更多功能,也可以将其建模为几个“无线电组”(如UI控件),其中必须选择n个选项之一。
可以使用的唯一约束类型是规则,该规则指出如果选择了一个选项,则不能选择另一个选项。
因此,我想做的是在给定一组选项组和约束的情况下,计算可以配置的不同产品的数量。
我天真地使用Inclusion-exclusion principle解决了这个问题。但是据我所知,任何基于此方法的算法都应在O(2 ^ n)中运行,这将无法正常工作。当然,有几种可能的优化应该可以提供不错的运行时,但是仍然很容易构建最坏的情况。
那就是我现在所在的位置。有什么建议?
更新资料
我意识到我还没有解释规则如何足够好地应用。
有几个选项组。每个组中必须选择一个且只有一个选项。一个组中可以有一个或多个选项。
只有一种约束。如果选择某组中的选项A,则无法选择其他组中的选项B。可以有任意数量的约束,对选项组或选项本身有多少个约束/规则没有限制。
因此,一个例子是:
第一组:
x1 x2 x3 x4 x5
第2组:
y1 y2 y3
第3组:
z1 z2 z3 z4
限制条件:
x1 <-> y2 *
x1 <-> z4
y2 <-> z2*
如果在组1中选择了选项x1,则不能在组2中选择选项y2。
使用包含-排除,我将计算组合的数量为
组合= Cno规则-Cr [1]
-Cr [2]-Cr [3] + Cr [1,2] + Cr [1,3] + Cr [2,3]-Cr [1,2,3]
哪里
Cno规则= 5 * 3 * 4
Cr [a,b,c] =违反规则a,b和c的组合数。
不幸的是,该方法需要2 ^ |规则|计算。
最佳答案
好的,我不能达到2 ^ N,但是我可以减少样本集。为此,我们将计算“组合约束”。组合约束是一种约束,其中,如果选择了左侧的所有选项,则不能选择右侧的所有选项,但是基于左侧选项的其他约束均不适用。
我们需要从一组约束中计算出一组所有可能的组合约束。虽然不是必需的,但如果右手的组小于左手的组,我们将通过交换左手和右手来“修复”现有约束。尽管可以使用更好的启发式方法,但是这可以减少一些组合约束。
我们还需要计算可以为每个组任意选择的选项“最小集”。通过从可用选项列表中删除出现在组合约束左侧的所有选项来计算此最小集合。
遵循一种算法,但是我不能证明它可以正确计算CC。我将证明,如果可以,那么它们可以用于计算可能组合的数量。
修正约束,使左手的组小于或等于右手的组。
组成约束:
用左手排序约束
对于每个约束,依次:
用相同的左手折叠约束并遵循所有约束,将x1 <-> y1
,x1 <-> y2
... x1 <-> yN
变成Set(x1) <-> Set(y1 ... yN)
如果满足以下条件,则将折叠约束与每个已经折叠的约束组成:
x1不在已折叠约束的右边
x1与左手元素不在同一组
将折叠约束及其所有组成部分添加到折叠约束集合中
通过选择所有选项并删除固定约束左侧出现的选项,计算最小集。
现在,您可以使用以下公式计算组合数量。我们称CC为复合约束。那么组合的数量是:
C(Mininum Set) + CCC1 + ... + CCCn
G1: x1, x2, x3
G2: y1, y2
G3: z1, z2, z3
R1: x1 <-> y2
R2: x3 <-> y2
R3: y1 <-> z1
R4: y2 <-> z2
R5: y2 <-> z3
CC1: {x1} <-> {y2}
CC2: {x3} <-> {y2}
CC3: {y1} <-> {z1}
CC4: {x1, y1} <-> {y2, z1}
CC5: {x3, y1} <-> {y2, z1}
CC6: {y2} <-> {z2, z3}
R1&R2: {x1, x3} <-> {y2} -- not in the list because x1 and x3 belongs to the same
group
R1&R5: {x1, y2} <-> {y2} -- not in the list because the left hand of R2, y2
appears in the right hand of R1
Minimum Set: (x2), (), (z1, z2, z3)
CC1: (x1), (), (z1, z2, z3) -- replace G1 with x1, remove y2 from G2
CC2: (x3), (), (z1, z2, z3) -- replace G1 with x3, remove y2 from G2
CC3: (x2), (y1), (z2, z3) -- replace G2 with y1, remove z1 from G3
CC4: (x1), (y1), (z2, z3) -- replace G1 with x1, G2 with y1, remove y2 and z1
CC5: (x3), (y1), (z2, z3) -- replace G1 with x3, G2 with y1, remove y2 and z1
CC6: (x2), (y2), (z1) -- replace G2 with y2, remove z2 and z3 from G3
C(Minimum Set) = 1 * 0 *3 = 0
CCC1 = 1 * 0 * 3 = 0
CCC2 = 1 * 0 * 3 = 0
CCC3 = 1 * 1 * 2 = 2
CCC4 = 1 * 1 * 2 = 2
CCC5 = 1 * 1 * 2 = 2
CCC6 = 1 * 1 * 1 = 1
C(Minimum Set) + CCC1 + CCC2 + CCC3 + CCC4 + CCC5 + CCC6
0 + 0 + 0 + 2 + 2 + 2 + 1 = 7
x1 x3 y1 y2 z1 z2 z3 Combinations
true false true false false true false 1
true false true false false false true 1
true false true false false false false 0
true false false false true false false 0
true false false false false true false 0
true false false false false false true 0
true false false false false false false 0
false true true false false true false 1
false true true false false false true 1
false true true false false false false 0
false true false false true false false 0
false true false false false true false 0
false true false false false false true 0
false true false false false false false 0
false false true false false true false 1
false false true false false false true 1
false false true false false false false 0
false false false true true false false 1
false false false true false false false 0
false false false false true false false 0
false false false false false true false 0
false false false false false false true 0
false false false false false false false 0
关于algorithm - 配置器中的组合数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1154565/
我有一个 mysql 表,其中包含一些随机数字组合。为简单起见,以下表为例: index|n1|n2|n3 1 1 2 3 2 4 10 32 3 3 10 4 4
我有以下代码: SELECT sdd.sd_doc_classification, sdd.sd_title, sdd.sd_desc, sdr.sd_upl
如果我有两个要合并的数据框 Date RollingSTD 01/06/2012 0.16 01/07/2012 0.18 01/08/2012 0.17 01/09/20
我知道可以使用 lein ring war 创建一个 war 文件,但它似乎仍然包含码头依赖项。当我构建 war (并在 tomcat 上部署)时,有没有办法排除码头依赖项? 如果我根本不能做这件事,
维基百科关于封装的文章指出: “封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性” 我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 gette
对于我使用的组合框内的复选框: AOEDComboAssociationName = new Ext.form.ComboBox({ id: 'AOEDComboAssociationName',
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I combine LINQ expressions into one? public boo
如何在 rust 中找到排列或组合的数量? 例如C(10,6) = 210 我在标准库中找不到这个函数,也找不到那里的阶乘运算符(这就足够了)。 最佳答案 以@vallentin 的回答为基础,可以进
我有一个复杂的泛型类型用例,已在下面进行了简化 trait A class AB extends A{ val v = 10 } trait X[T<:A]{ def request: T }
如何使用 Hibernate 限制来实现此目的? (((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z'))) 最佳答案 思考有效 Criteria c
我一定会在我的一个项目中使用谷歌图表。我需要的是,显示一个条形图,并且在条形图中,与每个条形相交的线代表另一个值。如果您查看下面的 jsfiddle,您会发现折线图仅与中间的条形图相交,并继续向其他条
只是一个简单的问题,我也很想得到答案,因为我不能百分百理解 Javascript 示例:假设您提示用户输入名称。够简单吧?但是你有一个数组,上面写着一些名字(其中之一就是),基本上就是我到目前为止所说
我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。 其实我有这两个功能: add:: Integer -> Integer -> Integer add x y = x
我正在寻找一种在 Realm 查询中组合 AND 和 OR 的方法。 这是我的课: class Event extends RealmObject { String id; String
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我是Combine 的新手,我想得到一个看似简单的东西。假设我有一个整数集合,例如: let myCollection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想以例如 0
关于“优先组合而不是继承”的问题,我的老师是这样说的: 组合:现有类成为新类的组件 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果 包装器:新类封装了现有的 这三个概念我不是
我正在尝试将单个整数从 ASCII 值转换为 0 和 1。相关代码如下所示: int num1 = bin.charAt(0); int num2 = bin.charAt(1);
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我经常看到“嵌套”类中的非静态变
我尝试合并两个数据集(DataFrame),如下所示: D1 = pd.DataFrame({'Village':['Ampil','Ampil','Ampil','Bachey','Bachey',
我是一名优秀的程序员,十分优秀!