解决 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%,但最大。并不是那么明显,但我是一个完美主义者。
答案 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)继续执行分支步骤,直到将问题分解为一组子问题,每个子问题都有一个整数解决方案。然后,您可以比较这些整数解决方案并选择最佳解决方案。
正如您可能已经猜到的那样,这种描述在某种程度上是示意性的。您需要良好的分支规则来分支正确的方法,并且您需要良好的边界规则以避免遵循不合适的分支。