声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

楼主: dingd

[1stopt] [原创]1stOpt优化应用 - 与Matlab对比!

[复制链接]
发表于 2007-2-16 00:50 | 显示全部楼层
3、就你举的那个无约束最优问题来说,在1stopt下我用DE和SOMA两种方法都顺利求得全局最优。用SM一般用了20秒才得到3990这样一个差强人意的结果。在lingo8注册版编程如下:
model:
sets:
www/1..20/:x;
endsets
max=@sum(www(I):x^2-10*x);
@for(www(I):@bnd(2,x,20));
end
可以看出,LINGO下编程还是很方便,一般不到一秒就能顺利找到全局最优解,与dingd兄的结果相同,而并非陷入了局部极小。

评分

1

查看全部评分

回复 支持 反对
分享到:

使用道具 举报

发表于 2007-2-16 00:53 | 显示全部楼层
在lingo10下运行该程序,却由于演示版的对变量个数的限制,陷入了dingd所叙述的局部极值点。
 楼主| 发表于 2007-2-16 09:12 | 显示全部楼层
1stOpt代码更简单:

ParameterDomain = [2,20];
MaxFunction Sum(i=1:20)(x^2-10*x);
发表于 2007-2-22 20:21 | 显示全部楼层
确实很简捷,但是你这个例子只是变量个数多,但是这个局部最优也就是全局最优,是个很简单的问题。
发表于 2007-2-23 21:52 | 显示全部楼层
我提个问题,看用1stopt是否能够顺利编程计算?:8皇后问题。
这个题意很简单,就是把8个皇后摆在8乘8的棋盘格子上,使得彼此不相互吃掉。国际象棋规则是皇后能前后左右斜线都吃。
lingo可以解决5皇后的问题,但是无法解决更高数目的问题。不知1stopt能否解决?
发表于 2007-2-23 21:54 | 显示全部楼层
程序如下:
model:

data:
N=5;
enddata

sets:
   x/1..N/:position;              !x表示皇后所处位置;   
   link(x,x)|&2#gt#&1:f;          !稀疏集合;
endsets

[obj] min= @sum( link(i,j):f(i,j));
@FOR(link(i,j)|i#lt#j:
f=@if(@abs(position(i)-position(j))#eq#(j-i)
    #or#position(i)#eq#position(j),1,0));

@FOR(x:@bnd(1,position,N));
@FOR(x:@gin(position));
@FOR(link:@bin(f));
end
 楼主| 发表于 2007-2-25 11:20 | 显示全部楼层
咨询过七维高科,1stOpt可以很容易解决8皇后问题,而且不止一种方法,他们试过40甚至更多个皇后问题,都可以顺利求解。

测试过很多优化问题,这两种软件各有自己的特长,试一下下面的函数,如果不启用“Use Global Solver”,Lingo能很快得出结果,每次不一样,最好结果大概为-7.747978;如果启用“Use Global Solver”,计算时间超过1小时也没有停止的意思,最好结果大概在-25。用1stOpt,多次运行的平均结果(每次计算时间小于10秒)大概为-29。这道题两种软件都很难求得唯一的最优解,但相比而言,1stOpt的结果好于Lingo。
uu.JPG
 楼主| 发表于 2007-2-25 11:21 | 显示全部楼层
对不起,第一个求和的下标应为:“i=1”而不是“1”
 楼主| 发表于 2007-2-25 12:19 | 显示全部楼层
再加一句,取值范围在【-10,10】之间。
发表于 2007-3-2 23:56 | 显示全部楼层
这是个多元多项式函数的最值问题吗?
发表于 2007-3-7 12:27 | 显示全部楼层
真想看看1stopt怎样解决那个“八皇后问题”的?
 楼主| 发表于 2007-3-8 09:48 | 显示全部楼层
下面是七维高科给出的60个皇后问题的答案,计算时间不超过5分钟,答案具体意思是:
x1:34 ->1行34列
x2:17 ->2行17列
....

************************
x1: 34
x2: 17
x3: 29
x4: 49
x5: 43
x6: 23
x7: 7
x8: 19
x9: 52
x10: 26
x11: 59
x12: 16
x13: 36
x14: 51
x15: 27
x16: 15
x17: 35
x18: 28
x19: 54
x20: 10
x21: 41
x22: 56
x23: 48
x24: 45
x25: 12
x26: 53
x27: 33
x28: 5
x29: 60
x30: 58
x31: 13
x32: 2
x33: 22
x34: 20
x35: 31
x36: 14
x37: 6
x38: 47
x39: 18
x40: 42
x41: 39
x42: 50
x43: 40
x44: 32
x45: 30
x46: 21
x47: 11
x48: 8
x49: 25
x50: 1
x51: 44
x52: 57
x53: 37
x54: 46
x55: 9
x56: 3
x57: 24
x58: 38
x59: 4
x60: 55
发表于 2007-3-12 07:27 | 显示全部楼层
八皇后问题的精典c 源代码

  1. #include <graphics.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <dos.h>
  5. char n[3]={\'0\',\'0\'};/*用于记录第几组解*/
  6. int a[8],b[15],c[24],i;
  7. int h[8]={127,177,227,277,327,377,427,477};/*每个皇后的行坐标*/
  8. int l[8]={252,217,182,147,112,77,42,7};/*每个皇后的列坐标*/
  9. void *arrow;
  10. void try(int i)
  11. {int j;
  12. for (j=1;j<=8;j++)
  13. if (a[j-1]+b[i+j-2]+c[i-j+7]==3) /*如果第i列第j行为空*/
  14. {a[j-1]=0;b[i+j-2]=0;c[i-j+7]=0;/*占用第i列第j行*/
  15. putimage(h[i-1],l[j-1],arrow,COPY_PUT);/*显示皇后图形*/
  16. delay(500);/*延时*/
  17. if(i<8) try(i+1);
  18. else /*输出一组解*/
  19. {n[1]++;if (n[1]>\'9\') {n[0]++;n[1]=\'0\';}
  20. bar(260,300,390,340);/*显示第n组解*/
  21. outtextxy(275,300,n);
  22. delay(3000);
  23. getch();
  24. }
  25. a[j-1]=1;b[i+j-2]=1;c[i-j+7]=1;
  26. putimage(h[i-1],l[j-1],arrow,XOR_PUT);/*消去皇后,继续寻找下一组解*/
  27. delay(500);
  28. }
  29. }
  30. int main(void)
  31. {int gdrive=DETECT,gmode,errorcode;
  32. unsigned int size;
  33. initgraph(&gdrive,&gmode,"c:\\\\tc\\\\bgi");
  34. errorcode=graphresult();
  35. if (errorcode!=grOk)
  36. {printf("Graphics error\\n");exit(1);}
  37. rectangle(50,5,100,40);
  38. rectangle(60,25,90,33);
  39. /*画皇冠*/
  40. line(60,28,90,28);line(60,25,55,15);
  41. line(55,15,68,25);line(68,25,68,10);
  42. line(68,10,75,25);line(75,25,82,10);
  43. line(82,10,82,25);line(82,25,95,15);
  44. line(95,15,90,25);
  45. size=imagesize(52,7,98,38); arrow=malloc(size);
  46. getimage(52,7,98,38,arrow);/*把皇冠保存到缓冲区*/
  47. clearviewport();
  48. settextstyle(TRIPLEX_FONT, HORIZ_DIR, 4);
  49. setusercharsize(3, 1, 1, 1);
  50. setfillstyle(1,4);
  51. for (i=0;i<=7;i++) a[i]=1;
  52. for (i=0;i<=14;i++) b[i]=1;
  53. for (i=0;i<=23;i++) c[i]=1;
  54. for (i=0;i<=8;i++) line(125,i*35+5,525,i*35+5);/*画棋盘*/
  55. for (i=0;i<=8;i++) line(125+i*50,5,125+i*50,285);
  56. try(1);/*调用递归函数*/
  57. delay(3000);

  58. closegraph();
  59. free(arrow);
  60. }
复制代码
发表于 2007-3-17 21:22 | 显示全部楼层
谢谢斑竹,但是我更想看1stopt的程序?
发表于 2007-3-26 10:53 | 显示全部楼层
原帖由 woodballhead 于 2007-3-17 21:22 发表
谢谢斑竹,但是我更想看1stopt的程序?


1stopt我没用过,你可以问问dingd是否可以提供
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 12:22 , Processed in 0.069345 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表