woodballhead
发表于 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兄的结果相同,而并非陷入了局部极小。
woodballhead
发表于 2007-2-16 00:53
在lingo10下运行该程序,却由于演示版的对变量个数的限制,陷入了dingd所叙述的局部极值点。
dingd
发表于 2007-2-16 09:12
1stOpt代码更简单:
ParameterDomain = ;
MaxFunction Sum(i=1:20)(x^2-10*x);
woodballhead
发表于 2007-2-22 20:21
确实很简捷,但是你这个例子只是变量个数多,但是这个局部最优也就是全局最优,是个很简单的问题。
woodballhead
发表于 2007-2-23 21:52
我提个问题,看用1stopt是否能够顺利编程计算?:8皇后问题。
这个题意很简单,就是把8个皇后摆在8乘8的棋盘格子上,使得彼此不相互吃掉。国际象棋规则是皇后能前后左右斜线都吃。
lingo可以解决5皇后的问题,但是无法解决更高数目的问题。不知1stopt能否解决?
woodballhead
发表于 2007-2-23 21:54
程序如下:
model:
data:
N=5;
enddata
sets:
x/1..N/:position; !x表示皇后所处位置;
link(x,x)|&2#gt#&1:f; !稀疏集合;
endsets
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
dingd
发表于 2007-2-25 11:20
咨询过七维高科,1stOpt可以很容易解决8皇后问题,而且不止一种方法,他们试过40甚至更多个皇后问题,都可以顺利求解。
测试过很多优化问题,这两种软件各有自己的特长,试一下下面的函数,如果不启用“Use Global Solver”,Lingo能很快得出结果,每次不一样,最好结果大概为-7.747978;如果启用“Use Global Solver”,计算时间超过1小时也没有停止的意思,最好结果大概在-25。用1stOpt,多次运行的平均结果(每次计算时间小于10秒)大概为-29。这道题两种软件都很难求得唯一的最优解,但相比而言,1stOpt的结果好于Lingo。
dingd
发表于 2007-2-25 11:21
对不起,第一个求和的下标应为:“i=1”而不是“1”
dingd
发表于 2007-2-25 12:19
再加一句,取值范围在【-10,10】之间。
woodballhead
发表于 2007-3-2 23:56
这是个多元多项式函数的最值问题吗?
woodballhead
发表于 2007-3-7 12:27
真想看看1stopt怎样解决那个“八皇后问题”的?
dingd
发表于 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
suffer
发表于 2007-3-12 07:27
八皇后问题的精典c 源代码
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
char n={\'0\',\'0\'};/*用于记录第几组解*/
int a,b,c,i;
int h={127,177,227,277,327,377,427,477};/*每个皇后的行坐标*/
int l={252,217,182,147,112,77,42,7};/*每个皇后的列坐标*/
void *arrow;
void try(int i)
{int j;
for (j=1;j<=8;j++)
if (a+b+c==3) /*如果第i列第j行为空*/
{a=0;b=0;c=0;/*占用第i列第j行*/
putimage(h,l,arrow,COPY_PUT);/*显示皇后图形*/
delay(500);/*延时*/
if(i<8) try(i+1);
else /*输出一组解*/
{n++;if (n>\'9\') {n++;n=\'0\';}
bar(260,300,390,340);/*显示第n组解*/
outtextxy(275,300,n);
delay(3000);
getch();
}
a=1;b=1;c=1;
putimage(h,l,arrow,XOR_PUT);/*消去皇后,继续寻找下一组解*/
delay(500);
}
}
int main(void)
{int gdrive=DETECT,gmode,errorcode;
unsigned int size;
initgraph(&gdrive,&gmode,"c:\\\\tc\\\\bgi");
errorcode=graphresult();
if (errorcode!=grOk)
{printf("Graphics error\\n");exit(1);}
rectangle(50,5,100,40);
rectangle(60,25,90,33);
/*画皇冠*/
line(60,28,90,28);line(60,25,55,15);
line(55,15,68,25);line(68,25,68,10);
line(68,10,75,25);line(75,25,82,10);
line(82,10,82,25);line(82,25,95,15);
line(95,15,90,25);
size=imagesize(52,7,98,38); arrow=malloc(size);
getimage(52,7,98,38,arrow);/*把皇冠保存到缓冲区*/
clearviewport();
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 4);
setusercharsize(3, 1, 1, 1);
setfillstyle(1,4);
for (i=0;i<=7;i++) a=1;
for (i=0;i<=14;i++) b=1;
for (i=0;i<=23;i++) c=1;
for (i=0;i<=8;i++) line(125,i*35+5,525,i*35+5);/*画棋盘*/
for (i=0;i<=8;i++) line(125+i*50,5,125+i*50,285);
try(1);/*调用递归函数*/
delay(3000);
closegraph();
free(arrow);
}
woodballhead
发表于 2007-3-17 21:22
谢谢斑竹,但是我更想看1stopt的程序?
suffer
发表于 2007-3-26 10:53
原帖由 woodballhead 于 2007-3-17 21:22 发表
谢谢斑竹,但是我更想看1stopt的程序?
1stopt我没用过,你可以问问dingd是否可以提供