092惩罚函数的乘子法.docx

上传人:b****5 文档编号:6658106 上传时间:2023-01-08 格式:DOCX 页数:13 大小:206.70KB
下载 相关 举报
092惩罚函数的乘子法.docx_第1页
第1页 / 共13页
092惩罚函数的乘子法.docx_第2页
第2页 / 共13页
092惩罚函数的乘子法.docx_第3页
第3页 / 共13页
092惩罚函数的乘子法.docx_第4页
第4页 / 共13页
092惩罚函数的乘子法.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

092惩罚函数的乘子法.docx

《092惩罚函数的乘子法.docx》由会员分享,可在线阅读,更多相关《092惩罚函数的乘子法.docx(13页珍藏版)》请在冰豆网上搜索。

092惩罚函数的乘子法.docx

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)输出结果

为最优解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1