解决一些未知数必须是整数的方程式

时间:2010-06-08 06:53:22

标签: algorithm

解决 s t 1 ... t n 最小化以下总和:

Σ n k = 1 (1 - min( s · <子> ķ C <子> ķ )/最大(取值· <子> ķ C <子> ķ< / EM> )),

其中

C 1 ... C n &gt; 1, s &gt; 0, t 1 ... t n ∈ℤ +


编辑以澄清问题描述:

“你需要多快的算法。”不是超快(但不是多秒)。 n将在5-10左右左右。

就实际问题而言,我在“页面”上有许多不同大小的“元素”,这个页面需要翻译成一个格式,其中X元素的最大基本大小,并且元素的基本大小必须是整数。但是,在新格式中,任何元素都可以通过为页面设置的单个缩放因子来扩展。

所以C 1 ... C n 是原始页面上元素的大小。 t 1 ... t n 是新页面格式的新整数。 (并且t 1 ... t n 需要小于X.)新页面格式的缩放因子是s。


更多:

就我之前所做的,我找到原始页面上的最大元素,如果它小于X,我只使用新页面上的现有元素大小,但将每个元素舍入为整数。但是,如果原始页面上的最大元素大于X,我将其大小除以X以获得新页面的缩放因子s,并除以C 1 ... C n by s得到t 1 ... t n 。但这导致新页面上每个元素的平均大小差异为1-3%,但最大。并不是那么明显,但我是一个完美主义者。

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

请使用Maple,Mathcad或Sage。这是一个软件列表,可以帮助您:http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems

答案 2 :(得分:1)

我认为无理由给出了正确的答案。你需要阅读一本关于“非线性整数规划”的书。我没有推荐你的好书,但你可以通过去图书馆找到一些东西。

我不认为lp_solve对你来说不够好,因为你无法将你的问题重写为混合整数整数线性规划问题(MILP)。 Maple和Mathcad不是一个好主意,因为你不是在寻找符号代数包。

我猜我们这本书会告诉你做分支。这是一个示意图:

1)开始解决一个广义问题,其中t_k都是真正的prsitime数

最小化Σnk= 1(1 - min(s·tk,Ck)/ max(s·tk,Ck)), 在约束条件下,s> 0,t1 ...tn∈R+

。您可以使用广义牛顿方法来执行此操作。 Matlab和scipy提供了开箱即用的广义求解器,但要小心,因为你的函数可能有几个局部最小值。

2)找到此解决方案后,您可以执行分支步骤。选择变量t_k和整数a_k,并独立解决以下两个问题

问题1 最小化Σnk= 1(1 - min(s·tk,Ck)/ max(s·tk,Ck)), 在约束条件下,s> 0,t1 ...tn∈R+和t_k <= a_k

问题2 最小化Σnk= 1(1 - min(s·tk,Ck)/ max(s·tk,Ck)), 在约束条件下,s> 0,t1 ...tn∈R+和t_k> = a_k

3)继续执行分支步骤,直到将问题分解为一组子问题,每个子问题都有一个整数解决方案。然后,您可以比较这些整数解决方案并选择最佳解决方案。

正如您可能已经猜到的那样,这种描述在某种程度上是示意性的。您需要良好的分支规则来分支正确的方法,并且您需要良好的边界规则以避免遵循不合适的分支。