mjhzhjg 发表于 2006-12-5 21:30

简说优化

(1)来源:优化一语来自英文Optimization,其本意是寻优的过程。
    (2)优化设计:根据给定的设计要求和现有的技术条件,应用专业理论和优化方法,在电子计算机上从满足给定的设计要求的许多可行方案中,按照给定的指标自动地选出最优的设计方案。
    (3)优化过程:是寻找给定函数取极大值(以max表示)或极小(以min表示)的过程。优化方法也称数学规划,是用科学方法和手段进行决策及确定最优解的数学。

[ 本帖最后由 cdwxg 于 2007-1-16 23:24 编辑 ]

xinyuxf 发表于 2006-12-6 09:09

讲的言简意赅,好。
不过感觉第(3)条里的“优化”前面再加一个“最”就更贴切了

mjhzhjg 发表于 2006-12-6 13:23

其实优化我们总是希望找到最优解

hhh1234 发表于 2007-1-5 11:10

求教

请问有没有用Qbasic做优化的啊,我用惩罚函数法运行时,总是提示“subscript out of range”,即310行的赋值语句“XO(K) = XZ(K): XM(K) = XZ(K)”有问题,请大家帮我解决一下阿:@)

心灯 发表于 2007-1-5 12:04

原帖由 hhh1234 于 2007-1-5 11:10 发表
请问有没有用Qbasic做优化的啊,我用惩罚函数法运行时,总是提示“subscript out of range”,即310行的赋值语句“XO(K) = XZ(K): XM(K) = XZ(K)”有问题,请大家帮我解决一下阿:@)

这个与算法无关,而是你程序中数组变量大小定义有问题。
调程序的时候,算法问题和编程问题你心里应该明确区分开的....

hhh1234 发表于 2007-1-5 15:42

回复 #5 心灯 的帖子

很感谢你!:@)
我也知道不是程序本身的问题,可能是我变量初始值或者上下限值的输入的问题,但是我换过好多组数输入了,还是存在问题啊,我本身对优化就不是很明白,只是我的论文中需要对我设计的节流降压—小孔喷注复合式消声器的进行优化,以得到较好的消声量和紧凑的结构尺寸~~~:@L
请各位高手多多指教,谢谢:@) !

心灯 发表于 2007-1-5 16:53

原帖由 hhh1234 于 2007-1-5 15:42 发表
很感谢你!:@)
我也知道不是程序本身的问题,可能是我变量初始值或者上下限值的输入的问题,但是我换过好多组数输入了,还是存在问题啊,我本身对优化就不是很明白,只是我的论文中需要对我设计的节流降压—小 ...

现在的问题是这个是编程问题,你简单提出这个错误信息,没有人能够给你帮助的,无从下手啊。
你把程序贴出来,或许大家还能帮你瞅瞅可能是什么错误....

hhh1234 发表于 2007-1-8 11:23

谢谢你心灯!程序是这样的:
10 CLEAR 100
20 REM SUMT PROGRAM OPTIMAR DESIGN
30 INPUT "N="; N
40 INPUT "FK="; FK
50 INPUT "GK="; GK
60 INPUT "HK="; HK
70 DIM x(N), XZ(N), BL(N), BU(N), FX(FK), GX(GK), HX(HK)
80 FOR K = 1 TO N
90 PRINT "X("; K; ")="; : INPUT XZ(K)
100 NEXT K
110 FOR K = 1 TO N
120 PRINT "BL("; K; ")="; : INPUT BL(K)
130 NEXT K
140 FOR K = 1 TO N
150 PRINT "BU("; K; ")="; : INPUT BU(K)
160 NEXT K
170 INPUT "E1="; E1: INPUT "E2="; E2
          INPUT "R="; R
200 PRINT "N="; N, "FK="; FK, "GK="; GK, "HK="; HK
210 PRINT "E1="; E1, "E2="; E2, "R="; R
220 FOR K = 1 TO N
230 PRINT "X("; K; ")="; XZ(K), "BL("; K; ")="; BL(K), "BU("; K; ")="; BU(K)
240 NEXT K
   
250 INPUT "QQ=(00000 OR 55555)"; QQ
260 C = .2: HO = .01: FM = 1E+10
270 M = 265786!: M5 = 2 ^ 35: M6 = M5 * 2: M7 = M6 * 2
280 CY = 0: KT = 0: FU = 0: N1 = N + 1
290 DIM XM, XO, XX, X3(N), S(N1, N)
300 FOR K = 1 TO N
310 XO(K) = XZ(K): XM(K) = XZ(K)
320 NEXT K
330 FOR KI = 1 TO N
340 FOR K = 1 TO N
350 IF KI = K THEN S(KI, K) = 1 ELSE S(KI, K) = 0
360 NEXT K, KI
370 CY = CY + 1
390 PRINT TAB(20); STRING$(40, ".")
400 PRINT : PRINT "CYCLE="; CY, "R="; R
420 FOR K = 1 TO N
430 x(K) = XZ(K)
440 NEXT K
450 GOSUB 3000: FO = Y
460 IF CY <> 1 THEN 560
470 FOR KI = 1 TO GK
480 IF GX(KI) > 1E-15 THEN 550
490 FOR K = 1 TO N
500 GOSUB 2000
510 XZ(K) = BL(K) + Q * (BU(K) - BL(K))
520 NEXT K
530 IF QQ = 55555! THEN PRINT "QQ"
540 GOTO 420
550 NEXT KI
560 GOSUB 6000
570 PRINT "ITER="; KT, "Fo="; FO, "F(X)="; SF, "FUM="; FU
580 FOR K = 1 TO N
590 PRINT TAB(10); "X("; K; ")="; XZ(K)
600 NEXT K
610 FOR K = 1 TO GK
620 IF GX(K) < 1E-15 THEN PRINT STRING$(40, "$"); :GOTO 800
630 NEXT K
640 MZ = 0
650 FOR K = 1 TO N
660 MZ = MZ + (XM(K) - XZ(K)) * (XM(K) - XZ(K))
670 NEXT K
680 MZ = SQR(MZ)
690 IF MZ < E1 THEN 730
700 IF ABS((FM - FO) / FO) < E2 THEN 730
710 IF FM - FO < 0 THEN 730
720 GOTO 750
730 PRINT STRING$(40, "*")
   
740 PRINT : GOTO 800
750 FM = FO: R = R * C
760 FOR K = 1 TO N
770 XM(K) = XZ(K)
780 NEXT K
790 GOTO 370
800 Q = (SO - SF) / ABS(SO)
810 PRINT "CYCLE="; CY, "R="; R, "FUN="; FU
820 PRINT "ITER="; KT, "Fo="; FO, "F(X)="; SF
830 FOR K = 1 TO N
840 PRINT TAB(25); "X("; K; ")="; XZ(K)
850 NEXT K
860 PRINT "Q="; Q, "Fo="; FO, "F(X)="; SF
870 FOR K = 1 TO FK
880 PRINT "FX("; K; ")="; FX(K)
890 NEXT K
   
910 FOR K = 1 TO GK
920 PRINT "GX("; K; ")="; GX(K)
930 NEXT K
950 FOR K = 1 TO HK
960 PRINT "HX("; K; ")="; HX(K)
970 NEXT K
980 END
1000 REM FGH PROCEdURE
1010 FX(1) = 0.7854 * ((2 * x(4) ^ 2 - x(1)^2) * x(8) + x(3) ^ 2 * x(7) + x(2) ^ 2 * x(6) + x(1)^2 * x(5)) + 3.1416 * (x(4) * x(12) + x(3) * x(11) + x(2) * x(10) + x(1) * x(9))-(x(17)*x(5)+x(18)*x(6)+x(19)*x(7)+x(20)*x(8))
1020 GX(1) = x(2) - x(1) - 15 * x(13)
1030 GX(2) = x(3) - x(2) - 15 * x(14)
1040 GX(3) = x(4) - x(3) - 15 * x(15)
1041 GX(4) = x(5) - .01607 * x(1)
1042 GX(5) = x(6) - 0.008775* x(2)
1043 GX(6) = x(7) - 0.00479 * x(3)
1044 GX(7) = x(8) - 0.002616* x(4)
1045 GX(8) = x(9) - (4*x(17) * x(21) / (9.87 * x(13) * x(1)) - 1) * .866 * x(21) * x(13)
1046 GX(9) = x(10) - (4*x(20) * x(22) / (9.87 * x(14) * x(2)) - 1) * .866 * x(22) * x(14)
1047 GX(10) = x(11) - (4 * x(19) * x(23) / (9.87 * x(15) * x(3)) - 1) * .866 * x(23) * x(15)
1048 GX(11) = x(12)-(4 * x(20) * x(24) / (9.87 * x(16)^2 * x(4)) - 1) * .866 * x(24)
1049 GX(12) = x(24) - x(16) - 6 * sqrtx(16)
1050 GX(13) = 45.74385 - 10 * lg(x(17) /0.16277)
1070 HX(1) = x(2) - x(1) - 15 * x(13)
1071 HX(2) = x(3) - x(2) - 15 * x(14)
1072 HX(3) = x(4) - x(3) - 15 * x(15)
1073 HX(4) = x(5) - .01607 * x(1)
1074 HX(5) = x(6) - 0.008775* x(2)
1075 HX(6) = x(7) - 0.00479 * x(3)
1076 HX(7) = x(8) - 0.002616* x(4)
1077 HX(8) = x(9) - (4*x(17) * x(21) / (9.87 * x(13) * x(1)) - 1) * .866 * x(21) * x(13)
1078 HX(9) = x(10) - (4*x(20) * x(22) / (9.87 * x(14) * x(2)) - 1) * .866 * x(22) * x(14)
1079 HX(10) = x(11) - (4 * x(19) * x(23) / (9.87 * x(15) * x(3)) - 1) * .866 * x(23) * x(15)
1080 HX(11) = x(12)-(4 * x(20) * x(24) / (9.87 * x(16)^2 * x(4)) - 1) * .866 * x(24)
1081 HX(12) = x(24) - x(16) - 6 * sqrtx(16)
1082 HX(13) = 45.74385 - 10 * lg(x(17) /0.16277)
1090 RETURN
2000 REM RANDOM PROCEDURE
2010 M = M * 5
2020 IF M >= M7 THEN M = M - M7
2030 IF M >= M6 THEN M = M - M6
2040 IF M >= M5 THEN M = M - M5
2050 Q = M / M5
2060 RETURN
3000 REM FUNCT(X,Y) PROCEDURE
3010 GOSUB 1000
3020 FU = FU + 1
3030 SF = 0: SG = 0: SH = 0
3040 FOR K = 1 TO FK
3050 SF = SF + FX(K)
3060 NEXT K
3070 FOR K = 1 TO GK
3080 SG = SG + 1 / GX(K)
3090 NEXT K
3100 FOR K = 1 TO HK
3110 SH = SH + HX(K) * HX(K)
3120 NEXT K
3130 Y = SF + R * SG + SH / SQR(R)
3140 IF FU = 1 THEN SO = SF
3150 IF FU <> 1 THEN 3340
3160 PRINT "R="; R, "Y="; Y
3170 PRINT "SF="; SF, "SG="; SG, "SH="; SH
3180 FOR K = 1 TO N
3190 PRINT "X("; K; ")="; x(K),
3200 NEXT K
3220 FOR K = 1 TO FK
3230 PRINT "FX("; K; ")="; FX(K),
3240 NEXT K
3260 FOR K = 1 TO GK
3270 PRINT "GX("; K; ")="; GX(K),
3280 NEXT K
3300 FOR K = 1 TO HK
3310 PRINT "HX("; K; ")="; HX(K),
3320 NEXT K
3340 RETURN
4000 REM PENALTY(T,Y) PROCEDURE
4010 T0 = T - T0
4020 FOR K = 1 TO N
4030 XX(K) = XX(K) + T0 * S(KI, K)
4040 NEXT K
4050 T0 = T
4060 FOR K = 1 TO N
4070 x(K) = XX(K)
4080 NEXT K
4090 GOSUB 3000
4100 RETURN
5000 REM LINEMIN(Ho,T,Y) PROCEDURE
5010 FOR K = 1 TO N
5020 XX(K) = XZ(K)
5030 NEXT K
5040 HT = HO: T2 = HO
5050 T0 = 0: T1 = 0: Y1 = YO
5060 T = T2: GOSUB 4000
5065 Y2 = Y
5070 FOR K = 1 TO GK
5080 IF GX(K) > 1E-15 THEN 5120
5090 IF ABS(T2) > .0000001 THEN 5110
5100 T2 = 0: Y2 = YO: GOTO 5570
5110 T2 = T2 * .5: GOTO 5060
5120 NEXT K
5130 IF Y2 < Y1 THEN 5170
5140 HT = -HT: T3 = T1: Y3 = Y1
5150 T1 = T2: Y1 = Y2
5160 T2 = T3: Y2 = Y3
5170 T3 = T2 + HT
5180 T = T3: GOSUB 4000: Y3 = Y
5190 FOR K = 1 TO GK
5200 IF GX(K) > 1E-15 THEN 5230
5210 IF ABS(HT) < .0000001 THEN 5570
5220 HT = HT * .5: GOTO 5170
5230 NEXT K
5240 IF Y2 < Y3 THEN 5270
5250 HT = HT + HT
5260 GOTO 5150
5270 IF ABS(T2 - T1) < 1E-10 THEN 5570
5280 IF ABS(T2 - T3) < 1E-10 THEN 5570
5290 C1 = (Y3 - Y1) / (T3 - T1)
5300 C2 = ((Y2 - Y1) / (T2 - T1) - C1) / (T2 - T3)
5310 IF ABS(C2) < 1E-10 THEN 5570
5320 T4 = .5 * (T1 + T3 - C1 / C2)
5330 IF (T4 - T1) * (T3 - T4) <= 0 THEN 5570
5340 T = T4: GOSUB 4000: Y4 = Y
5350 FOR K = 1 TO GK
5360 IF GX(K) > 1E-15 THEN 5380
5370 GOTO 5570
5380 NEXT K
5390 IF ABS(Y2) < 1 THEN A = 1 ELSE A = Y2
5400 IF ABS((Y2 - Y4) / A) < E1 THEN 5440
5410 IF ABS(T2 - T1) < 1E-15 THEN 5440
5420 IF ABS(T2 - T3) < 1E-15 THEN 5440
5430 GOTO 5450
5440 IF Y2 > Y4 THEN 5580 ELSE 5570
5450 IF (T4 - T2) * HT < 0 THEN 5510
5460 IF Y2 < Y4 THEN 5490
5470 T1 = T2: Y1 = Y2: T2 = T4: Y2 = Y4
5480 GOTO 5500
5490 T3 = T4: Y3 = Y4
5500 GOTO 5560
5510 IF Y2 < Y4 THEN 5550
5520 T3 = T2: Y3 = Y2
5530 T2 = T4: Y2 = Y4
5540 GOTO 5560
5550 T1 = T4: Y1 = Y4
5560 GOTO 5290
5570 T = T2: Y = Y2: GOTO 5590
5580 T = T4: Y = Y4
5590 RETURN
6000 REM MINIMIZE PROCEDURE
6010 DX = 1E+10
6020 KT = KT + 1
6030 IF DX < E1 THEN 6660
6040 YO = FO: F1 = FO: DM = 0: DI = 1
6050 FOR KI = 1 TO N
6060 GOSUB 5000: F2 = Y
6070 FOR K = 1 TO N
6080 XZ(K) = XZ(K) + T * S(KI, K)
6090 NEXT K
6100 FOR K = 1 TO N
6110 x(K) = XZ(K)
6120 NEXT K
6130 GOSUB 3000: F2 = Y
6140 DF = F1 - F2: YO = F2: F1 = F2
6150 IF DF < DM THEN 6170
6160 DM = DF: DI = KI
6170 NEXT KI
6180 DX = 0
6190 FOR K = 1 TO N
6200 DX = DX + (XZ(K) - XO(K)) * (XZ(K) - XO(K))
6210 NEXT K
6220 DX = SQR(DX)
6230 FOR K = 1 TO N
6240 X3(K) = 2 * XZ(K) - XO(K)
6250 S(N + 1, K) = XZ(K) - XO(K)
6260 NEXT K
6270 FOR K = 1 TO N
6280 x(K) = X3(K)
6290 NEXT K
6300 GOSUB 3000: F3 = Y
6310 FOR K = 1 TO GK
6320 IF GX(K) < 1E-15 THEN 6610
6330 NEXT K
6340 IF F3 > FO THEN 6540
6345 U = (FO - F2 - DM) * (FO - F2 - DM): V = (FO - F3) * (FO - F3)
6350 IF (FO - 2 * F2 + F3) * U < .5 * DM * V THEN 6360 ELSE 6540
6360 FOR KI = DI TO N
6370 FOR K = 1 TO N
6380 S(KI, K) = S(KI + 1, K)
6390 NEXT K, KI
6400 YO = Y2
6410 GOSUB 5000: FO = Y
6420 FOR K = 1 TO N
6430 XZ(K) = XZ(K) + T * S(N, K)
6440 XO(K) = XZ(K)
6450 NEXT K
6460 FOR K = 1 TO N
6470 x(K) = XZ(K)
6480 NEXT K
6490 GOSUB 3000: FO = Y
6500 FOR K = 1 TO GK
6510 IF GX(K) < 1E-15 THEN 6540
6520 NEXT K
6530 GOTO 6650
6540 IF F3 > F2 THEN 6610
6550 FO = F3
6560 FOR K = 1 TO N
6570 XO(K) = X3(K)
6580 XZ(K) = X3(K)
6590 NEXT K
6600 GOTO 6650
6610 FOR K = 1 TO N
6620 XO(K) = XZ(K)
6630 NEXT K
6640 FO = F2
6650 GOTO 6020
6660 KT = KT - 1
6670 RETURN
6680 REM THE END!
麻烦大家帮我看看阿,程序是调用的惩罚函数法,1010~1082行是我添加的,其中1010行是目标函数,1020~1050是不等式约束,1070~1082是等式约束。
非常感谢!!!

[ 本帖最后由 cdwxg 于 2007-1-16 23:26 编辑 ]

心灯 发表于 2007-1-8 13:13

原帖由 hhh1234 于 2007-1-8 11:23 发表
:@) 谢谢你心灯!程序是这样的:
10 CLEAR 100
20 REM SUMT PROGRAM OPTIMAR DESIGN
30 INPUT "N="; N
40 INPUT "FK="; FK
50 INPUT "GK="; GK
60 INPUT "HK="; ...

所有输入数据也写出来?
本科学过,不过几年不用QB了,(QB这个语言已经严重的过时了),看这个程序有些费劲,你把输入的数据也给出来吧....
还要找个编译器去。

hhh1234 发表于 2007-1-9 09:30

哦,谢谢你:@) !
不过我不知道在哪能粘贴附件阿,即不知道怎么把编译器发到论坛上来:@L

心灯 发表于 2007-1-9 12:49

原帖由 hhh1234 于 2007-1-9 09:30 发表
哦,谢谢你:@) !
不过我不知道在哪能粘贴附件阿,即不知道怎么把编译器发到论坛上来:@L

呵呵,编译器我自己可以找到。你只要把需要输入设置的变量的值给出来,保证程序可以运行并且反映你的错误,就可以了。

hhh1234 发表于 2007-1-15 19:54

非常感谢你:handshake :@)
24,1,14,13,50,230,290,350,2,2,3,2,498.8,500.6,5.5.46,512.34,10,6,2,2,2453,4493,8229,15071.63,5.236,8.028,7.12,11.6,40,50,50,50,0.5,0.5,0.5,0.5,300,300,300,300,2,2,1,1,1000,1000,1000,1000,5,5,5,7,1500,1500,1500,1500,5,5,5,5,3000,3000,3000,3000,20,20,20,4,5000,10000,20000,40000,10,10,10,15,
第1个指的是:设计变量维数;第2个指的是:目标函数个数;第3个指的是:不等式约束个数;第4个指的是:等式约束个数;第5~28个指的是:我赋的初始值;第29~52个指的是:各变量的下限;第53~76个指的是:各变量的上限;:@)

hhh1234 发表于 2007-1-15 19:56

:@) 还想问一下,在程序中对数值取整怎么表示阿,谢谢!

心灯 发表于 2007-1-15 21:31

原帖由 hhh1234 于 2007-1-15 19:56 发表
:@) 还想问一下,在程序中对数值取整怎么表示阿,谢谢!

你可以自己google “qbasic取整”,查找命令。


来源:http://www.fx.fudan.edu.cn/elearning/dispbbs.asp?boardID=33&ID=741&page=1

QUICK BASIC 教程(五)标准函数

QBASIC 提供了标准函数。一个标准函数就是一段程序,它具有一种特定的功能。 我们在使用时只需写出它的名字(即函数名)和参数就可以直接调用。 QBASIC提供的标准函数包括:算术函数和字符串函数等。这些函数功能齐全、用途广泛。这里主要介绍算术函数,有关字符串函数将以后章节中介绍。算术函数, 指调用函数后返回一个数值,本节主要介绍取整函数与随机函数。
取整函数
随机函数
1. 取整函数
函数格式:INT(X)
功能:产生一个不大于X的最大整数。其中,X可以是常数、变量或表达式。
使用取整函数可以解决很多数学问题。
(1)取一个数的整数部分
例如:
X=5.3: Y=5.5: Z=-6.1
X=INT(X): Y=INT(Y): Z=INT(Z)
PRINT X,Y,Z
END
执行后屏幕上显示: 5 5 -7
(2)四舍五入
取整函数本身没有四舍五入的功能,但将其稍加变化就可以实现四舍五入。
四舍五入的通式为:
INT(X+0.5)。
例1 将下面的数字保留整数部分,小数部分四舍五入。
1.36 2.5 4.1 0.48
FOR I=1 TO 4
READ X
PRINT X,
INT(X+0.5)
NEXT I
DATA 1.36,2.5,4.1,0.48
END
执行后屏幕上显示:
1.36 1 2.5 3 4.1 4 0.48 0
(3)保留N位小数
将X保留N位小数,可以先将X乘以10N,取整后再除以10N。
通式为INT(X*10^N)/ 10^N。
例2 将3.14159保留三位小数且最后一位小数四舍五入。
X=3.14159
Y=INT(X*1000+0.5)/1000
PRINT X,Y
END
执行后屏幕上显示:
3.14159 3.142
(4)判断整除
要判断一个整数X能否被另外一个整数Y整除,只需判断X/Y=INT(X/Y),条件满足则为整除。
例如:
CLS
INPUT X,Y
IF X/Y=INT(X/Y) THEN PRINT "能整除"ELSE PRINT "不能整除";
END
执行后屏幕上显示:
? 30, 5 能整除
? 30, 7 不能整除
如果将除数改为2,则可以判断一个数的奇偶性。
(5)分离数字
要对一个三位数X分离数字,可以采用如下方法:
百位数字B=INT(X/100)
十位数字S=INT((X-B*100)/10)
个位数字G=X-B*100-S*10
例3 求100~999之间的所有水仙花数,并统计个数。水仙花数是指一个三位数,其中各位数字的立方和就等于该数本身。
REM 求水仙花数
N=0
FOR X=100 TO 999
B=INT(X/100)
S=INT((X-B*100)/10)
G=X-B*100-S*10
IF X=B*B*B+S*S*S+G*G*G THEN N=N+1: PRINT X,
NEXT X
PRINT "N="; N
END
执行后屏幕上显示: 153 370 371 471 N=4

心灯 发表于 2007-1-15 21:33

现在论坛帖子存在防copy机制,所以你的程序无法保存下来,我已经向站长反映了这个问题,这两天我自己也比较忙,先等等吧....
页: [1] 2
查看完整版本: 简说优化