092惩罚函数的乘子法Word下载.docx
《092惩罚函数的乘子法Word下载.docx》由会员分享,可在线阅读,更多相关《092惩罚函数的乘子法Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
即
故当
时,有
否则,由
可推得
。
综合起来。
,有
既有
(1)
因此,当
时,我们有
而当
综合上述两种情形,将结果代回到
中去得
于是,将式
(1)带入乘子迭代公式
得
回到一般约束优化问题,此时,增广拉格朗日函数为
乘子迭代的公式为
令
则终止准则为
二、算法框图
三、算法程序
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;
//10
doublex1,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+"
//20
labelx2=newLabel("
x2+"
labelx1x2=newLabel("
x1*x2+"
labela=newLabel("
labelb=newLabel("
labelc=newLabel("
=0"
label11=newLabel("
min"
label12=newLabel("
s.t."
textx12=newTextField(3);
textx1=newTextField(3);
textx22=newTextField(3);
//30
textx2=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();
//44
box1.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);
//54
box1.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);
//64
Boxbox3=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);
//78
addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
setVisible(true);
setBounds(100,100,600,600);
validate();
}//88
publicvoidactionPerformed(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());
//98
a=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;
//110
a1c=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);
//120
NumberFormatf2=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]+"
x2="
+answ[n]+"
"
+n);
else
2){
if((ans[n]==ans[n-1])&
&
(answ[n]==answ[n-1]))
{textarea.setText("
else//130
n+=1;
publicstaticvoidmain(Stringargs[])
newShu();
}
四、算法实现
例1.用乘子法求解问题
解:
运行程序
(1)显示出对话框。
(2)输入目标函数和约束条件的系数并填入
和
值,点击enter。
(3)输出结果
为最优解。
例2.用乘子法求解问题
例3.用乘子法求解问题
例4.用乘子法求解问题