lingo比拼1stopt
1stopt软件近来受到大家的关注,不断有例子说明1stopt优于matlab,1stopt优于lingo。但是本人在解决一个问题时,始终无法让1stopt超越lingo,请各位大侠帮忙看看?问题:Min: – (x*sin(9*Pi*y) + y*cos(25*Pi*x) + 20)
Subject: x^2 + y^2 <= 9^2
lingo程序和结果
在lingo10下编程:model:
data:
PI=3.14159265358979;
Enddata
min=-(x*@sin(9*PI*y)+y*@cos(25*PI*x)+20);
x^2+y^2<=81;
@bnd(-10,x,10);@bnd(-10,y,10);
end
运算很容易得结果
Global optimal solution found at iteration: 262374
Objective value: -32.71789
Variable Value Reduced Cost
X -6.440027 -0.2206645E-08
Y -6.277974 0.000000
1stopt下程序和结果
Title "eg2";minfunction -(x*sin(9*PI*y)+y*cos(25*pi*x)+20); //Function ;
x^2+y^2<=81; //Variable ;
不同的算法计算出不同的结果,而且同一算法每次的结果都不相同,但是始终无法超越lingo下算得的结果。
比如用Levenberg-Marquardt法:
目标函数最小值: -32.2556873202941
x: -5.20002297536385
y: 7.05579611067263 用遗传算法:
目标函数最小值:-32.5267673325805
x: 7.36003137532735
y: 5.16683663847985 对比1stopt,lingo不仅结果较优,而且不需要设定算法、参数等。请教各位大侠有没有更好的用1stopt计算出来的结果? 一个软件或一种算法,针对某一道题,不能因为得到好结果就说明它好,也不能因为得的结果不好就证明它不好,要看其普适性。
1:就这道题而言,在Lingo代码,参数给了取值范围限制,即【-10,10】,而在1stOpt中却没有给任何取值范围。是否有取值范围限制,对计算结果影响是很大的。如在Lingo代码中,将取值范围那一行抹去的话,在Lingo 10下实验:
1.1:不启用“Use Global Solver”,结果是:
Objective value: -29.00000
Extended solver steps: 5
Total solver iterations: 4
Variable Value Reduced Cost
PI 3.141593 0.000000
X 0.000000 0.000000
Y 9.000000 0.000000
1.2:启用“Use Global Solver”,结果是:
Global optimal solution found.
Objective value: -32.69566
Extended solver steps: 23
Total solver iterations: 1404
Variable Value Reduced Cost
PI 3.141593 0.000000
X 6.640027 0.000000
Y 6.055744 0.4010455E-07
1.3:加上取值范围,如果不启用“Use Global Solver”选项:
Local optimal solution found.
Objective value: -32.49566
Extended solver steps: 5
Total solver iterations: 4
Variable Value Reduced Cost
PI 3.141593 0.000000
X -7.440032 0.000000
Y 5.055724 0.000000
都没有得到最优解。
2:看下这道题:失之毫厘谬以千里的优化测试题!(http://forum.vibunion.com/forum/thread-61983-1-1.html),Lingo无论如何都很难得到正解,而1stOpt只要取合适的参数就能得到最优解。
3:对本题运行下下面的1stOpt代码,几乎每次都能得到最优解.
Algorithm = SM2;
ParameterDomain = [-10,10];
minfunction -(x*sin(9*PI*y)+y*cos(25*pi*x)+20);
x^2+y^2<=81;
结果:
函数表达式: -(x*sin(9*pi*y)+y*cos(25*pi*x)+20)
目标函数值(最小): -32.71788781
x: -6.44002582276871
y: -6.27797201264919
约束函数
1: x^2+y^2-(81) = -0.1131348105
4:Lingo也是有很多选项及参数设定的。
5:Lingo和1stOpt各有优缺点。1stOpt语法简单易懂,书写自然,图形实时显示结果等。Lingo名声要比1stOpt大的多、历史也长很多,当然,据了解,价格也是后者的几十倍。 1stopt程序
Algorithm = SM2;
ParameterDomain = [-10,10];
minfunction -(x*sin(9*PI*y)+y*cos(25*pi*x)+20);
x^2+y^2<=81;
上述程序在1stopt1.5下试验了很多次,差不多要10次才能有一次能得正解。不知是否本人的1stopt版本太低?
Lingo程序:
model:
data:
PI=3.14159265358979;
Enddata
min=-(x*@sin(9*PI*y)+y*@cos(25*PI*x)+20);
x^2+y^2<=81;
@bnd(-10,x,10);@bnd(-10,y,10);
end
在lingo10下开启全局搜索器很容易得正解,之所以要限制x,y的范围,是由于在lingo中变量默认为非负,在非负的限制下当然无法求得正解。由于1stopt没有变量非负的默认,故没有添加范围限制,没想到这个看似多余的限制在1stopt中还管用! lingo程序或者改为
model:
data:
PI=3.14159265358979;
Enddata
min=-(x*@sin(9*PI*y)+y*@cos(25*PI*x)+20);
x^2+y^2<=81;
@free(x);@free(y);
end
每次都得正解
Global optimal solution found.
Objective value: -32.71789
Extended solver steps: 32
Total solver iterations: 4257
Variable Value Reduced Cost
PI 3.141593 0.000000
X -6.440026 0.4898098E-07
Y -6.277972 0.000000 对dingd举的那个函数,在1stopt下
Minfunction x1^x2+x2^x1-5*x1*x2*x3-85)^2+(x1^3*x2^x3*x3^x2-60)^2+(x1^x3+x3^x1-x2-0.55)^2;
运算得目标函数值(最小): 0.0646350179640092
x1: 4.83415107127034
x2: 2.43994999719108
x3: 0.616002909587514
在lingo10下,即使不开启全局搜索器也能够很快得出1stopt相同的结果。
程序:
model:
min=(x1^x2+x2^x1-5*x1*x2*x3-85)^2+(x1^3*x2^x3*x3^x2-60)^2+(x1^x3+x3^x1-x2-0.55)^2;
@free(x1);@free(x2);@free(x3);
end
运行得:
Local optimal solution found.
Objective value: 0.6463502E-01
Extended solver steps: 1
Total solver iterations: 148
Variable Value Reduced Cost
X1 4.834151 0.1081623E-08
X2 2.439950 0.7037460E-08
X3 0.6160029 -0.1360364E-07
如果如dingd说“Lingo无论如何都很难得到正解”,那请问正解是什么? 要说1stopt的优势,我找到个Schwefel测试函数:
Title "Type your title here";
Constant n = 50;
Parameters x(1:n)[-500,500];
Algorithm = MIO;
MinFunction Sum(i=1:n)(-x*sin(sqrt(abs(x))));
很快求得目标函数值(最小): -20949.1436981616
而用lingo,由于变量个数太多,只能用lingo8
model:
data:
n=50;
enddata
sets:
v/1..n/:x;
endsets
min=@Sum(v(i): -x(i)*@sin((@abs(x(i)))^(1/2)));
@for(v(I):@bnd(-500,x(I),500));
End
机器运行了几分钟(依赖计算机速度的不同,计算时间有所差异),终于算得如下结果:
Local optimal solution found at iteration: 201453
Objective value: -20830.71
从计算时间和计算结果上看,1stopt都有长处。
总结:变量个数不太多时,lingo具有长处;变量个数较多时,1stopt具有长处。
有不正确或者不充分的地方,请大家更正补充。 1:建议用高版本的1stOpt来测试。
2:那道测试函数,原链接不知看了没有?如果如此轻松就能得到最优解,原题的名称就有点名不副实了。实际最优解为0。用Lingo的再试试! 1:要说软件比较,有一定的前提:问题相同,硬件相同,算法相同,软件价钱相同。当然要做到全部有点难度,尤其价钱相同尤其难以做到。这里的比较都是基于免费软件前提下,lingo的免费软件是lingo8的注册版,lingo10的测试版,1stopt的免费版本是1.5。 2:找到原链接http://simwe.com/forum/viewthread.php?tid=806242&highlight=%28x1%5Ex2%2Bx2%5Ex1-5%2Bx1%2Bx2%2Bx3-85%29%5E2
原来我的结果早就遭到否定,我因为用1stopt1.5和lingo10算了多遍都是这个结果,以为就是正解。在lingo下开启全局搜索,不管是8.0还是10.0,lingo都要崩溃(这个应该是lingo的缺陷)。但是又试了在lingo8下直接搜索(不开启全局搜索),居然得到一个较优的解
Local optimal solution found at iteration: 16
Objective value: 0.000000
Variable Value Reduced Cost
X1 0.000000 0.000000
X2 0.000000 0.000000
X3 0.000000 0.000000
较低版本的lingo却得到较优的解确实是我没有想到的。不管怎样,用lingo总算得到正解,但是用1stopt1.5却没有得到这个解? 3:再看下列lingo程序
Model:
Max= 4.8*x11 + 4.8*x21 + 5.6*x12 + 5.6*x22 - 10*x1 - 8*x2 - 6*x3;
x11+x12 < x + 500;
x21+x22 < 1000;
x11 - x21 > 0;
2*x12 - 3*x22 > 0;
x=x1+x2+x3;
(x1 - 500) * x2=0;
(x2 - 500) * x3=0;
x1 < 500;
x2 < 500;
x3 < 500;
end
开启全局搜索器,经过几分钟的搜索,找到一个难以改进的局部最优:
Local optimal solution found at iteration: 1833
Objective value: 5000.000
Variable Value Reduced Cost
X11 0.000000 0.9000000
X21 0.000000 0.000000
X12 1500.000 0.000000
X22 1000.000 0.000000
X1 500.0000 0.000000
X2 500.0000 0.000000
X3 0.1576357E-04 0.000000
X 1000.000 0.000000
每次运行都是这个结果,显示出Lingo在复杂的非线性规划方面求解比较稳定。
在1stopt下编程:
Title "oil";
Parameters x(1:8);
Maximum = True;
Function 4.8*x1+4.8*x2+5.6*x3+5.6*x4-10*x5-8*x6-6*x7;
x1+x3<=x8+500;
x2+x4<=1000;
x1>= x2;
2*x3>=3*x4;
x8=x5+x6+x7;
(x5-500)*x6=0;
(x6-500)*x7=0;
x6<=500;
x7<=500;
x5<=500;
每个方法得出的解不太一致,最好最快的算法是差分进化法和准牛顿法,但是每次都只能找到4800这个局部最优解,比lingo算出的最优解5000可算是差了一截。
目标函数值(最大): 4799.99956448719
x1: 500.000250526012
x2: 500.00023304638
x3: 1.87262513619151E-5
x4: 1.04518670723203E-5
x5: 0.000270043801243453
x6: 6.17433411267437E-14
x7: 1.39869941119201E-14
x8: 0.000270045959651447 这样的讨论和比较是很有意义的,如果多个例子说明了在变量个数较少时lingo较有优势,这个结果是很重要的。因为我们遇到的优化问题大部分是形式复杂而变量个数较少的,这种情形下应该选择lingo软件。还有函数拟合本质上就是优化问题,而且拟合的参数一般个数不多,如果lingo在变量个数较少时具有优势,那么很多的函数拟合就应该用lingo来做。
页:
[1]
2