woodballhead 发表于 2008-4-24 11:27

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

woodballhead 发表于 2008-4-24 11:29

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

woodballhead 发表于 2008-4-24 11:37

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

woodballhead 发表于 2008-4-24 11:38

用遗传算法:
目标函数最小值:-32.5267673325805
x: 7.36003137532735
y: 5.16683663847985

woodballhead 发表于 2008-4-24 11:40

对比1stopt,lingo不仅结果较优,而且不需要设定算法、参数等。请教各位大侠有没有更好的用1stopt计算出来的结果?

dingd 发表于 2008-4-24 14:57

一个软件或一种算法,针对某一道题,不能因为得到好结果就说明它好,也不能因为得的结果不好就证明它不好,要看其普适性。

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大的多、历史也长很多,当然,据了解,价格也是后者的几十倍。

woodballhead 发表于 2008-5-4 23:31

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中还管用!

woodballhead 发表于 2008-5-4 23:35

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

woodballhead 发表于 2008-5-4 23:49

对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无论如何都很难得到正解”,那请问正解是什么?

woodballhead 发表于 2008-5-5 00:15

要说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具有长处。
有不正确或者不充分的地方,请大家更正补充。

dingd 发表于 2008-5-5 00:17

1:建议用高版本的1stOpt来测试。
2:那道测试函数,原链接不知看了没有?如果如此轻松就能得到最优解,原题的名称就有点名不副实了。实际最优解为0。用Lingo的再试试!

woodballhead 发表于 2008-5-5 07:51

1:要说软件比较,有一定的前提:问题相同,硬件相同,算法相同,软件价钱相同。当然要做到全部有点难度,尤其价钱相同尤其难以做到。这里的比较都是基于免费软件前提下,lingo的免费软件是lingo8的注册版,lingo10的测试版,1stopt的免费版本是1.5。

woodballhead 发表于 2008-5-5 08:04

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却没有得到这个解?

woodballhead 发表于 2008-5-5 08:07

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

woodballhead 发表于 2008-5-5 08:13

这样的讨论和比较是很有意义的,如果多个例子说明了在变量个数较少时lingo较有优势,这个结果是很重要的。因为我们遇到的优化问题大部分是形式复杂而变量个数较少的,这种情形下应该选择lingo软件。还有函数拟合本质上就是优化问题,而且拟合的参数一般个数不多,如果lingo在变量个数较少时具有优势,那么很多的函数拟合就应该用lingo来做。
页: [1] 2
查看完整版本: lingo比拼1stopt