概述
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("Unboundedn"); return 0; } 28 pivot(l,e); 29 } 30 ans=-a[0][0]; return 1; 31 } 32 int main() 33 { 34 scanf("%d%d%dn",&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("Infeasiblen"); 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("%.10Lfn",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 }
转载于:https://www.cnblogs.com/GhostReach/p/8143494.html
最后
以上就是舒心鞋子为你收集整理的单纯形法模板的全部内容,希望文章能够帮你解决单纯形法模板所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复