小编Pro*_*cus的帖子

NMinimize吃掉所有不必要的符号工作的记忆

下面的代码是一种天真的方法来查找其正方形具有n个除数的最小数字(最小值应为其对数,x_i为其素数因子分解中的幂).如果我看一下n = 2000的情况并且使用十个变量而不是二十个变量,那么这将使用大约600MB的内存.使用n的值我实际上试图找到答案,我需要大约20个变量以确保不会错过实际的解决方案,并且它会快速耗尽所有可用内存然后打开交换.

n=8*10^6;
a = Table[N[Log[Prime[i]]], {i, 20}];
b = Table[Subscript[x, i], {i, 20}];
cond = Fold[And, Product[2 Subscript[x, i] + 1, {i, 20}] > n,
   Table[Subscript[x, i] >= 0, {i, 20}]] && b \[Element] Integers;
NMinimize[{a.b, cond}, b, MaxIterations -> 1000]
Run Code Online (Sandbox Code Playgroud)

事实证明,问题与整数编程等无关(取消对整数的限制没有帮助).

我最好的猜测是问题是Mathematica浪费了所有内存扩展Product[2 Subscript[x, i] + 1, {i, 20}].如果我用just替换产品Product[Subscript[x, i],{i,20}]并更改约束>= 1而不是0我没有麻烦得到结果,并且没有内核使用超过50MB的内存.(虽然这保留了不等式约束并且没有改变最小化目标函数的任务,但它确实搞乱了完整性要求 - 我得到了甚至结果,这对应于实际问题中的半整数.)

StackOverflow上的一个人有类似的问题; 在他们的情况下,他们有一个客观的功能,正在以巨大的代价象征性地进行评估.他们能够通过使函数只接受数字输入来有效地修复它,从而有效地将它隐藏在Mathematica的"我有扩展[]锤子之后,一切看起来像钉子"的倾向.但是你不能隐藏这种函数背后的约束(Mathematica会抱怨它是一个无效的约束).

有关如何解决此问题的任何想法?

编辑:我知道正确的答案 - 在我的Mathematica代码不起作用之后我使用了AMPL和一个专用的MINLP解算器来获得它(很快).我只是想知道我怎么能希望能够在将来使用Mathematica的内置非线性优化功能,尽管当我以我知道的唯一方式进入它们时,它似乎与我的约束有关.

optimization wolfram-mathematica mathematical-optimization

3
推荐指数
1
解决办法
690
查看次数