叠片圆形铁芯最大面积问题(续)-非线性整数规划问题的不同解的比较
本帖最后由 lin2009 于 2011-1-6 21:02 编辑呵呵,找到了最近发表在《数学实践与认识》期刊上的一篇关于铁芯柱界面优化设计的论文,
《一种电力变压器铁芯柱截面优化设计的模型.pdf》
可以看作是“叠片圆形铁芯最大面积问题(趣味问题)”的实际应用的例子。
http://forum.simwe.com/viewthread.php?tid=961136&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D353
文中给出了Lingo 10.0 编制的优化程序,并给出了结果。
有兴趣的话,试一试用1stopt来解这个问题。
优化模型在4#。 想先抛砖引玉,却不料出现如下问题,大家看看是什么原因?版本3.0
仿照文中的程序结构编制了1stopt优化程序如下(未全部用For语句优化代码)
IntParameter x(14);
ParameterDomain = ;
ConstStr
L1 = 5*xl;
L2 = 5*x2;
L3 = 5*x3;
L4 = 5*x4;
L5 = 5*x5;
L6 = 5*x6;
L7 = 5*x7;
L8 = 5*x8;
L9 = 5*x9;
L10 = 5*xl0;
L11 = 5*xll;
L12 = 5*x12;
L13 = 5*x13;
L14 = 5*x14;
ConstStr
rl = sqrt((Ll/2)^2 + wl^2);
r2 = sqrt((L2/2)^2 + (wl+w2)^2);
r3 = sqrt((L3/2)^2 + (wl + w2 + w3)^2);.
r4 = sqrt((L4/2)^2 + (wl + w2 + w3 + w4)^2);
r5 = sqrt((L5/2)^2 + (wl + w2 + w3 + w4 + w5)^2);
r6 = sqrt((L6/2)^2 + (wl + w2 + w3 + w4 + w5 + w6)^2);
r7 = sqrt((L7/2)^2 + (wl + w2 + w3 + w4 + w5 + w6 + w7)^2);
r8 = sqrt((L8/2)^2 + (wl + w2 + w3 + w4 + w5 + w6 + w7 + w8)^2);
r9 = sqrt((L9/2)^2 + (w1 + w2 + w3 + w4 + tw5 + w6 + w7 + w + w9)^2);
r10 = sqrt((L10/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10)^2);
r11 = sqrt((L11/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + W7 + w8 + w9 + w10 + w11)^2);
r12 = sqrt((L12/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + W8 + w9 + w10 + w11 + w12)^2);
r13 = sqrt((L13/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13)^2);
r14 = sqrt((L14/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13 + w14)^2);
MaxFunctionSum(i=1:14)(L*w);
sqrt((r1/2)^2 + w1^2) <= 325;
sqrt((r2/2)^2 + (w1 + w2)^2) <= 325;
sqrt((r3/2)^2 + (w1 + w2 + w3)^2) <= 325;
sqrt((r4/2)^2 + (w1 + w2 + w3 + w4)^2) <= 325;
sqrt((r5/2)^2 + (w1 + w2 + w3 + w4 + w5)^2) <= 325;
sqrt((r6/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6)^2) <= 325;
sqrt((r7/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7)^2) <= 325;
sqrt((r8/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8)^2) <= 325;
sqrt((r9/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9)^2) <= 325;
sqrt((r10/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10)^2) <= 325;
sqrt((r11/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11)^2) <= 325;
sqrt((r12/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12)^2) <= 325;
sqrt((r13/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13)^2) <= 325;
sqrt((r14/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13 + w14)^2) <= 325;
For(i=1:13)(L[ i + 1 ] <= L[ i ]);
L14 >= 20;
wl >= 13;
运行时,提示“x1”虽被定义,但没有在函数表达式中出现的错误!
是不是3.0不能进行嵌套定义,如
ConstStr
L1 = 5*xl;
rl = sqrt((Ll/2)^2 + wl^2); 粗看了下,两段ConstStr定义中“,”与“;”用错了,如:
ConstStr
L1 = 5*xl;
L2 = 5*x2;
L3 = 5*x3;
L4 = 5*x4;
L5 = 5*x5;
L6 = 5*x6;
L7 = 5*x7;
L8 = 5*x8;
L9 = 5*x9;
L10 = 5*xl0;
L11 = 5*xll;
L12 = 5*x12;
L13 = 5*x13;
L14 = 5*x14;
应该为:
ConstStr
L1 = 5*xl,
L2 = 5*x2,
L3 = 5*x3,
L4 = 5*x4,
L5 = 5*x5,
L6 = 5*x6,
L7 = 5*x7,
L8 = 5*x8,
L9 = 5*x9,
L10 = 5*xl0,
L11 = 5*xll,
L12 = 5*x12,
L13 = 5*x13,
L14 = 5*x14;
另一段也是相同的问题。
另外还有w1好像写成了wl(WL) 本帖最后由 lin2009 于 2011-1-6 20:56 编辑
优化模型为
$$\max \;\;S = 0.97\cdot\sum\limits_{i = 1}^{14} {{L_i}\cdot{W_i}} $$
$${W_1} \geq \frac{{26}}{2}$$
$${L_i} > {L_{i + 1}}\;\;\;for\;i = 1,2,3..13$$
$${L_{14}} \geq 20$$
$$\bmod \left( {{L_i},5} \right) = 0$$
$${R_i} = \sqrt {{{\left( {\frac{{{L_i}}}{2}} \right)}^2} + {{\left( {\sum\limits_{j = 1}^i {{W_j}} } \right)}^2}} \leq 325\;\;\;for\;\;i = 1,2,3..14$$
Li为整数,且被5整除。
最大值为311117.6。 本帖最后由 lin2009 于 2011-1-6 21:10 编辑
二楼代码的更正:
IntParameter x(14);
ParameterDomain = [ 0, ];
ConstStr
L1 = 5*x1,
L2 = 5*x2,
L3 = 5*x3,
L4 = 5*x4,
L5 = 5*x5,
L6 = 5*x6,
L7 = 5*x7,
L8 = 5*x8,
L9 = 5*x9,
L10 = 5*x10,
L11 = 5*x11,
L12 = 5*x12,
L13 = 5*x13,
L14 = 5*x14;
ConstStr
r1 = sqrt((L1/2)^2 + w1^2),
r2 = sqrt((L2/2)^2 + (w1+w2)^2),
r3 = sqrt((L3/2)^2 + (w1 + w2 + w3)^2),
r4 = sqrt((L4/2)^2 + (w1 + w2 + w3 + w4)^2),
r5 = sqrt((L5/2)^2 + (w1 + w2 + w3 + w4 + w5)^2),
r6 = sqrt((L6/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6)^2),
r7 = sqrt((L7/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7)^2),
r8 = sqrt((L8/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8)^2),
r9 = sqrt((L9/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9)^2),
r10 = sqrt((L10/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10)^2),
r11 = sqrt((L11/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11)^2),
r12 = sqrt((L12/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12)^2),
r13 = sqrt((L13/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13)^2),
r14 = sqrt((L14/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13 + w14)^2);
MaxFunction 0.97*Sum(i = 1:14)(L[ i ]*w[ i ]);
sqrt((r1/2)^2 + w1^2) <= 325;
sqrt((r2/2)^2 + (w1+w2)^2) <= 325;
sqrt((r3/2)^2 + (w1 + w2 + w3)^2) <= 325;
sqrt((r4/2)^2 + (w1 + w2 + w3 + w4)^2) <= 325;
sqrt((r5/2)^2 + (w1 + w2 + w3 + w4 + w5)^2) <= 325;
sqrt((r6/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6)^2) <= 325;
sqrt((r7/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7)^2) <= 325;
sqrt((r8/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8)^2) <= 325;
sqrt((r9/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9)^2) <= 325;
sqrt((r10/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10)^2) <= 325;
sqrt((r11/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11)^2) <= 325;
sqrt((r12/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12)^2) <= 325;
sqrt((r13/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13)^2) <= 325;
sqrt((r14/2)^2 + (w1 + w2 + w3 + w4 + w5 + w6 + w7 + w8 + w9 + w10 + w11 + w12 + w13 + w14)^2) <= 325;
For(i = 1:13)(L[ i + 1 ] <= L[ i ]);
L14 >= 20;
w1 >= 13;
简化形式:
IntParameter L(14);
ParameterDomain = [ 0, ];
For(i = 1:14)(ConstStr r[ i ] = sqrt((L[ i ]/2)^2 + (sum(j = 1:i)(w[ j ]))^2));
MaxFunction0.97*Sum(i = 1:14)(L[ i ]*w[ i ]);
For(i = 1:14)(sqrt((r[ i ]/2)^2 + (Sum(j = 1:i)(w[ j ]))^2) <= 325);
For(i = 1:13)(L[ i ] > L[ i + 1 ]);
L14 >= 20;
For(i = 1:14)(L[ i ] - 5*round(L[ i ]/5) = 0);
w1 >= 13;
均得不出Ls的最大值。 参考附件PDF论文及lin2009的代码,Lingo代码如下,不知是否有误,用Lingo11跑了下,最好结果为:286914.6
max=(5*x1)*w1+(5*x2)*w2+(5*x3)*w3+(5*x4)*w4+(5*x5)*w5+(5*x6)*w6+(5*x7)*w7+(5*x8)*w8+(5*x9)*w9+(5*x10)*w10+(5*x11)*w11+(5*x12)*w12+(5*x13)*w13+(5*x14)*w14;
@sqrt(((@sqrt(((5*x1)/2)^2+(w1)^2))/2)^2+(w1)^2)-325<=0;
@sqrt(((@sqrt(((5*x2)/2)^2+(w1+w2)^2))/2)^2+(w1+w2)^2)-325<=0;
@sqrt(((@sqrt(((5*x3)/2)^2+(w1+w2+w3)^2))/2)^2+(w1+w2+w3)^2)-325<=0;
@sqrt(((@sqrt(((5*x4)/2)^2+(w1+w2+w3+w4)^2))/2)^2+(w1+w2+w3+w4)^2)-325<=0;
@sqrt(((@sqrt(((5*x5)/2)^2+(w1+w2+w3+w4+w5)^2))/2)^2+(w1+w2+w3+w4+w5)^2)-325<=0;
@sqrt(((@sqrt(((5*x6)/2)^2+(w1+w2+w3+w4+w5+w6)^2))/2)^2+(w1+w2+w3+w4+w5+w6)^2)-325<=0;
@sqrt(((@sqrt(((5*x7)/2)^2+(w1+w2+w3+w4+w5+w6+w7)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7)^2)-325<=0;
@sqrt(((@sqrt(((5*x8)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8)^2)-325<=0;
@sqrt(((@sqrt(((5*x9)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9)^2)-325<=0;
@sqrt(((@sqrt(((5*x10)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)^2)-325<=0;
@sqrt(((@sqrt(((5*x11)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11)^2)-325<=0;
@sqrt(((@sqrt(((5*x12)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11+w12)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11+w12)^2)-325<=0;
@sqrt(((@sqrt(((5*x13)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11+w12+w13)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11+w12+w13)^2)-325<=0;
@sqrt(((@sqrt(((5*x14)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11+w12+w13+w14)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10+w11+w12+w13+w14)^2)-325<=0;
5*x2-(5*x1)<=0;
5*x3-(5*x2)<=0;
5*x4-(5*x3)<=0;
5*x5-(5*x4)<=0;
5*x6-(5*x5)<=0;
5*x7-(5*x6)<=0;
5*x8-(5*x7)<=0;
5*x9-(5*x8)<=0;
5*x10-(5*x9)<=0;
5*x11-(5*x10)<=0;
5*x12-(5*x11)<=0;
5*x13-(5*x12)<=0;
5*x14-(5*x13)<=0;
5*x14-20>=0;
w1-13>=0;
@Gin(x1);@Gin(x2);@Gin(x3);@Gin(x4);@Gin(x5);@Gin(x6);@Gin(x7);@Gin(x8);
@Gin(x9);@Gin(x10);@Gin(x11);@Gin(x12);@Gin(x13);@Gin(x14);
结果:
Local optimal solution found.
Objective value: 286914.3
Objective bound: 399732.9
Infeasibilities: 0.000000
Extended solver steps: 2560
Total solver iterations: 8072386
Variable Value Reduced Cost
X1 257.0000 35.20220
W1 44.03124 0.000000
X2 250.0000 -2.936202
W2 35.81236 0.000000
X3 241.0000 -8.104007
W3 29.23779 0.000000
X4 231.0000 8.208103
W4 24.33056 0.000000
X5 219.0000 -2.775089
W5 23.26845 0.000000
X6 206.0000 -1.743849
W6 20.67517 0.000000
X7 192.0000 4.680940
W7 18.65463 0.000000
X8 176.0000 -2.363602
W8 17.95241 0.000000
X9 159.0000 -2.400687
W9 16.03467 0.000000
X10 141.0000 0.9970391
W10 14.23365 0.000000
X11 121.0000 2.302159
W11 13.06024 0.000000
X12 98.00000 -2.917731
W12 11.95777 0.000000
X13 73.00000 1.960116
W13 9.747003 0.000000
X14 42.00000 -0.9435169
W14 7.875102 0.000000
本帖最后由 lin2009 于 2011-1-8 12:00 编辑
用部分穷举法得出如下优化结果:
W = [ 56.789 40.807 27.404 40 30 24.146 20.071 16.956 20.819 16.307 12.518 11.553 7.012 0.46209 ]
L = [ 640 620 600 560 520 480 440 400 340 280 220 140 40 20 ]
X = [ 128 124 120 112 104 96 88 80 68 56 44 28 8 4 ]
S = 0.97*sigma(i=1..14, Li*Wi) = 309619.229097534 7#数据验证的结果:
S = 0.97*sum(i=1..14, Li*Wi)=0.97*159596.9418=154809.0335
哪儿搞错了? 本帖最后由 lin2009 于 2011-1-10 11:43 编辑
应该是截面的1/2,即上半部分或下半部分(上下左右均对称)。
从文中的优化模型的约束方程看,(即4#的优化模型)
$${R_i} = \sqrt {{{\left( {\frac{{{L_i}}}{2}} \right)}^2} + {{\left( {\sum\limits_{j = 1}^i {{W_j}} } \right)}^2}} \leq 325\;\;\;for\;\;i = 1,2,3..14$$
所求的面积应该只是截面积的一半。 有几个约束条件好像不满足,如:
sqrt(((sqrt(((5*x10)/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)^2))/2)^2+(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)^2)-325 = 10.30639608 (应该<=0) 本帖最后由 lin2009 于 2011-1-10 20:22 编辑
可能是变量的定义有出入,下面给出穷举法的Matlab程序。
clear all;
close all;
clc;
tic;
smax = 0; % 记录搜索到的最大截面积
k = 1;
% 铁芯叠片界面为上下左右对称的。
% 仅研究第一象限内的截面积
% 设铁芯叠压的顺序时沿纵轴(y轴方向),
% 即叠片的宽度方向在x轴,厚度方向在y轴。其长度就是变压器铁芯柱的长度,不是研究对象。
% 示意图如下:
% ....
% -----L3---------|W3
% |
% -------L2------------|W2
% |
% ----------L1--------------|
% | W1
% --------------------------|
% 记录最大截面时的厚度和宽度
opt_W = zeros(1,14);% 厚度
opt_L = zeros(1,14);% 宽度
% 厚度用W表示 (即论文中的宽度)
% 宽度用L表示(即论文中的长度)
% 铁芯叠片的编号顺序从y=0处开始,1,2,3,...14.
% 所有叠片均在圆内,其半径为
R = 325;
% 最顶上(编号为14的叠片宽度最小值)
L14min = 10;
% 未加限制时,编号为1的叠片的宽度最大值
N = floor(R/5)*5;
% 若无限制, 则L1max = N;
% 最底下的叠片(第1级叠片,编号为1)的厚度最小值
W1min = 26/2;
% 对应的叠片宽度的最大值
L1max = floor(sqrt(R^2 - W1min^2)/5)*5;
% 以下是按照每级叠片之间的长度之差为10倍数进行编程的
for L14 = L14min:10:L1max - 13*10
for L13 = L14 + 10:10:L1max - 12*10
for L12 = L13 + 10:10:L1max - 11*10
for L11 = L12 + 10:10:L1max - 10*10
for L10 = L11 + 10:10:L1max - 9*10
for L9 = L10 + 10:10:L1max - 8*10
for L8 = L9 + 10:10:L1max - 7*10
for L7 = L8 + 10:10:L1max - 6*10
for L6 = L7 + 10:10:L1max - 5*10
for L5 = L6 + 10:10:L1max - 4*10
for L4 = L5 + 10:10:L1max - 3*10
for L3 = L4 + 10:10:L1max - 2*10
for L2 = L3 + 10:10:L1max - 1*10
for L1 = L2 + 10:10:L1max - 0*10
W1 = sqrt(R^2 - L1 ^2);
W2 = sqrt(R^2 - L2 ^2) - W1;
W3 = sqrt(R^2 - L3 ^2) - W2 - W1;
W4 = sqrt(R^2 - L4 ^2) - W3 - W2 - W1;
W5 = sqrt(R^2 - L5 ^2) - W4 - W3 - W2 - W1;
W6 = sqrt(R^2 - L6 ^2) - W5 - W4 - W3 - W2 - W1;
W7 = sqrt(R^2 - L7 ^2) - W6 - W5 - W4 - W3 - W2 - W1;
W8 = sqrt(R^2 - L8 ^2) - W7 - W6 - W5 - W4 - W3 - W2 - W1;
W9 = sqrt(R^2 - L9 ^2) - W8 - W7 - W6 - W5 - W4 - W3 - W2 - W1;
W10 = sqrt(R^2 - L10^2) - W9 - W8 - W7 - W6 - W5 - W4 - W3 - W2 - W1;
W11 = sqrt(R^2 - L11^2) - W10 - W9 - W8 - W7 - W6 - W5 - W4 - W3 - W2 - W1;
W12 = sqrt(R^2 - L12^2) - W11 - W10 - W9 - W8 - W7 - W6 - W5 - W4 - W3 - W2 - W1;
W13 = sqrt(R^2 - L13^2) - W12 - W11 - W10 - W9 - W8 - W7 - W6 - W5 - W4 - W3 - W2 - W1;
W14 = sqrt(R^2 - L14^2) - W13 - W12 - W11 - W10 - W9 - W8 - W7 - W6 - W5 - W4 - W3 - W2 - W1;
% 计算 S = sum(i=1..14, Li*Wi)
Sall = [ W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12, W13, W14 ] .*...
[ L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14 ];
S = sum(Sall);
if S >= smax
opt_L(1, = [ L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14 ];
opt_W(1, = [ W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12, W13, W14 ];
smax = S;
k = k + 1;
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
toc
% 得出最大值后,乘上0.97*4即得到实际的最大值了
运行时间(Celeron Cpu 2.66GHz,760MB)及最优结果
Elapsed time is 4320.279386 seconds.(1.2小时)
smax =
80128.3765511941
0.97*4*smax
ans =
310898.101018633
opt_L =
320 310 300 290 280 260 240 220 200 180 150 120 90 50
opt_W =
Columns 1 through 9
56.7891 40.8070 27.4039 21.7140 18.2860 30.0000 24.1461 20.0714 16.9563
Columns 10 through 14
14.4274 17.7129 13.7207 10.2552 8.8409
k =
275 寻优的次数达19^14 = 7.99E17。
若按文中的步长2.5(5/2)来寻优,则寻优的次数可达 112^14 = 4.88E28。
呵呵,PC算不了啦。
页:
[1]