在约束满足中最大化指定变量的数量

时间:2013-02-21 08:17:38

标签: algorithm language-agnostic constraint-programming constraint-satisfaction

有哪些已知的算法(或查找算法的资源)可以找到最大化约束满足问题中指定变量数量的赋值(如果不存在令人满意的赋值)?

2 个答案:

答案 0 :(得分:0)

对于线性方程,线性代数可用于查找自由度的数量,从而可以找到可分配的自变量的数量。

修改:

仔细考虑一下你的问题,我认为Simplex Algorithm可能对你有所帮助。它是一种优化算法,可以找到线性优化问题的最佳整数解。

编辑2:

让可行区域成为提供的仓库。

示例:

假设您有2个库类型,X和Y.

X需要提供5种油和7种钢。

Y需要提供8种油和2种钢。

您希望最大化提供的数据库数量:

函数最大化= X + Y

条件:

X&lt; = X型的仓库总数 Y <= Y型贮库的总数 5X + 8Y&lt;总供油量 7X + 2Y&lt;总供应量

应用Simplex算法,瞧!

答案 1 :(得分:0)

您是否希望最大化满足约束的数量,而不是分配变量?我想到了你可以从最大化分配变量的数量中获得什么(直到你通常看到至少有一个约束被违反),并且在我看来,你想要的东西沿着可满足的最大约束子集的线。否则我可能不理解你的优化标准。

如果您想要这个可满足约束的最大子集,一个想法是将您的问题转换为约束优化问题,找到最小化违反约束数量的赋值,然后选择此赋值满足的所有约束条件构造可满足约束的最大子集。

我将在下面使用加权约束满足问题(WCSP)的框架。

鉴于您将约束表示为允许或不允许的部分分配表,您可以通过简单地分配允许的分配成本0和不允许的分配成本1来转换约束。也就是说,只要约束不允许变量赋值,这会产生费用。因此,最小化成本的分配最小化了它违反的约束的数量,这相当于最大化满足约束的数量。一旦你有这样的赋值,通过迭代所有约束并检查赋值是否满足它们,应该很容易构造一个可满足约束的最大子集。 WCSP的一个好的求解器是toulbar2,它可以计算给定WCSP的最低成本分配。

如果您将约束表示为表,则从约束满足问题(CSP)构造WCSP很简单。加权约束只是表格的表格

X_1 X_2 … X_n   c

1    1 …   1    0 

1    2 …   1    0 

... 

2    2 …   3    1

2    2 …   4    1

这里我们对n个变量X_1,...,X_n有一个约束,其中变量可以接受来自有限域{1,2}和{1,2,3,4}的值。假设你用“T”标记一个允许的元组,用“F”标记一个不允许的元组,转换金额用成本0替换“T”,用成本1替换“F”。

请注意,这不是实际的WCSP格式。该格式在上面链接的toulbar2包中有详细描述。

当然,约束的更紧凑表示将需要更精细的转换,这可能会根据您的表示而任意增加。那时您可能想要查看其他内容。

相关问题