ここには線形計画単純形法アルゴリズムプログラムがあります
5369 ワード
これは私がネット上で探した1つの一般的な線形計画方程式の単純な形法を求めるプログラムが一般的な線形計画のプログラムを解決することができて、実行することができて、しかし結果は問題があって、大神がこのアルゴリズムの助けを理解して私に正しいことを直してくれますか?価格交渉できますので、お願いします.include #include #include using namespace std; float matrix[100][100],x[100];/* 全方程式の配列、解の配列/int a[100];基礎,非基礎の解を記録する場合,0:非基礎,1:基礎/int m,n,s,type;/方程式変数、拘束数、最大最小値のタイプを求めて、0:最小1:最大/int indexe、indexl、indexg;余剰変数、緩和変数、手動変数*/
void Jckxj()/*basic feasible solution */{ int i,j; for(i=0;i for(j=0;j if(matrix[i][j]==1&&a[j]==1) { x[j]=matrix[i][s]; j=s; } for(i=0;i if(a[i]==0) x[i]=0; } int Rj() { int i; for(i=0;i if(fabs(matrix[n][i])>=0.000001) if(matrix[n][i] <0) return 0; return 1; } int Min() { int i,temp=0; float min=matrix[n][0]; for(i=1;i
} return temp; }
void JustArtificial() { int i; for(i=m+indexe+indexl;i if(fabs(x[i])>=0.000001) { printf( "No Answer "); return; }
}
int Check(int in) { int i; float max1=-1; for(i=0;i if(fabs(matrix[i][in])>=0.000001&&max1 max1=matrix[i][s]/matrix[i][in]; if(max1 <0) return 1; return 0; }
int SearchOut(int *temp,int in) { int i; float min=10000; for(i=0;i if(fabs(matrix[i][in])>=0.000001&&(matrix[i][s]/matrix[i][in]>=0)&&min> matrix[i][s]/matrix[i][in]) { min=matrix[i][s]/matrix[i][in]; *temp=i; } for(i=0;i if(a[i]==1&&matrix[*temp][i]==1) return i; }
void Mto(int in,int temp) { int i; for(i=0;i <=s;i++) if(i!=in) matrix[temp][i]=matrix[temp][i]/matrix[temp][in]; matrix[temp][in]=1; }
void Be(int temp,int in) { int i,j; float c; for(i=0;i <=n;i++) { c=matrix[i][in]/matrix[temp][in]; if(i!=temp) for(j=0;j <=s;j++) matrix[i][j]=matrix[i][j]-matrix[temp][j]*c; } }
void Achange(int in,int out) { int temp=a[in]; a[in]=a[out]; a[out]=temp; }
void Print() { int i,j,k,temp=0; for(i=0;i { for(k=temp;k if(a[k]==1) { printf( "X%d ",k); temp=k+1; k=s; } for(j=0;j <=s;j++) printf( "%8.2f ",matrix[i][j]); printf( ""); } printf( "Rj "); for(j=0;j <=s;j++) printf( "%8.2f ",matrix[n][j]); printf( ""); }
void InitPrint() { int i; printf( "X "); for(i=0;i printf( "a%d ",i); printf( "b "); Print(); printf( ""); }
void Result() { int i; printf( "( "); for(i=0;i printf( "%8.2f ",x[i]); printf( ") "); if(type==1) printf( "Zmax=%f ",matrix[n][s]); else printf( "Zmin=%f ",matrix[n][s]); }
void PrintResult() { if(type==0) printf( "The Minimal :%f ",-matrix[n][s]); else printf( "The Maximum :%f ",matrix[n][s]); }
void Merge(float nget[][100],float nlet[][100],float net[][100],float b[]) { int i,j; for(i=0;i { for(j=m;j if(nget[i][j-m]!=-1) matrix[i][j]=0; else matrix[i][j]=-1; for(j=m+indexe;j if(nlet[i][j-m-indexe]!=1) matrix[i][j]=0; else matrix[i][j]=1; for(j=m+indexe+indexl;j if(net[i][j-m-indexe-indexl]!=1) matrix[i][j]=0; else matrix[i][j]=1; matrix[i][s]=b[i]; } for(i=m;i matrix[n][i]=0; for(i=m+indexe+indexl;i matrix[n][i]=100; matrix[n][s]=0; }
void ProcessA() { int i; for(i=0;i a[i]=0; for(i=m+indexe;i a[i]=1; }
void Input(float b[],int code[]){int i=0,j=0;printf(「The equator Variable and Restrictor」);/*入力方程式変数と制約数/cin>>>>>>>>>>>>>>>>n;for(i=0;i{printf(「Input b[]and Restrictorcode 0:<=1:=2:=>>>=」);/入力方程式の右側の値、codeの値/cin>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>n>>matrix[i][j];/入力方程式/}printf("The Type 0:Min 1:Max");/最大値を求めるか最小値を求めるか/do{cin>>type;if(type!=0&&type!=1)printf("Error,ReInput");while(type!=0&&type!=1); printf( "The Z ");/Z*/for(i=0;i cin>>matrix[n][i];if(type==1)for(i=0;i matrix[n][i]=-matrix[n][i];
void Xartificial() { int i,j,k; if(indexg!=0) { for(i=m+indexe+indexl;i { for(j=0;j if(matrix[j][i]==1) { for(k=0;k <=s;k++) matrix[n][k]=matrix[n][k]-matrix[j][k]*100; j=n; } } } }
void Process(float c[][100],int row,int vol) { int i; for(i=0;i if(i!=row) c[i][vol]=0; }
void Sstart(float b[],int code[]){int i;float nget[100][100],nlet[100][100],net[100][100];/*残存変数配列,緩和変数配列,人工変数配列/indexe=indexl=indexg=0;for(i=0;i{if(code[i]=0){nlet[i][indexl+]=1;Process(nlet,i,indexl-1);}if(code[i]==1) { net[i][indexg++]=1; Process(net,i,indexg-1); } if(code[i]==2) { net[i][indexg++]=1; nget[i][indexe++]=-1; Process(net,i,indexg-1); Process(nget,i,indexe-1); } } s=indexe+indexl+indexg+m; Merge(nget,nlet,net,b);/マージ/ProcessA();/a[]/InitPrint();印刷/Xartificial();手動変数の消去*/}
void Simplix()/*単純アルゴリズム/{int in,out,temp=0;while(1){Jckxj()/基礎可行解/Print()/印刷/Result()/印刷結果/if(!Rj())in=Min()/置換基/else{if(indexg!=0)JustArtificial()/判断人工変数/PrintResult();/印刷最終結果/return;}if(Check(in){/判定無境界状況/printf("No Delimition");return;}out=SearchOut(&temp,in);/ベース/Mto(in,temp);1/Be(temp,in);/初等変換/Achange(in,out);/a[]の値*/}を変更
int main(){int code[100];/*入力符号タグ/float b[100];/方程式右値/Input(b,code);/初期化/Sstart(b,code);/標準化/Simplix()/単純アルゴリズム*/}
void Jckxj()/*basic feasible solution */{ int i,j; for(i=0;i for(j=0;j if(matrix[i][j]==1&&a[j]==1) { x[j]=matrix[i][s]; j=s; } for(i=0;i if(a[i]==0) x[i]=0; } int Rj() { int i; for(i=0;i if(fabs(matrix[n][i])>=0.000001) if(matrix[n][i] <0) return 0; return 1; } int Min() { int i,temp=0; float min=matrix[n][0]; for(i=1;i
if(min> matrix[n][i])
{
min=matrix[n][i];
temp=i;
} return temp; }
void JustArtificial() { int i; for(i=m+indexe+indexl;i if(fabs(x[i])>=0.000001) { printf( "No Answer "); return; }
}
int Check(int in) { int i; float max1=-1; for(i=0;i if(fabs(matrix[i][in])>=0.000001&&max1 max1=matrix[i][s]/matrix[i][in]; if(max1 <0) return 1; return 0; }
int SearchOut(int *temp,int in) { int i; float min=10000; for(i=0;i if(fabs(matrix[i][in])>=0.000001&&(matrix[i][s]/matrix[i][in]>=0)&&min> matrix[i][s]/matrix[i][in]) { min=matrix[i][s]/matrix[i][in]; *temp=i; } for(i=0;i if(a[i]==1&&matrix[*temp][i]==1) return i; }
void Mto(int in,int temp) { int i; for(i=0;i <=s;i++) if(i!=in) matrix[temp][i]=matrix[temp][i]/matrix[temp][in]; matrix[temp][in]=1; }
void Be(int temp,int in) { int i,j; float c; for(i=0;i <=n;i++) { c=matrix[i][in]/matrix[temp][in]; if(i!=temp) for(j=0;j <=s;j++) matrix[i][j]=matrix[i][j]-matrix[temp][j]*c; } }
void Achange(int in,int out) { int temp=a[in]; a[in]=a[out]; a[out]=temp; }
void Print() { int i,j,k,temp=0; for(i=0;i { for(k=temp;k if(a[k]==1) { printf( "X%d ",k); temp=k+1; k=s; } for(j=0;j <=s;j++) printf( "%8.2f ",matrix[i][j]); printf( ""); } printf( "Rj "); for(j=0;j <=s;j++) printf( "%8.2f ",matrix[n][j]); printf( ""); }
void InitPrint() { int i; printf( "X "); for(i=0;i printf( "a%d ",i); printf( "b "); Print(); printf( ""); }
void Result() { int i; printf( "( "); for(i=0;i printf( "%8.2f ",x[i]); printf( ") "); if(type==1) printf( "Zmax=%f ",matrix[n][s]); else printf( "Zmin=%f ",matrix[n][s]); }
void PrintResult() { if(type==0) printf( "The Minimal :%f ",-matrix[n][s]); else printf( "The Maximum :%f ",matrix[n][s]); }
void Merge(float nget[][100],float nlet[][100],float net[][100],float b[]) { int i,j; for(i=0;i { for(j=m;j if(nget[i][j-m]!=-1) matrix[i][j]=0; else matrix[i][j]=-1; for(j=m+indexe;j if(nlet[i][j-m-indexe]!=1) matrix[i][j]=0; else matrix[i][j]=1; for(j=m+indexe+indexl;j if(net[i][j-m-indexe-indexl]!=1) matrix[i][j]=0; else matrix[i][j]=1; matrix[i][s]=b[i]; } for(i=m;i matrix[n][i]=0; for(i=m+indexe+indexl;i matrix[n][i]=100; matrix[n][s]=0; }
void ProcessA() { int i; for(i=0;i a[i]=0; for(i=m+indexe;i a[i]=1; }
void Input(float b[],int code[]){int i=0,j=0;printf(「The equator Variable and Restrictor」);/*入力方程式変数と制約数/cin>>>>>>>>>>>>>>>>n;for(i=0;i{printf(「Input b[]and Restrictorcode 0:<=1:=2:=>>>=」);/入力方程式の右側の値、codeの値/cin>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>n>>matrix[i][j];/入力方程式/}printf("The Type 0:Min 1:Max");/最大値を求めるか最小値を求めるか/do{cin>>type;if(type!=0&&type!=1)printf("Error,ReInput");while(type!=0&&type!=1); printf( "The Z ");/Z*/for(i=0;i cin>>matrix[n][i];if(type==1)for(i=0;i matrix[n][i]=-matrix[n][i];
void Xartificial() { int i,j,k; if(indexg!=0) { for(i=m+indexe+indexl;i { for(j=0;j if(matrix[j][i]==1) { for(k=0;k <=s;k++) matrix[n][k]=matrix[n][k]-matrix[j][k]*100; j=n; } } } }
void Process(float c[][100],int row,int vol) { int i; for(i=0;i if(i!=row) c[i][vol]=0; }
void Sstart(float b[],int code[]){int i;float nget[100][100],nlet[100][100],net[100][100];/*残存変数配列,緩和変数配列,人工変数配列/indexe=indexl=indexg=0;for(i=0;i{if(code[i]=0){nlet[i][indexl+]=1;Process(nlet,i,indexl-1);}if(code[i]==1) { net[i][indexg++]=1; Process(net,i,indexg-1); } if(code[i]==2) { net[i][indexg++]=1; nget[i][indexe++]=-1; Process(net,i,indexg-1); Process(nget,i,indexe-1); } } s=indexe+indexl+indexg+m; Merge(nget,nlet,net,b);/マージ/ProcessA();/a[]/InitPrint();印刷/Xartificial();手動変数の消去*/}
void Simplix()/*単純アルゴリズム/{int in,out,temp=0;while(1){Jckxj()/基礎可行解/Print()/印刷/Result()/印刷結果/if(!Rj())in=Min()/置換基/else{if(indexg!=0)JustArtificial()/判断人工変数/PrintResult();/印刷最終結果/return;}if(Check(in){/判定無境界状況/printf("No Delimition");return;}out=SearchOut(&temp,in);/ベース/Mto(in,temp);1/Be(temp,in);/初等変換/Achange(in,out);/a[]の値*/}を変更
int main(){int code[100];/*入力符号タグ/float b[100];/方程式右値/Input(b,code);/初期化/Sstart(b,code);/標準化/Simplix()/単純アルゴリズム*/}