ページ 11

シンプレックス法のプログラムを教えてください。

Posted: 2016年1月23日(土) 14:31
by soi
シンプレックス法

コード:

#include<stdio.h>
void disp(double a[3][5],int bv[2],int cc)
{
int i;
printf("サイクル %d\n",cc);
printf("x1\t\tx2\t\tx3\t\tx4\t\tconst\n");
for(i=0;i<2;i++){
printf("x%d%.2le\t%.2le\t%.2le\t%.2le\t%.2le\n",bv[i]+1,a[i][0],a[i][1],a[i][2],a[i][3],a[i][4]);
}
printf("z%.2le\t%.2le\t%.2le\t%.2le%.2le\n",a[2][0],a[2][1],a[2][2],a[2][3],a[2][4]);
}
int main(void){
double a[3][5]={{100,150,1,0,8000},{7,5,0,1,360},{-250,-300,0,0,0}},c[5],min,max,pa;
int i,j,r,s,t,bv[2]={2,3},cc=0;
disp(a,bv,cc);
while(1){
min=a[2][0];s=0;
for(i=0;i<4;i++){
if(a[2][i]<=min){
min=a[2][i];
s=i;
}
}
if(min>=0){
printf("\nThis is the optimal solution\n");
printf("x%d=%.2le,x%d=%.2le,z=%.2le\n",bv[0]+1,a[0][4],bv[1]+1,a[1][4],-a[2][4]);
return 0;
}
max=a[0][s];t=0;
for(i=0;i<4;i++){
if(a[i][s]>=max){
max=a[i][s];
t=i;
}
}

if(max<=0){
printf("The solution is unbounded\n");
return 0;
}
min=a[t][4]/a[t][s];
r=t;
for(i=0;i<2;i++){
if(a[i][s]>0){
if((a[i][4]/a[i][s])<=min){
min=a[i][4]/a[i][s];
r=i;
}
}
}

/*基底変数の入れ替え
ピボット操作*/ 

cc++;
disp(a,bv,cc);
}
return 0;
}
/*基底変数の入れ替え
ピボット操作*/の部分を教えてください。お願いします。

Re: シンプレックス法のプログラムを教えてください。

Posted: 2016年1月24日(日) 02:18
by asd