新聞中心
罰函數(shù)法和拉格朗日乘子法的區(qū)別
一、作用不同:
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的武威網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
懲罰函數(shù)法在M越來越大的情況下,函數(shù)F趨近于病態(tài),乘子法克服這個缺點根據(jù)拉格朗日分解加了一個uih(x)M變?yōu)榱薱/2。
主要思想是引入一個新的參數(shù)λ(即拉格朗日乘子),將約束條件函數(shù)與原函數(shù)聯(lián)系到一起,使能配成與變量數(shù)量相等的等式方程。
二、定義不同:
基本的拉格朗日乘子法(又稱為拉格朗日乘數(shù)法),就是求函數(shù)f(x1,x2,)在g(x1,x2,)=0的約束條件下的極值的方法。
罰函數(shù)法是從非可行解出發(fā)逐漸移動到可行區(qū)域的方法。罰函數(shù)法在理論上是可行的,在實際計算中的缺點是罰因子M的取值難于把握,太小起不到懲罰作用;太大則由于誤差的影響會導(dǎo)致錯誤。
三、使用方法不同:
在進化計算中,研究者選擇外部罰函數(shù)法的原因主要是該方法不需要提供初始可行解。需要提供初始可行解則是內(nèi)部罰函數(shù)法的主要缺點。由于進化算法應(yīng)用到實際問題中可能存在搜索可行解就是NP難問題,因此這個缺點是非常致命的。
基本的拉格朗日乘子法就bai是求函數(shù)f(x1,x2,...)在約束條件g(x1,x2,...)=0下的極值的方法。其主要思想是將約束條件函數(shù)與原函數(shù)聯(lián)立,從而求出使原函數(shù)取得極值的各個變量的解。
擴展資料:
如果這個實際問題的最大或最小值存在,一般說來駐點只有一個,于是最值可求。
條件極值問題也可以化為無條件極值求解,但有些條件關(guān)系比較復(fù)雜,代換和運算很繁,而相對來說“拉格朗日乘數(shù)法”不需代換,運算簡單一點,這就是優(yōu)勢。
條件φ(x,y,z)一定是個等式,不妨設(shè)為φ(x,y,z)=m
則再建一個函數(shù)g(x,y,z)=φ(x,y,z)-m
g(x,y,z)=0以g(x,y,z)代替φ(x,y,z)
在許多極值問題中,函數(shù)的自變量往往要受到一些條件的限制,比如,要設(shè)計一個容積為 V的長方體形開口水箱,確定長、寬和高,使水箱的表面積最小.。設(shè)水箱的長、寬、高分別為 x,y,z, 則水箱容積V=xyz。
參考資料來源:百度百科-拉格朗日乘數(shù)法
求解一道貪心算法
因為這個問題涉及到高維求解(大于3維),所以不推薦你用貪心算法或遺傳算法之類的算法。這里給出一種升級的蒙特卡羅算法——自適應(yīng)序貫數(shù)論算法,這是一種以GLP集合為基礎(chǔ)的隨機遍歷算法,可以很輕易的解決一系列的高維求解問題,目前根據(jù)網(wǎng)上能找到的資料最多可以做到18維。
下面就根據(jù)你給出的例子講解一下:
對于6000的料來說
1185最多做到5根(要求4根,所以一根木料對于1185的產(chǎn)品來說最多有0到45種可能);1079最多做到5根;985最多做到6根;756最多做到7根。
所以第一次加工一根木料最多有5*6*7*8=1680種加工可能(當(dāng)然其中包括那些產(chǎn)品總長度大于料長的可能,但是我們可以通過罰函數(shù)來避免這些情況),那么利用GLP算法我們可以一次性產(chǎn)生這1680種可能,然后逐個比較那種可能最省木料;
設(shè)第一加工出的產(chǎn)品量分別為1 1 3 1
那么1185加工量剩3,1079剩5,985剩7,756剩7,所以第二次加工的可能性有(3+1)*(5+1)*(6+1)*(7+1)=1120種
關(guān)于自適應(yīng)序貫數(shù)論算法,根據(jù)這道題你可以這樣理解,4種尺寸構(gòu)成了一個4維的空間,四種尺寸的每一種組合相當(dāng)于空間中的一個點(1185的1根,1079的1根,985的3根,756的1根,這就組成了這個4維空間中的(1,1,3,1)點) ,自適應(yīng)序貫數(shù)論算法就是先根據(jù)GLP算法在這個4維空間中隨機的,均勻的分布一定的點(也就是尺寸的組合),然后根據(jù)目標(biāo)函數(shù)確定其中哪一個點是最優(yōu)點,我們認為最優(yōu)點的附近出現(xiàn)最優(yōu)解的可能性最大,那么我們就以最優(yōu)點為中心,以一定的尺度為半徑將原空間縮小,然后我們在心空間中再一次利用GLP算法均勻,隨機的充滿這個空間,然后重復(fù)以上過程,直到這個空間小到我們事先規(guī)定的大小,這樣我們就找到了最優(yōu)解。
也許你會擔(dān)心算法一上來就收斂到了局部最優(yōu)解,然后一直在這里打轉(zhuǎn),不用擔(dān)心,GLP最大的優(yōu)點就是均勻的充斥整個空間,盡量將每一種可能都遍歷到。
這種算法的缺點在于充斥空間用的點需要生成向量來生成,每一種充斥方式都需要不同的向量,你可以在《數(shù)論方法在統(tǒng)計中的應(yīng)用》這本書中查到已有的每種充斥方式對應(yīng)的那些生成向量。
下面是我跟據(jù)對你給出的例子的理解算出的結(jié)果。
1185:1根
1079:1根
985:3根
756:1根
剩余木料0
1185:1根
1079:1根
985:3根
756:1根
剩余木料0
1185:1根
1079:1根
985:3根
756:1根
剩余木料0
1185:1根
1079:0根
985:1根
756:5根
剩余木料15
1185:0根
1079:3根
985:0根
756:0根
剩余木料2748
用去木料:5根
請按任意鍵繼續(xù). . .
程序代碼如下:(變量都是用漢語拼音標(biāo)的)
#include stdlib.h
#include stdio.h
#include math.h
#include iostream.h
#include iomanip.h
#include time.h
#include fstream.h
#include windows.h
#include "glp.h"
#define jiedeweishu 4
#define glpgeshu 10007
#define glpgeshu1 5003//100063
#define glpgeshu2 6007//33139//71053//172155//100063
#define yuanmuchang 6000
#define qiegesushi 5
#define chicun1 1185
#define chicun2 1079
#define chicun3 985
#define chicun4 756
#define chicun1shuliang 4
#define chicun2shuliang 6
#define chicun3shuliang 10
#define chicun4shuliang 8
float xuqiuchicun[jiedeweishu]={chicun1,chicun2,chicun3,chicun4};
float chicunxuqiuliang[jiedeweishu]={chicun1shuliang,chicun2shuliang,chicun3shuliang,chicun4shuliang};
float zuobianjie0[jiedeweishu];//{-19,1,-11,1.5,0,200};//{0.39111,-18.5,1,-11,1,0,2};//左邊界
float youbianjie0[jiedeweishu];//{-17,1.5,-7,2,0.05,900};//{0.393,-17,2,-9,2,0.1,6};//右邊界
float zuobianjie[jiedeweishu];
float youbianjie[jiedeweishu];
float zuobianjie1[jiedeweishu];//過度用
float youbianjie1[jiedeweishu];
float zuobianjie2[jiedeweishu];//局部邊界
float youbianjie2[jiedeweishu];
float zuobianjie3[jiedeweishu];//大邊界
float youbianjie3[jiedeweishu];
float sheng_cheng_xiang_liang[jiedeweishu]={1,1206,3421,2842};//生成向量
float sheng_cheng_xiang_liang1[jiedeweishu]={1,792,1889,191};//{1,39040,62047,89839,6347,30892,64404};//生成向量
float sheng_cheng_xiang_liang2[jiedeweishu]={1,1351,5080,3086};//{1,18236,1831,19143,5522,22910};//{1,18010,3155,50203,6065,13328};//{1,167459,153499,130657,99554,61040,18165};
struct chushi
{
float geti[jiedeweishu];
float shiyingdu;
};
chushi *zuiyougeti;//精英保存策略
chushi *zuiyougetijicunqi;
int sishewuru(float);
float chazhi;//左右邊界的差
int biaozhi;//判斷尋優(yōu)是否成功1表示成功0表示不成功
int maxgen;//最大計算代數(shù)
int gen;//目前代數(shù)
void initialize();//算法初始化
void jingyingbaoliu();//精英保存的實現(xiàn)
void mubiaohanshu1(chushi bianliang);//適應(yīng)度的計算使用殘差法
int cmpshiyingdujiang(const void *p1,const void *p2)
{
float i=((chushi *)p1)-shiyingdu;
float j=((chushi *)p2)-shiyingdu;
return ij ? 1:(i==j ? 0:-1);//現(xiàn)在是按降序牌排列,將1和-1互換后就是按升序排列
}
int cmp1(const void *p1,const void *p2)
{
float i= *(float*)p1;
float j= *(float*)p2;
return ij ? 1:(i==j ? 0:-1);//現(xiàn)在是按降序牌排列,將1和-1互換后就是按升序排列
}
void main()
{
float bianjiebianhuashuzu[jiedeweishu];
float yiwanchengshuliang[jiedeweishu];
zuiyougeti=new chushi;//最優(yōu)個體的生成
zuiyougetijicunqi=new chushi;
int i;
for(i=0;ijiedeweishu;i++)
{
zuiyougeti-geti[i]=0;
yiwanchengshuliang[i]=0;
}
int muliaoshuliang=0;
while(1)
{
if(yiwanchengshuliang[0]==chicun1shuliangyiwanchengshuliang[1]==chicun2shuliangyiwanchengshuliang[2]==chicun3shuliangyiwanchengshuliang[3]==chicun4shuliang)
break;//都加工完了就退出程序
biaozhi=1;
for(i=0;ijiedeweishu;i++)
{
bianjiebianhuashuzu[i]=chicunxuqiuliang[i]-yiwanchengshuliang[i];
}
for(i=0;ijiedeweishu;i++)
{
zuobianjie0[i]=0;
if(bianjiebianhuashuzu[i](int)(yuanmuchang/xuqiuchicun[i]))
{
youbianjie0[i]=(int)(yuanmuchang/xuqiuchicun[i]);
}
else
{
youbianjie0[i]=bianjiebianhuashuzu[i];
}
}
for(i=0;ijiedeweishu;i++)
{
zuobianjie[i]=zuobianjie0[i];
youbianjie[i]=youbianjie0[i];
}
for(i=0;ijiedeweishu;i++)//在這套程序中邊界分為兩個部分,其中一組是根據(jù)最優(yōu)解的收斂范圍進行局部尋優(yōu),如果在局部找不到最優(yōu)解則以現(xiàn)有最優(yōu)解為中心進行全局搜索
{
zuobianjie2[i]=zuobianjie[i];
youbianjie2[i]=youbianjie[i];
zuobianjie3[i]=zuobianjie[i];
youbianjie3[i]=youbianjie[i];
}
zuiyougeti-shiyingdu=-3000;
//cout zuiyougeti-shiyingduendl;
initialize();
//for(i=0;ijiedeweishu;i++)/////
//{////
// coutzuiyougeti-geti[i]",";////
//}/////////
//coutendl;/////
// cout"初始最優(yōu)解:"" "-zuiyougeti-shiyingduendl;/////////////
for(gen=1;genmaxgen;gen++)
{
jingyingbaoliu();
if(chazhi1e-1)
break;
}
//cout"最終在收斂的范圍內(nèi)左右邊界的最大差值: "chazhiendl;
//for(i=0;ijiedeweishu;i++)
//{
// coutsetiosflags(ios::fixed)setprecision(6)zuiyougeti-geti[i]",";
// }
//coutendl;
//cout"共用代數(shù)"genendl;
cout"1185:"zuiyougeti-geti[0]"根"endl;
cout"1079:"zuiyougeti-geti[1]"根"endl;
cout"985:"zuiyougeti-geti[2]"根"endl;
cout"756:"zuiyougeti-geti[3]"根"endl;
cout"剩余木料"(-zuiyougeti-shiyingdu)endl;////////////////
coutendl;
for(i=0;ijiedeweishu;i++)
{
yiwanchengshuliang[i]=yiwanchengshuliang[i]+zuiyougeti-geti[i];
}
muliaoshuliang++;
}
cout"用去木料:"muliaoshuliang"根"endl;
delete [] zuiyougetijicunqi;
delete [] zuiyougeti;
system("pause");
}
void initialize()
{
maxgen=20;//最大代數(shù)
gen=0;//起始代
chazhi=100;
chushi *chushizhongqunji;
chushizhongqunji=new chushi[glpgeshu];
int i,j;
for(i=0;ijiedeweishu;i++)
{
zuobianjie1[i]=zuobianjie[i];
youbianjie1[i]=youbianjie[i];
}
float **glp_shu_zu;//第一次求解,為了使解更精確這一次求解需要的點最多
glp_shu_zu=new (float *[glpgeshu]);
for(i=0;iglpgeshu;i++)
{
glp_shu_zu[i]=new float[jiedeweishu];//生成的glp向量用glp_shu_zu儲存
}
glp glp_qiu_jie_first(glpgeshu,jiedeweishu);//定義生成多少組glp向量和向量的維數(shù)
glp_qiu_jie_first.glp_qiu_jie(glp_shu_zu,sheng_cheng_xiang_liang);//將生成的glp向量用glp_shu_zu儲存,同時將生成向量帶入glp類
for(i=0;iglpgeshu;i++)//產(chǎn)生初始種群
{
for(j=0;jjiedeweishu;j++)
{
chushizhongqunji[i].geti[j]=sishewuru((zuobianjie[j]+(youbianjie[j]-(zuobianjie[j]))*glp_shu_zu[i][j]));
if(j==3glp_shu_zu[i][j]0)
{
cout"274"endl;/////////////
coutzuobianjie[j]" "glp_shu_zu[i][j]" "youbianjie[j]endl;////////////////////
system("pause");///////////////////
}
}
}
for(i=0;iglpgeshu;i++)//計算初始種群的適應(yīng)度
{
mubiaohanshu1(chushizhongqunji[i]);
}
qsort(chushizhongqunji,glpgeshu,sizeof(chushi),cmpshiyingdujiang);//根據(jù)適應(yīng)度將初始種群集按降序進行排列
chushi *youxiugetiku;//建立一個儲存優(yōu)秀個體的庫
youxiugetiku=new chushi[glpgeshu];//建立一個儲存優(yōu)秀個體的庫
int jishuqi=0;
i=0;
while(chushizhongqunji[i].shiyingduzuiyougeti-shiyingdu)//凡是比上一代的最優(yōu)個體還要好的個體都放入優(yōu)秀個體庫
{
for(int j=0;jjiedeweishu;j++)
{
youxiugetiku[i].geti[j]=chushizhongqunji[i].geti[j];
//coutyouxiugetiku[i].geti[j]endl;
}
//system("pause");
i++;
}
// coutiendl;//////////////
//system("pause");//////////////////////////////////////
jishuqi=i;//將得到的優(yōu)秀個體的數(shù)量放入jishuqi保存
float *bianjiezancunqi;//下面就要以優(yōu)秀個體庫中個體的范圍在成立一個局部搜索區(qū)域,所以先建立一個邊界暫存器
bianjiezancunqi=new float[jishuqi];
for(i=0;ijiedeweishu;i++)
{
for(int j=0;jjishuqi;j++)
{
bianjiezancunqi[j]=youxiugetiku[j].geti[i];//將優(yōu)秀個體庫每一維的數(shù)據(jù)都放入bianjiezancunqi
}
qsort(bianjiezancunqi,jishuqi,sizeof(float),cmp1);//對這些數(shù)據(jù)按降序排列,取兩個邊界又得到一個局部范圍
//將得到的范圍進行保存
zuobianjie[i]=bianjiezancunqi[jishuqi-1];
youbianjie[i]=bianjiezancunqi[0];
//coutzuobianjie[i]endl;//////////////////////////
// coutyoubianjie[i]endl;///////////////////////////
//coutendl;///////////////////
//
if(zuobianjie[i]zuobianjie2[i])//如果新得到的局部左邊界在上一代局部左邊界左邊,則左邊界取上一代的
{
zuobianjie[i]=zuobianjie2[i];
}
if(youbianjie[i]youbianjie2[i])//如果新得到的局部右邊界在上一代局部右邊界右邊,則右邊界取上一代的
{
youbianjie[i]=youbianjie2[i];
}
}
if(chushizhongqunji[0].shiyingduzuiyougeti-shiyingdu)//本代種群的最優(yōu)個體比歷史最有個個體好,則用本代的代替之,并將標(biāo)志位賦值為1表示尋優(yōu)成功
{
for(i=0;ijiedeweishu;i++)
{
zuiyougeti-geti[i]=chushizhongqunji[0].geti[i];
}
zuiyougeti-shiyingdu=chushizhongqunji[0].shiyingdu;
biaozhi=1;
}
delete [] bianjiezancunqi;
delete [] youxiugetiku;
for(i=0;iglpgeshu;i++)
{
delete [] glp_shu_zu[i];
}
delete [] glp_shu_zu;
delete [] chushizhongqunji;
}
void jingyingbaoliu() //精英保留的實現(xiàn)
{
float glpshuliang,xiangliang[jiedeweishu];
if(biaozhi==1)//如果尋優(yōu)成功則利用局部搜索的數(shù)據(jù)
{
glpshuliang=glpgeshu1;
for(int i=0;ijiedeweishu;i++)
{
xiangliang[i]=sheng_cheng_xiang_liang1[i];
}
}
else//否則利用全局搜索的數(shù)據(jù)
{
glpshuliang=glpgeshu2;
for(int i=0;ijiedeweishu;i++)
{
xiangliang[i]=sheng_cheng_xiang_liang2[i];
}
}
chushi *chushizhongqunji;//建立一個用來儲存種群的容器
chushizhongqunji=new chushi[glpshuliang];
int i,j;
float **glp_shu_zu;//生成一個glp數(shù)組
glp_shu_zu=new (float *[glpshuliang]);
for(i=0;iglpshuliang;i++)
{
glp_shu_zu[i]=new float[jiedeweishu];//生成的glp向量用glp_shu_zu儲存
}
glp glp_qiu_jie_first(glpshuliang,jiedeweishu);//定義生成多少組glp向量和向量的維數(shù)
glp_qiu_jie_first.glp_qiu_jie(glp_shu_zu,xiangliang);//將生成的glp向量用glp_shu_zu儲存,同時將生成向量帶入glp類
//cout"377"endl;
if(biaozhi!=1)//如果尋優(yōu)不成功則進入全局搜索
{
//cout"380"endl;////////////
float bianjiecha[jiedeweishu];
for(i=0;ijiedeweishu;i++)
{
bianjiecha[i]=youbianjie3[i]-zuobianjie3[i];//計算上一代全局每一維范圍的寬度
}
static float rou=0.9;//定義收縮比
//float rou=pow(0.5,gen);
for(i=0;ijiedeweishu;i++)//確定新的范圍
{
zuobianjie1[i]=zuiyougeti-geti[i]-rou*bianjiecha[i];//左邊界為以最優(yōu)個體為中心-范圍寬度乘以收縮比
if(zuobianjie1[i]zuobianjie2[i])//如果新的左邊界比目前局部左邊界大,那么以目前的為全局尋優(yōu)的左邊界
{
zuobianjie[i]=zuobianjie1[i];
zuobianjie3[i]=zuobianjie1[i];
}
else//否則以局部左邊界為全局左邊界
{
zuobianjie[i]=zuobianjie2[i];
zuobianjie3[i]=zuobianjie2[i];
}
youbianjie1[i]=zuiyougeti-geti[i]+rou*bianjiecha[i];//右邊界為以最優(yōu)個體為中心+范圍寬度乘以收縮比
if(youbianjie1[i]youbianjie2[i])
{
youbianjie[i]=youbianjie1[i];
youbianjie3[i]=youbianjie1[i];
}
else
{
youbianjie[i]=youbianjie2[i];
youbianjie3[i]=youbianjie2[i];
}
}
qsort(bianjiecha,jiedeweishu,sizeof(float),cmp1);
if(chazhi==bianjiecha[0])//如果最大邊界差不變的話就將收縮因子變小
{
rou=pow(rou,2);
}
chazhi=bianjiecha[0];
}
//cout"421"endl;/////////////////////
for(i=0;iglpshuliang;i++)//根據(jù)新產(chǎn)生的最優(yōu)個體確定glp群
{
for(j=0;jjiedeweishu;j++)
{
chushizhongqunji[i].geti[j]=sishewuru((zuobianjie[j]+(youbianjie[j]-(zuobianjie[j]))*glp_shu_zu[i][j]));
}
}
for(i=0;iglpshuliang;i++)
{
mubiaohanshu1(chushizhongqunji[i]);
}
qsort(chushizhongqunji,glpshuliang,sizeof(chushi),cmpshiyingdujiang);
zuiyougetijicunqi-shiyingdu=zuiyougeti-shiyingdu;
if(chushizhongqunji[0].shiyingduzuiyougeti-shiyingdu)
{
for(i=0;ijiedeweishu;i++)
{
zuiyougeti-geti[i]=chushizhongqunji[0].geti[i];
}
zuiyougeti-shiyingdu=chushizhongqunji[0].shiyingdu;
biaozhi=1;
}
else
{
// cout"446"endl;/////////////
biaozhi=0;
}
if(biaozhi==1)//如果尋優(yōu)成功了就需要確立一個新的局部最優(yōu)解范圍
{
chushi *youxiugetiku;
youxiugetiku=new chushi[glpshuliang];
int jishuqi=0;
i=0;
while(chushizhongqunji[i].shiyingduzuiyougetijicunqi-shiyingdu)
{
for(int j=0;jjiedeweishu;j++)
{
youxiugetiku[i].geti[j]=chushizhongqunji[i].geti[j];
}
i++;
}
jishuqi=i;
float *bianjiezancunqi;
bianjiezancunqi=new float[jishuqi];
for(i=0;ijiedeweishu;i++)
{
for(int j=0;jjishuqi;j++)
{
bianjiezancunqi[j]=youxiugetiku[j].geti[i];
}
qsort(bianjiezancunqi,jishuqi,sizeof(float),cmp1);
zuobianjie[i]=bianjiezancunqi[jishuqi-1];
youbianjie[i]=bianjiezancunqi[0];
// coutzuobianjie[i]endl;//////////////
// coutyoubianjie[i]endl;/////////////
// coutendl;///////////////
if(zuobianjie[i]zuobianjie2[i])
{
zuobianjie[i]=zuobianjie2[i];
}
if(youbianjie[i]youbianjie2[i])
{
youbianjie[i]=youbianjie2[i];
}
}
delete [] bianjiezancunqi;
delete [] youxiugetiku;
}
for(i=0;iglpshuliang;i++)
{
delete [] glp_shu_zu[i];
}
delete [] glp_shu_zu;
delete [] chushizhongqunji;
}
void mubiaohanshu1(chushi bianliang)//計算shiyingdu
{
int i=0;
int sunshi,chanpin;
sunshi=qiegesushi*(bianliang.geti[0]+bianliang.geti[1]+bianliang.geti[2]+bianliang.geti[3]-1);
chanpin=chicun1*bianliang.geti[0]+chicun2*bianliang.geti[1]+chicun3*bianliang.geti[2]+chicun4*bianliang.geti[3];
bianliang.shiyingdu=yuanmuchang-sunshi-chanpin;
if(bianliang.shiyingdu!=0)//如果不能正好將木料分成所需尺寸則要多切一刀
{
sunshi=qiegesushi*(bianliang.geti[0]+bianliang.geti[1]+bianliang.geti[2]+bianliang.geti[3]);
}
if(bianliang.shiyingdu0)//罰函數(shù)
{
bianliang.shiyingdu=bianliang.shiyingdu+1e5;
}
bianliang.shiyingdu=-bianliang.shiyingdu;
}
int sishewuru(float x)
{
float y;
int z;
y=x-(int)x;
if(y0.5)
{
z=(int)(x);
}
else
{
z=(int)x;
z=z+1;
}
return z;
}
glp.h源文件貼不下了,把你郵箱給我我發(fā)給你
郵箱:hu_hu605@163.com
powell算法求解懲罰函數(shù)內(nèi)點法 用c語言實現(xiàn) 誰會 急!!!!
#include#definestacksize100//假定預(yù)分配的棧空間最多為100個元素typedefcharelementtype;//假定棧元素的數(shù)據(jù)類型為字符,在此處可以自行設(shè)置typedefstruct{elementtypedata[stacksize];inttop;}seqstack;//置空棧voidinitstack(seqstack*s){s-top=-1;//解釋一下,s-top指向的是當(dāng)前棧頂元素的位置//當(dāng)要向棧中添加一個新元素時,要先將s-top增加1,//此時s-top指向的就是新元素要添加的位置了。//所以當(dāng)棧為空時,填加第一元素時,top加1后//s-top的值就變?yōu)?,也就是第一個元素的位置了。}//判棧空intstackempty(seqstack*s){if(s-top==-1)return1;//若相等就返回1,否則為0elsereturn0;}//入棧voidpush(seqstack*s,elementtypex){if(s-top==stacksize-1)//進棧前判斷棧是否已經(jīng)滿了printf("stackoverflow\n");else{s-top=s-top+1;s-data[s-top]=x;}}//出棧elementtypepop(seqstack*s){if(stackempty(s))//出棧前先判斷當(dāng)前棧中是否有內(nèi)容printf("stackisempty\n");else{returns-data[s-top--];//出棧后s-top的值會自減1}}//取棧頂元素(只是想知道棧頂?shù)闹担]有出棧)elementtypegettop(seqstack*s){if(stackempty(s)){printf("stackalreadyempty.\n");}elsereturns-data[s-top];}intmain(){elementtypex;seqstack*s;//定義一個棧,用指針的方式定義的initstack(s);//想初始化定義好的棧//當(dāng)棧為空時調(diào)用出棧操作pop(s);//向棧中添加一個元素apush(s,'a');//觀察此時的棧頂元素x=gettop(s);printf("%c\n",x);//再添加一個元素bpush(s,'b');//觀察此時的棧頂元素x=gettop(s);printf("%c\n",x);//彈出棧頂?shù)脑豿=pop(s);printf("%c\n",x);//觀察彈出后棧頂元素的變化情況x=gettop(s);printf("%c\n",x);return0;}
分享題目:罰函數(shù)c語言 罰函數(shù)求解
文章出自:http://ef60e0e.cn/article/dooggdh.html