您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 09-2惩罚函数的乘子法
2013-2014(1)专业课程实践论文题目:惩罚函数的乘子法一、算法理论乘子法是Powell和Hestenes于1969年针对等式约束优化问题同时独立提出的一种优化算法,后于1973年经Rockfellar推广到求解不等式约束优化问题。其基本思想是从原问题的拉格朗日函数出发,再加上适当的罚函数,从而将原问题转化为求解一系列的无约束优化子问题。由于外罚函数法中的罚参数k,因此增广目标函数变得“越来越病态”。增广目标函数的这种病态性质是外罚函数法的主要缺点,而这种缺陷在乘子法中由于引入拉格朗日函数及加上适当的罚函数而得以有效的克服。我们考虑同时带有等式和不等式约束的优化问题的乘子法:,,,1,0,,,1,0..,minmixglixhtsxfii其基本思想是把解等式约束优化问题的乘子法推广到不等式约束优化问题,即先引进辅助变量把不等式约束化为等式约束,然后再利用最优性条件消去辅助变量。为叙述的方便计,我们先考虑如下只带有不等式约束的最优化问题,,,1,0..,minmixgtsxfi引进辅助变量,,,1miyi,可以将上面的优化问题化为等价的等式约束优化问题:,,,1,0..,min2miyxgtsxfii利用外发函数法求解,此时增广拉格朗日函数为212212,,,~miiiiimiiyxgyxgxfyx为了消去辅助变量y,可考虑~关于变量y的极小化,由一阶必要条件,令0,,,~yxy可得,,,1,0222miyxgyyiiiii即,,,1,02mixgyyiiii故当0iixg时,有iiiiixgxgy112否则,由02xgyiii可推得0yi。综合起来。,有mixgxgxgyiiiiiii,,1,0,0,12既有mixgxgxgyxgiiiiiiii,,1,0,,0,2(1)因此,当0iixg时,我们有2222222122iiiiiiiiiiixgxgxgyxgyxg而当0iixg时,有22222212112iiiiiiiiyxgyxg综合上述两种情形,将结果代回到,,,~yx中去得miiiiyxgxfyxx122)(,0min21,,,~min,,~于是,将式(1)带入乘子迭代公式21ikkiikikyxg得,0)()(,,0)()(,01ikkikiikikkiikxgxgxg即.,,1,0)()(,0max1mixgkiikik回到一般约束优化问题,此时,增广拉格朗日函数为miiiliiliiixgxhxhfx1121]))(,0([min{21)(2)()x(,,,乘子迭代的公式为.,,1,)()(,0max,,,1),()()(11mixglixhkiikikkiikik令212112)})(),(min{)((miikkilikikxgxh则终止准则为k二、算法框图停停10;;;0ccMMkcc),,(min),,*(MxMx}*)({max12xgcimi~2c12~ccmixMgiii,,2,1*)(MMkkcc1;12Dkk~印无容许解标志印印*,2xckcxfx2,*)(,*输出最后结果≤≥<≤>>三、算法程序importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.text.NumberFormat;publicclassShuextendsFrameimplementsActionListener{Labellabelx12,labelx1,labelx22,labelx2,labelx1x2,labela,labelb,labelc,label11,label12,labelnum,labelnumber;TextFieldtextx12,textx1,textx22,textx2,textc1,textx1x2,texta,textb,textc,textnum,textnumber;Buttonbutton;TextAreatextarea;//10doublex1,x12,x22,x2,x1x2,c1,a,b,c,num,number;doublea1x1,a1x2,a1c,a2x1,a2x2,a2c;intn=1;doubleans[],answ[];publicShu(){ans=newdouble[20];answ=newdouble[20];labelx12=newLabel(x1^2+);labelx1=newLabel(x1+);labelx22=newLabel(x2^2+);//20labelx2=newLabel(x2+);labelx1x2=newLabel(x1*x2+);labela=newLabel(x1+);labelb=newLabel(x2+);labelc=newLabel(=0);label11=newLabel(min);label12=newLabel(s.t.);textx12=newTextField(3);textx1=newTextField(3);textx22=newTextField(3);//30textx2=newTextField(3);textx1x2=newTextField(3);textc1=newTextField(3);texta=newTextField(3);textb=newTextField(3);textc=newTextField(3);labelnumber=newLabel(δ:);labelnum=newLabel(μ:);textnum=newTextField(3);textnumber=newTextField(3);button=newButton(enter);button.addActionListener(this);textarea=newTextArea(10,10);Boxbox1=Box.createHorizontalBox();//44box1.add(label11);box1.add(textx12);box1.add(labelx12);box1.add(textx1);box1.add(labelx1);box1.add(textx22);box1.add(labelx22);box1.add(textx2);box1.add(labelx2);box1.add(textx1x2);//54box1.add(labelx1x2);box1.add(textc1);Boxbox2=Box.createHorizontalBox();box2.add(label12);box2.add(texta);box2.add(labela);box2.add(textb);box2.add(labelb);box2.add(textc);box2.add(labelc);//64Boxbox3=Box.createHorizontalBox();box3.add(labelnum);box3.add(textnum);box3.add(labelnumber);box3.add(textnumber);box3.add(button);Boxboxh=Box.createVerticalBox();boxh.add(box1);boxh.add(box2);boxh.add(box3);boxh.add(Box.createVerticalGlue());setLayout(newBorderLayout());add(boxh,BorderLayout.NORTH);add(textarea,BorderLayout.SOUTH);//78addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setVisible(true);setBounds(100,100,600,600);validate();}//88publicvoidactionPerformed(ActionEvente){if(e.getSource()==button){x12=Double.parseDouble(textx12.getText());x1=Double.parseDouble(textx1.getText());x22=Double.parseDouble(textx22.getText());x2=Double.parseDouble(textx2.getText());x1x2=Double.parseDouble(textx1x2.getText());c1=Double.parseDouble(textc1.getText());//98a=Double.parseDouble(texta.getText());b=Double.parseDouble(textb.getText());c=Double.parseDouble(textc.getText());num=Double.parseDouble(textnum.getText());number=Double.parseDouble(textnumber.getText());f(x12,x1,x22,x2,x1x2,c1,a,b,c);}}voidf(doublex12,doublex1,doublex22,doublex2,doublex1x2,doublec1,doublea,doubleb,doublec){a1x1=2*x12+number*a*a;a1x2=x1x2+number*a*b;//110a1c=x1-num*a+number*a*c;a2x1=x1x2+number*a*b;a2x2=2*x22+number*b*b;a2c=x2-num*b+number*c*b;ans[n]=(a2c*a1x2-a1c*a2x2)/(a1x1*a2x2-a2x1*a1x2);answ[n]=(a1c*a2x1-a2c*a1x1)/(a2x2*a1x1-a1x2*a2x1);NumberFormatf1=NumberFormat.getInstance();f1.setMaximumFractionDigits(4);Strings1=f1.format(ans[n]);ans[n]=Double.parseDouble(s1);//120NumberFormatf2=NumberFormat.getInstance();f2.setMaximumFractionDigits(4);Strings2=f2.format(answ[n]);answ[n]=Double.parseDouble(s2);num=num-number*(a*ans[n]+b*answ[n]+c);if(n=10){textarea.setText(x1=+ans[n]+x
本文标题:09-2惩罚函数的乘子法
链接地址:https://www.777doc.com/doc-4624301 .html