1 #include <bits/stdc++.h> 2 #define eps 1e-8 3 #define INF 1e100 4 using namespace std; 5 long double a[105][105],x[205],ans,c[105]; 6 int n,m,xx,yy,t,B[105],N[105],d[105],tt; 7 void pivot(int l,int e) 8 { 9 swap(B[l],N[e]); 10 for(int i=0;i<=n;i++)if(i!=e)a[l][i]/=a[l][e]; 11 a[l][e]=(long double)1/a[l][e]; 12 for(int i=0;i<=m;i++)if(i!=l&&fabs(a[i][e])>eps) 13 { 14 for(int j=0;j<=n;j++)if(j!=e)a[i][j]-=a[i][e]*a[l][j]; 15 a[i][e]=-a[i][e]*a[l][e]; 16 } 17 } 18 int simplex() 19 { 20 int l,e; 21 while(1) 22 { 23 e=n+1; tt=0; 24 for(int i=1;i<=n;i++)if(a[0][i]>eps)d[++tt]=i; 25 if(tt==0)break; e=d[rand()%tt+1]; long double temp=INF; 26 for(int i=1;i<=m;i++)if((a[i][e]>eps)and(a[i][0]/a[i][e]<temp)){ l=i; temp=a[i][0]/a[i][e]; } 27 if(temp==INF){ printf("Unbounded\n"); return 0; } 28 pivot(l,e); 29 } 30 ans=-a[0][0]; return 1; 31 } 32 int main() 33 { 34 scanf("%d%d%d\n",&n,&m,&t); 35 for(int i=1;i<=n;i++)scanf("%Lf",&c[i]); a[0][n+1]=-1; 36 for(int i=1;i<=n;i++)N[i]=i; N[n+1]=0; 37 for(int i=1;i<=m;i++)B[i]=n+i; 38 for(int i=1;i<=m;i++) 39 { 40 for(int j=1;j<=n;j++)scanf("%Lf",&a[i][j]); a[i][n+1]=-1; 41 scanf("%Lf",&a[i][0]); 42 } 43 n++; int mm=1; for(int i=2;i<=m;i++)if(a[i][0]<a[mm][0])mm=i; 44 if(a[mm][0]<-eps)pivot(mm,n); 45 if(!simplex())return 0; 46 if(ans<-eps){ printf("Infeasible\n"); return 0; } 47 xx=0; for(int i=1;i<=n;i++)if(N[i]==0){ xx=i; break; } 48 if(xx==0) 49 { 50 yy=0; 51 for(int i=1;i<=m;i++)if(B[i]==0){ yy=i; break; } 52 for(xx=0;xx<=n;xx++)if(abs(a[yy][xx])>eps)break; 53 if(xx<=n)pivot(yy,xx); 54 } 55 if(xx<=n) 56 { 57 for(int i=xx;i<=n-1;i++)N[i]=N[i+1]; N[n]=0; 58 for(int i=1;i<=m;i++)for(int j=xx;j<=n-1;j++)a[i][j]=a[i][j+1]; 59 n--; for(int i=0;i<=n;i++)a[0][i]=0; 60 for(int i=1;i<=n;i++) 61 { 62 xx=0; for(int j=1;j<=n;j++)if(N[j]==i){ xx=j; break; } 63 if(xx>0)a[0][xx]+=c[i];else 64 { 65 for(int j=1;j<=m;j++)if(B[j]==i){ xx=j; break; } 66 for(int j=0;j<=n;j++)a[0][j]=a[0][j]-c[i]*a[xx][j]; 67 } 68 } 69 }else 70 { 71 for(int i=yy;i<=m-1;i++)for(int j=0;j<=n;j++)a[i][j]=a[i+1][j]; 72 m--; 73 } 74 if(!simplex())return 0; 75 printf("%.10Lf\n",ans); 76 if(t==1) 77 { 78 for(int i=1;i<=m;i++)x[B[i]]=a[i][0]; 79 for(int i=1;i<=n;i++)printf("%.10Lf ",x[i]); 80 printf("\n"); 81 } 82 return 0; 83 }
单纯形法模板
Posted G . H . O . S . T . R . E . A
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单纯形法模板相关的知识,希望对你有一定的参考价值。
以上是关于单纯形法模板的主要内容,如果未能解决你的问题,请参考以下文章