我正在尝试解决整数线性规划问题的一个特例,但我似乎是算法上的堆栈。
具体来说,假设你有一些二进制变量x_{1}, ... x_{n}
和一些形式的不等式:
i.e. x_{2} + x_{3} + x_{10} <= 2
注意,不等式的系数都是一致的,右侧总是左侧的变量数减去1。
另外,请记住变量x_{1}, ..., x_{n}
可以取0或1的值。
这是一个功课(编写一个程序),但我找不到一个算法来启动。你能帮忙吗?
我尝试使用DP和Network Flow,但没有任何结果。 谢谢。
目标函数(在编辑中丢失)是最大化总和:
x_{1} + ... + x_{n}
答案 0 :(得分:1)
问题相当于Set Cover:http://en.wikipedia.org/wiki/Set_cover_problem#Integer_linear_program_formulation。轻松查看此问题的一种方法是将x_{i}
替换为1-y{i}
,这会产生等效的0-1线性编程问题,即
maximize (1-y_{1}) + (1-y_{2}) + ... + (1-y_{n}) = n - (y_{1} + ... + y_{n}),
which is equivalent to minimizing y_{1} + ... + y_{n},
subject to the following family of inequalities indexed by j:
(1-y_{i_{1j}}) + (1-y_{i_{2j}}) + ... + (1-y_{i_{kj}) <= k-1,
which are equivalent to:
y_{i_{1j}} + y_{i_{2j}} + ... + y_{i_kj} >= 1
问题的等效公式是Set Cover的0-1整数线性规划公式。
贪婪算法将在这种情况下提供合理的近似值。确定x_{i}
中最常出现在约束中的哪一个,并将其设置为等于0. x_{i0}
出现的所有约束现在都已满足,因此可以将它们从考虑中删除,并将变量{ {1}}可以从目标中移除。重复使用变量x_{i0}
,该变量最常出现在其余约束中,等等。
或者,实际线性编程也会提供近似值。
由于Set Cover是NP-hard,你能找到的最精确的解决方案将是指数级的。一个简单的算法只会尝试所有可能性(遍历从x_{i1}
到x_{n}x_{n-1}...x_{1}x_{0} = 00...00
的所有二进制数。如果搜索,肯定会有更快(但仍然是指数时间)的算法。