题目链接

  这写得还不错:http://www.cnblogs.com/zzqsblog/p/5457091.html

  引入基变量\(x_{i+n}\),将约束\(\sum_{i=1}^m a_{ij}x_j\leq b_i\)改写为$$x_{i+n}=b_i-\sum_{i=1}^m a_{ij}x_j$$。

  目标函数为\(\sum_{i=1}^n C_ix_i\)。当存在\(r,c\)满足\(C_c>0\),\(B_r>0\),\(a_{rc}>0\),对第\(r\)个限制中的\(x_c\)做代换,即$$x_c=B_r-\sum_{j!=c}a_{rj}x_j-x_{r+n}$$(\(x_c\)成为基变量,\(x_{r+n}\)成为非基变量),然后代入目标函数中,非基变量取0,就一定可以使目标函数增大。这一步通过\(Pivot(r,c)\)(转轴)实现,同时要把其它约束中的\(x_c\)替换掉。

  当所有\(B_r\geq 0\)时,所有非基变量取0可以得到一个基本解(零解),即一定存在解。若存在\(B_r<0\),在限制\(r\)中找一个\(a_{rc}<0\)的\(x_c\)做代换,就可以使\(B_r>0\)。

  当然前提是任意\(x_i>0,i\in [1,n+m]\)。

  1. //0ms 520kb
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. #define eps 1e-8
  8. const int N=25;
  9. const double INF=1e9;
  10. int n,m,id[50];
  11. double A[N][N],Ans[N];
  12. inline int read()
  13. {
  14. int now=0,f=1;register char c=gc();
  15. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  16. for(;isdigit(c);now=now*10+c-'0',c=gc());
  17. return now*f;
  18. }
  19. void Pivot(int r,int c)//r:Basic varivle c:Nonbasic variable
  20. {//交换基变量与非基变量
  21. std::swap(id[r+n],id[c]);
  22. double t=A[r][c]; A[r][c]=1;//
  23. for(int i=0; i<=n; ++i) A[r][i]/=t;
  24. for(int i=0; i<=m; ++i)//在其它等式中换掉基变量
  25. if(fabs(A[i][c])>eps && i!=r)
  26. {
  27. t=A[i][c]; A[i][c]=0;//
  28. for(int j=0; j<=n; ++j) A[i][j]-=t*A[r][j];
  29. }
  30. }
  31. bool Init()
  32. {
  33. for(int r,c; ; )
  34. {
  35. r=c=0;
  36. for(int i=1; i<=m; ++i)//B[r]<0
  37. if(A[i][0]<-eps && (!r || rand()&1)) r=i;
  38. if(!r) return 1;
  39. for(int i=1; i<=n; ++i)//A[r][c]<0
  40. if(A[r][i]<-eps && (!c || rand()&1)) c=i;
  41. if(!c) return puts("Infeasible"),0;
  42. Pivot(r,c);
  43. }
  44. }
  45. bool Simplex()
  46. {
  47. for(int r,c; ; )
  48. {
  49. r=c=0;
  50. for(int i=1; i<=n; ++i)//C[c]>0
  51. if(A[0][i]>eps) {c=i; break;}
  52. if(!c) return 1;
  53. double mn=INF;//找一个系数为正且约束最紧的A[r][c]
  54. for(int i=1; i<=m; ++i)
  55. if(A[i][c]>eps && A[i][0]/A[i][c]<mn) r=i, mn=A[i][0]/A[i][c];
  56. if(!r) return puts("Unbounded"),0;//无约束
  57. Pivot(r,c);
  58. }
  59. }
  60. int main()//x[i+n]=B[i]-∑a[i][j]*x[j]
  61. {
  62. srand(20180724);
  63. n=read(), m=read(); int type=read();
  64. for(int i=1; i<=n; ++i) A[0][i]=read();//目标函数系数C[i]
  65. for(int i=1; i<=m; ++i)
  66. {
  67. for(int j=1; j<=n; ++j) A[i][j]=read();
  68. A[i][0]=read();//B[i]
  69. }
  70. for(int i=1; i<=n; ++i) id[i]=i;
  71. if(Init() && Simplex())
  72. {
  73. printf("%.8lf\n",-A[0][0]);//代换的时候Bi系数是负的s
  74. if(type)
  75. {
  76. for(int i=1; i<=m; ++i) Ans[id[i+n]]=A[i][0];//成为基变量的xi取值即为bi,非基变量上的xi取0.
  77. for(int i=1; i<=n; ++i) printf("%.8lf ",Ans[i]);
  78. }
  79. }
  80. return 0;
  81. }

UOJ.179.线性规划(单纯形)的更多相关文章

  1. UOJ#179. 线性规划[模板]

    传送门 http://uoj.ac/problem/179 震惊,博主竟然还不会线性规划! 单纯形实在学不会啊……背个板子当黑盒用…… 学(chao)了NanoApe dalao的板子 #includ ...

  2. UOJ#179. 线性规划(线性规划)

    描述 提交 自定义测试 这是一道模板题. (这个题现在标程挂了..哪位哥哥愿意提供一下靠谱的标程呀?) 本题中你需要求解一个标准型线性规划: 有 nn 个实数变量 x1,x2,…,xnx1,x2,…, ...

  3. uoj#179 线性规划

    这是一道模板题. 本题中你需要求解一个标准型线性规划: 有nn个实数变量x1,x2,⋯,xnx1,x2,⋯,xn和mm条约束,其中第ii条约束形如∑nj=1aijxj≤bi∑j=1naijxj≤bi. ...

  4. 【UOJ #179】线性规划 单纯形模板

    http://uoj.ac/problem/179 终于写出来了单纯性算法的板子,抄的网上大爷的qwq 辅助线性规划找非基变量时要加个随机化才能A,我也不知道为什么,卡精度吗? 2017-3-6UPD ...

  5. 【UOJ#179】线性规划 单纯形

    题目链接: http://uoj.ac/problem/179 Solution 就是单纯形模板题,这篇博客就是存一下板子. Code #include<iostream> #includ ...

  6. 【UOJ 179】 #179. 线性规划 (单纯形法)

    http://uoj.ac/problem/179 补充那一列修改方法: 对于第i行: $$xi=bi-\sum Aij*xj$$    $$=bi-\sum_{j!=e} Aij*xj-Aie*xe ...

  7. UVA 10498 Happiness(线性规划-单纯形)

    Description Prof. Kaykobad has given Nasa the duty of buying some food for the ACM contestents. Nasa ...

  8. Note -「线性规划」学习笔记

    \(\mathcal{Definition}\)   线性规划(Linear Programming, LP)形式上是对如下问题的描述: \[\operatorname{maximize}~~~~z= ...

  9. 线性规划VB求解

    线性规划VB求解 Rem 定义动态数组 Dim a() As Single, c() As Single, b() As Single, cb() As Single Dim aa() As Sing ...

随机推荐

  1. [转载]ASP.NET Error – Adding the specified count to the semaphore would cause it to exceed its maximum count

    http://jwcooney.com/2012/08/13/asp-net-error-adding-the-specified-count-to-the-semaphore-would-cause ...

  2. [原]Android开发优化-Adapter优化

    ListView作为Android开发中使用频率最高的一个控件,保证ListView的流畅运行,对用户体验的提高至关重要.Adapter是ListView和数据源之间的中间人,当每条数据进入可见区时, ...

  3. CS229 笔记03

    CS229 笔记03 局部加权线性回归 Non-Parametric Learning Algorithm (非参数学习方法) Number of parameters grows with the ...

  4. 20155230 2016-2017-2 《Java程序设计》第五周学习总结

    20155230 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.错误处理通常称为异常处理. 2.catch括号中列出的异常不得有继承关系,否则会发生编译 ...

  5. Linux - Port 端口检测方式

    ss 和 netstat 区别 netstat是遍历/proc下面每个PID目录: ss直接读/proc/net下面的统计信息. 所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多 ne ...

  6. MongoDB 之 数据类型 最无聊! But 最有用! MongoDB - 3

    MongoDB的新篇章开始啦 - 数据类型 https://www.cnblogs.com/xuzhaocai/p/8048177.html 一.MongoDB 之 丰富多彩的数据类型世界 首先我们要 ...

  7. 扩展欧几里得(E - The Balance POJ - 2142 )

    题目链接:https://cn.vjudge.net/contest/276376#problem/E 题目大意:给你n,m,k,n,m代表当前由于无限个质量为n,m的砝码.然后当前有一个秤,你可以通 ...

  8. 使用pt-table-checksum校验MySQL主从复制【转】

    pt-table-checksum是一个基于MySQL数据库主从架构在线数据一致性校验工具.其工作原理在主库上运行, 通过对同步的表在主从段执行checksum, 从而判断数据是否一致.在校验完毕时, ...

  9. Android网络框架之Retrofit + RxJava + OkHttp 变化的时代

    1.什么是Retrofit框架? 它是Square公司开发的现在非常流行的网络框架,所以我们在导入它的包的时候都可以看到这个公司的名字,目前的版本是2. 特点: 性能好,处理快,使用简单,Retrof ...

  10. jquery模型(外壳实现)

    详细解释: 1.现在传入的参数是window,document,可以知道是它俩引用 2. 3. 4.每次调用jquery方法,都会创建一个实例,但是内存并没有暴涨,原因是:jquery里面new 的这 ...