092惩罚函数的乘子法.docx
- 文档编号:6658106
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:13
- 大小:206.70KB
092惩罚函数的乘子法.docx
《092惩罚函数的乘子法.docx》由会员分享,可在线阅读,更多相关《092惩罚函数的乘子法.docx(13页珍藏版)》请在冰豆网上搜索。
092惩罚函数的乘子法
2013-2014
(1)专业课程实践论文
题目:
惩罚函数的乘子法
一、算法理论
乘子法是Powell和Hestenes于1969年针对等式约束优化问题同时独立提出的一种优化算法,后于1973年经Rockfellar推广到求解不等式约束优化问题。
其基本思想是从原问题的拉格朗日函数出发,再加上适当的罚函数,从而将原问题转化为求解一系列的无约束优化子问题。
由于外罚函数法中的罚参数
因此增广目标函数变得“越来越病态”。
增广目标函数的这种病态性质是外罚函数法的主要缺点,而这种缺陷在乘子法中由于引入拉格朗日函数及加上适当的罚函数而得以有效的克服。
我们考虑同时带有等式和不等式约束的优化问题的乘子法:
其基本思想是把解等式约束优化问题的乘子法推广到不等式约束优化问题,即先引进辅助变量把不等式约束化为等式约束,然后再利用最优性条件消去辅助变量。
为叙述的方便计,我们先考虑如下只带有不等式约束的最优化问题
引进辅助变量
,可以将上面的优化问题化为等价的等式约束优化问题:
利用外发函数法求解,此时增广拉格朗日函数为
为了消去辅助变量
,可考虑
关于变量
的极小化,由一阶必要条件,令
可得
即
故当
时,有
否则,由
可推得
。
综合起来。
,有
既有
(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("x1+");
labelb=newLabel("x2+");
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
{
if(n>2){
if((ans[n]==ans[n-1])&&(answ[n]==answ[n-1]))
{textarea.setText("x1="+ans[n]+"x2="+answ[n]+""+n);
}
else//130
{
n+=1;
f(x12,x1,x22,x2,x1x2,c1,a,b,c);
}
}
else
{
n+=1;
f(x12,x1,x22,x2,x1x2,c1,a,b,c);
}
}
}
publicstaticvoidmain(Stringargs[])
{
newShu();
}
}
四、算法实现
例1.用乘子法求解问题
解:
运行程序
(1)显示出对话框。
(2)输入目标函数和约束条件的系数并填入
和
值,点击enter。
(3)输出结果
为最优解。
例2.用乘子法求解问题
解:
运行程序
(1)显示出对话框。
(2)输入目标函数和约束条件的系数并填入
和
值,点击enter。
(3)输出结果
为最优解。
例3.用乘子法求解问题
解:
运行程序
(1)显示出对话框。
(2)输入目标函数和约束条件的系数并填入
和
值,点击enter。
(3)输出结果
为最优解。
例4.用乘子法求解问题
解:
运行程序
(1)显示出对话框。
(2)输入目标函数和约束条件的系数并填入
和
值,点击enter。
(3)输出结果
为最优解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 092 惩罚 函数 乘子法