两阶段法C程序Word格式文档下载.doc

上传人:wj 文档编号:3563985 上传时间:2023-05-02 格式:DOC 页数:18 大小:42KB
下载 相关 举报
两阶段法C程序Word格式文档下载.doc_第1页
第1页 / 共18页
两阶段法C程序Word格式文档下载.doc_第2页
第2页 / 共18页
两阶段法C程序Word格式文档下载.doc_第3页
第3页 / 共18页
两阶段法C程序Word格式文档下载.doc_第4页
第4页 / 共18页
两阶段法C程序Word格式文档下载.doc_第5页
第5页 / 共18页
两阶段法C程序Word格式文档下载.doc_第6页
第6页 / 共18页
两阶段法C程序Word格式文档下载.doc_第7页
第7页 / 共18页
两阶段法C程序Word格式文档下载.doc_第8页
第8页 / 共18页
两阶段法C程序Word格式文档下载.doc_第9页
第9页 / 共18页
两阶段法C程序Word格式文档下载.doc_第10页
第10页 / 共18页
两阶段法C程序Word格式文档下载.doc_第11页
第11页 / 共18页
两阶段法C程序Word格式文档下载.doc_第12页
第12页 / 共18页
两阶段法C程序Word格式文档下载.doc_第13页
第13页 / 共18页
两阶段法C程序Word格式文档下载.doc_第14页
第14页 / 共18页
两阶段法C程序Word格式文档下载.doc_第15页
第15页 / 共18页
两阶段法C程序Word格式文档下载.doc_第16页
第16页 / 共18页
两阶段法C程序Word格式文档下载.doc_第17页
第17页 / 共18页
两阶段法C程序Word格式文档下载.doc_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

两阶段法C程序Word格式文档下载.doc

《两阶段法C程序Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《两阶段法C程序Word格式文档下载.doc(18页珍藏版)》请在冰点文库上搜索。

两阶段法C程序Word格式文档下载.doc

voidcreate();

//建立方程组

voiditerative();

//单纯型法迭代voidoutput();

//输出结果

voidbanner();

//打印程序标题

voidexchange();

//交换两阶段价值系数voidshow();

//输出方程组

voidmain(){

inti,j,k;

banner();

create();

//保存原价值系数,转换为第一阶段价值系数for(i=1;

i<

=num_x;

i++){k=0;

for(j=1;

j<

=num_ar;

j++)if(i==arti[j])k=1;

if(k==1)temp_c=-1;

elsetemp_c=0;

}

exchange(c,temp_c);

printf("

\n\n第一阶段问题为:

\n\n"

);

show();

step++;

\n\n按回车开始第一阶段迭代"

getchar();

getchar();

iterative();

if(status==-2){puts("

迭代超过限制次数强行终止~\n"

puts("

\n按回车结束"

exit(0);

output();

if(max!

=0){

puts("

\n\n原问题无可行解。

\n"

//转换为第二阶段价值系数

//把人工变量列全设为0

for(i=1;

i++){

c[arti]=0;

=num_st;

j++)a[j][arti]=0;

\n\n第二阶段问题为:

\n\n按回车开始第二阶段迭代"

switch(status){case1:

\n\n原问题有唯一最优解。

case0:

\n\n原问题为无界解。

case-1:

\n\n原问题有无穷多最优解。

case-2:

}//switch

voidbanner(){

\t\t****************************************\n"

\t\t单纯型法解线性规划问题\n"

\t\t作者:

Thunder\n"

voidshow(){

//对方程组以自然的格式输出,系数为零的x不显示//为1的不显示系数1,-1系数只显示负号

switch(step){

case1:

minz="

x[%d]"

arti[1]);

for(i=2;

i++)printf("

+x[%d]"

arti);

break;

case2:

maxz="

%lgx[%d]"

c[1],1);

i++){if(c==1)printf("

i);

elseif(c==-1)printf("

-x[%d]"

elseif(c>

=0)printf("

+%lgx[%d]"

c,i);

elseprintf("

%lgx[%d]"

}

\nst:

k=0;

j++){

if(a[j]!

if(a[j]==1&

&

k!

j);

elseif(a[j]==1&

k==0)printf("

x[%d]"

elseif(a[j]==-1)printf("

elseif(a[j]>

=0&

a[j],j);

elseif(a[j]>

k=1;

==%lg\n"

b);

x[1]~x[%d]>

=0"

num_x);

voidexchange(){

inti;

doubletemp[MAX];

temp=temp_c;

temp_c=c;

c=temp;

voidcreate()

{

//输入方程组系数,每个方程输完后回显确认

inti,j,k,re_st[MAX],tnum_x,num_addv=0,num_ba=0;

charconfirm;

while

(1)

请选择:

1、求最大值,2、求最小值:

(1/2)"

scanf("

%d"

&

ma_mi);

if(ma_mi!

=1&

ma_mi!

=2)printf("

输入错误,重新选择。

"

elsebreak;

while

(1){

指定变量个数:

scanf("

num_x);

输入价值系数c1-c%d:

for(i=1;

i++){printf("

c%d="

%lf"

c);

if(ma_mi==1)printf("

elseprintf("

printf("

i++){if(c>

\n正确吗,:

(y/n)"

confirm=getchar();

if(confirm=='

y'

)break;

elseif(confirm=='

n'

)continue;

输入约束方程组个数:

num_st);

st.%d:

1、==,2、>

=,3、<

=:

(1/2/3)"

re_st);

if(re_st!

re_st!

=2&

=3)printf("

输入错误,请重新选择。

elsebreak;

输入技术系数:

j++){printf("

a%d="

a[j]);

输入资源拥有量:

\nb%d="

b);

st.%i:

a[1],1);

for(j=2;

if(a[j]>

switch(re_st){

==%lg"

break;

case2:

>

=%lg"

case3:

<

\n正确吗,(y/n)"

elseif(confirm=='

){i-=1;

}}

//显示输入的方程组

\n原问题为:

for(i=2;

if(c==1)printf("

elseif(c>

elseif(a[j]==-1)printf("

=%lg\n"

case3:

=0\n"

tnum_x=num_x;

i++){switch(re_st){

num_x+=1;

num_x+=2;

//化为标准形式

if(ma_mi==2)for(i=1;

=tnum_x;

i++)c*=-1;

//求最小值时,系数变相反数

num_addv++;

num_ba++;

num_ar++;

c[tnum_x+num_addv]=0;

base[num_ba]=arti[num_ar]=tnum_x+num_addv;

for(j=tnum_x+1;

j++)

if(j==tnum_x+num_addv)a[tnum_x+num_addv]=1;

elsea[j]=0;

base[num_ba]=arti[num_ar]=tnum_x+num_addv;

j++)if(j==tnum_x+num_addv-1)a[tnum_x+num_addv-1]=-1;

elseif(j==tnum_x+num_addv)a[tnum_x+num_addv]=1;

base[num_ba]=tnum_x+num_addv;

for(j=tnum_x+1;

j++)if(j==tnum_x+num_addv)a[tnum_x+num_addv]=1;

}//增加松弛变量、剩余变量、人工变量、确定基变量

//显示标准化后的方程组

\n化为标准形式后:

maxz'

="

if(i==arti[j])k=1;

if(k==1)printf("

-Mx[%d]"

elseif(c==1)printf("

voiditerative(){

inti,j,k,k_a,k_f,l;

//k_a,k_f值为0或1,记录当前下标在arti[]或base[]里的搜索结果

intbase_elem;

intbase_out,base_in;

doublesigma[MAX],temp;

doublevalue_be;

//高斯消元里保存主元素值

\n\n第%d次迭代:

stop);

c%d=%lg\t"

base,c[base]);

b%d=%lg\t"

i,b);

a[%d][%d]=%lg\t"

i,j,a[j]);

k_a=0;

for(l=1;

l<

l++)if(j==arti[l])k_a=1;

if(k_a!

=1)printf("

//求检验数sigma

sigma=c;

j++)sigma-=c[base[j]]*a[j];

j++)if(i==base[j])sigma=0;

sigma[%d]=%lg\t"

i,sigma);

l++)if(i==arti[l])k_a=1;

if(k_a!

putchar('

\n'

//检验检验数sigma是否全小于等于0

if(sigma>

0)

k=1;

if(k==0){

//sigma是全小于等于0时,检查是否为无穷多最优解

k_f=k_a=0;

if(i==arti[j])k_a=1;

if(sigma==0&

k_a!

=1){

j++)if(i==base[j])k_f=1;

if(k_f==0){status=-1;

return;

status=1;

return;

//检查是否为无界解

k_f=0;

0){

j++)if(a[j]>

0)k_f=1;

if(k_f!

=1){status=0;

//确定换入变量

j++)if(i==base[j])k=1;

if(k==0&

sigma>

0)temp=sigma-1;

}//temp赋初值

if(k==0)

temp&

0){base_in=i;

temp=sigma;

//确定换出变量

i++)if(a[base_in]>

temp=b/a[base_in]+1;

i++){if(b/a[base_in]<

=temp&

a[base_in]>

j++)if(base==arti[j]){

base_out=base;

base_elem=i;

temp=b/a[base_in];

}//人工变量优先换出

if(b/a[base_in]<

基变量:

x[%d]"

base);

换入变量:

x[%d]换出变量:

base_in,base_out);

//基变量变换,进行新方程初始化后迭代

if(base==base_out)base=base_in;

//初始化主元素行系数

value_be=a[base_elem][base_in];

b[base_elem]/=value_be;

i++)a[base_elem]/=value_be;

if(i!

=base_elem){

b-=b[base_elem]*a[base_in];

value_be=a[base_in];

j++)a[j]-=a[base_elem][j]*value_be;

stop+

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2