13单纯形法
- 格式:pptx
- 大小:542.05 KB
- 文档页数:66
1 3 第一章线性规划与单纯形法运筹学习题集第一章线性规划与单纯形13第一章线性规划与单纯形法运筹学习题集第一章线性规划与单纯形法复习思考题1. 试述线性规划数学模型的结构及各要素的特征。
2. 求解线性规划问题时可能出现哪几种结果?哪些结果反映建模时有错误?3. 什么是线性规划问题的标准形式?如何将一个非标准型的线性规划问题转化为标准形式?4. 试述线性规划问题的可行解、基解、基可行解、最优解的概念以及上述解之间的相互关系。
5. 试述单纯形法的计算步骤,如何在单纯形表上判别问题是具有唯一最优解、无穷多最优解、无界解或无可行解?6. 如果线性规划的标准型变换为求目标函数的极小化min z,则用单纯形法计算时如何判别问题已得到最优解?7. 在确定初始可行基时,什么情况下要在约束条件中增添人工变量?在目标函数中人工变量前的系数为(-M)的经济意义是什么?8. 什么是单纯形法计算的两阶段法?为什么要将计算分成两个阶段进行,如何根据第一阶段的计算结果来判定第二阶段的计算是否需要继续进行?9. 简述退化的含义及处理退化的勃兰特规则。
10. 举例说明生产和生活中应用线性规划的可能案例,并对如何应用进行必要描述。
11. 判断下列说法是否正确:(a) 图解法同单纯形法虽然求解的形式不同,但从几何上理解,两者是一致的;(b) 线性规划模型中增加一个约束条件,可行域的范围一般将缩小,减少一个约束条件,可行域的范围一般将扩大;(c) 线性规划问题的每一个基解对应可行域的一个顶点;(d) 如线性规划问题存在可行域,则可行域一定包含坐标的原点;(e) 对取值无约束的变量xj,通常令xj=x′j-x″j,其中x′j?0,x″j?0,在用单纯形法求得的最优解中有可能同时出现x′j,0,x″j,0;(f) 用单纯形法求解标准型的线性规划问题时,与σj,0对应的变量都可以被选作换入变量; (g) 单纯形法计算中,如不按最小比值原则选取换出变量,则在下一个解中至少有一个基变量的值为负;(h) 单纯形法计算中,选取最大正检验数σk对应的变量xk作为换入变量,将使目标函数值得到最快的增长;(i) 一旦一个人工变量在迭代中变为非基变量后,则该变量及相应列的数字可以从单纯形表中删除,而不影响计算结果;(j) 线性规划问题的任一可行解都可以用全部基可行解的线性组合表示; (k)若X1,X2分别是某一线性规划问题的最优解,则X=λ1X1+λ2X2也是该线性规划问题的最优解,其中λ1、λ2可以为任意正的实数;(l) 线性规划用两阶段法求解时,第一阶段的目标函数通常写为minz=?ixai(xai为人工变量),但也可写为min z=?ikixai,只要所有ki均为大于零的常数;(m)对一个有n个变量、m个约束的标准型的线性规划问题,其可行域的顶点恰好为Cmn个; (n) 单纯形法的迭代计算过程是从一个可行解转换到目标函数值更大的另一个可行解; (o) 线性规划问题的可行解如为最优解,则该可行解一定是基可行解; (p) 若线性规划问题具有可行解,且其可行域有界,则该线性规划问题最多具有有限个数的最优解;(q) 线性规划可行域的某一顶点若其目标函数值优于相邻的所有顶点的目标函数值,则该顶点处的目标函数值达到最优;(r) 将线性规划约束条件的“?”号及“?”号变换成“=”号,将使问题的最优目标函数值得到改善;(s) 线性规划目标函数中系数最大的变量在最优解中总是取正的值;(t) 一个企业利用3种资源生产4种产品,建立线性规划模型求解得到的最优解中,最多只含有3种产品的组合;(u) 若线性规划问题的可行域可以伸展到无限,则该问题一定具有无界解; (v) 一个线性规划问题求解时的迭代工作量主要取决于变量数的多少,与约束条件的数量关系相对较小。
例1max z=2x1+3x2(标准形式即所有的变量均为负、所有约束条件为等式、所有的右端项系数非负)a=(2,3) b1=(80,160,120) A2=NULL b2=NULL A3=NULL b3=NULL n.iter=n+2*m maxi=TRUE ●simplex(a=a,A1=A1,b1=b1,maxi=TRUE): m1=3,m2=0,m3=0m=3,n=2 a.o=a=(2,3)if(maxi) a=-a(-2,-3) if(m2+m3==0) a=(-2,-3,0,0,0) b=(80,160,120) init=(0,0,0,80,160,120) basic=(3,4,5) eps=1e -10out1<-simplex1(a=a,A=A,b=b,init=init,basic=basic,eps=eps) ⏹ simplex1(a=a,A=A,b=b,init=init,basic=basic,eps=eps):N=5,M=3nonbasic=(1,2)if(stage==2) obfun=(-2,-3)it=1◆ while(!all(obfun > -eps) && (it <= n.iter))循环 pcol=3if(stage==2) neg=(1,3)x1+2x2<=804x1<=160 4x2<=120 x1,x2>=0A1= 1 2 4 0 0 4A= 1 2 1 0 0 4 0 0 1 0 0 4 0 0 1tableau= 80 -1 -2 160 -4 0 120 0 -4tableau= 80 -1 -2 160 -4 0120 0 -40 -2 -3转化为标准形式x1+2x2+x3=80 4x1+x4=160 4x2+x5=120x1,x2,x3,x4,x5>=0ratios=(40,30)prow=3pivot(tableau,prow ,pcol) 换基迭代 pv=tableau[3,3]=-4pcv=tableau[,3]=(-2,0,-4,-3)tableau[-3, ] = tableau[-3, ] - (tableau[-3, 3]/pv) %o% tableau[3,]tableau[3, ] = tableau[3, ]/(-pv)=(30,0,-1)tableau[3,3]=1/pv=-1/4tableau[-3, 3]=pcv[-3]/(-4)if(stage==1) else temp=basic[3]=5 basic[3]=nonbasic[2]=2 nonbasic[2]=5 obfun =tableau[4, -1L]=(-2,3/4) it=it+1=2至此进行了一次换基迭代(basic=(3,4,2) nonbasic=(1,5)) 再从while 循环头部开始,判断循环条件是否满足 pcol=2if(stage==2) neg=(1,2) ratios=(20,40)prow=1pivot(tableau,prow ,pcol) 换基迭代 pv=tableau[1,2]=-1pcv=tableau[,2]=(-1,-4,0,-2)tableau[-1, ] = tableau[-1, ] - (tableau[-1, 2]/pv) %o% tableau[1,]tableau[1, ] = tableau[1, ]/(-pv)=(20,-1,0)tableau= 20 -1 0 160 -4 0 120 0 -4 -90 -2 0tableau= 20 -1 0160 -4 030 0 -1/4-90 -2 0tableau= 20 -1 0 160 -4 0 30 0 -1 -90 -2 0tableau= 20 -1 1/2 160 -4 030 0 -1/4-90 -2 3/4tableau= 20 -1 1/2 80 0 -2 30 0 -1/4 -130 0 -1/4tableau= 20 -1 1/2 80 0 -2 30 0 -1/4 -130 0 -1/4tableau[1,2]=1/pv=-1/1tableau[-1,2]=pcv[-1]/(-1)if(stage==1) else temp=basic[1]=3 basic[1]=nonbasic[1]=1 nonbasic[21=3 obfun =tableau[4, -1L]=(2,-1/4) it=it+1=3至此进行了两次换基迭代(basic=(1,4,2) nonbasic=(3,5)) 再从while 循环头部开始,判断循环条件是否满足 pcol=3if(stage==2) neg=(2,3) ratios=(40,120) prow=2pivot(tableau,prow ,pcol) 换基迭代pv=tableau[2,3]=-2pcv=tableau[,3]=(1/2,-2,-1/4,-1/4)tableau[-2, ] = tableau[-2, ] - (tableau[-2, 3]/pv) %o% tableau[2,]tableau[2, ] = tableau[2, ]/(-pv)=(40,2,-1)tableau[2,3]=1/pv=-1/2tableau[-2,3]=pcv[-2]/(-2)if(stage==1) else temp=basic[2]=4 basic[2]=nonbasic[2]=5 nonbasic[21=4tableau= 20 -1 1/2 80 0 -2 30 0 -1/4 -130 0 -1/4 tableau=20 -1 1/2 80 4 -2 30 0 -1/4 -130 2 -1/4tableau= 40 0 080 4 -220 -1/2 0-140 3/2 0 tableau=40 0 040 2 -120 -1/2 0-140 3/2 0tableau=40 0 0 40 2 -1/2 20 -1/2 0 -140 3/2 0 tableau= 40 0 -1/4 40 2 -1/2 20 -1/2 1/8-140 3/2 1/8obfun =tableau[4, -1L]=(3/2,1/8)it=it+1=4至此进行了三次换基迭代(basic=(1,5,2) nonbasic=(3,4))再从while 循环头部开始,判断循环条件是否满足,发现!all(obfun > -eps)为false ,则跳出循环,循环结束。
单纯形法原理
单纯形法是线性规划中常用的一种方法,用于求解极值问题。
它的基本思想是通过不断迭代的方式,逐渐接近最优解。
单纯形法的基本步骤如下:
1. 将线性规划问题转化为标准型。
标准型的约束条件为≤,目标函数为最大化,且所有变量的取值范围为非负数。
2. 利用人为变量引入的方法,将标准型问题转化为初始单纯形表。
3. 选择合适的初始基变量,并计算出对应的基变量解。
4. 计算单纯形表中的评价函数。
如果所有评价函数中的系数都为非负数,则当前基变量解为最优解,过程结束。
否则,继续进行下一步。
5. 选择进入变量和离开变量。
进入变量是指取值为负的评价函数系数对应的变量,离开变量是指进入变量在当前基变量解中最先达到0的变量。
6. 迭代计算,通过变换基变量,逐渐接近最优解。
具体的计算方式为将进入变量对应列调整为单位向量,同时更新初始单纯形表中其它列的数值。
7. 重复步骤4至步骤6,直至得到最优解为止。
值得注意的是,单纯形法的执行依赖于初始基变量的选择,不同的初始基变量可能会得到不同的最优解。
因此,在实际应用中,需要通过灵活选择初始基变量来提高求解效果。
单纯形法与对偶定理单纯形法⼀般oi 中遇到的线性规划问题都长这样⽐如某⼀些⽹络流问题,以及⼆分图最⼤权匹配啥的,结合对偶定理,可以有很多很强的结论以及⼀个最⼩费⽤流的线性规划式⼦现在考虑怎么做这类问题不妨先引⼊⼀个基变量(松弛变量)⽐如说现在的系数矩阵是⽐如说现在的系数矩阵是x 11x 12x 13x 14...x 1n +1x 21x 22x 23x 24...x 2n +1x 31x 32x 33x 34...x 3n +1x 41x 42x 43x 44...x 4n +1...x m 1x m 2x m 3x m 4...x mn +1对于第i ⾏x i ,n +1=b i −n∑j =1x i ,j ∗a i ,j 不妨将第x i ,k 表⽰出来x i ,k =x i ,n +1+∑j != k x i ,j ∗a i ,j −b i−a i ,k给你要最⼤化的式⼦带来的价值是这样可以吧x i ,n +1的值给去x i ,k ,这样的操作叫做转轴之后就可以⽤这个过程来时⽬标函数有最⼤值有⼀个例题吧很容易列出线性规划式⼦max :c 1∗x 1+c 2∗x 2+...+c n ∗x n a 11∗x 1+a 12∗x 2+...+a 1n ∗x n <=b 1..a m 1∗x 1+a m 2∗x 2+...+a mn ∗x n <=b m就是⼀个板⼦题#include<bits/stdc++.h>#define MAXN 500#define eps 1e-7typedef double ll;const ll inf = 1e18;using namespace std;int n,m;ll a[MAXN][MAXN];int id[MAXN];void out(){for(int i = 1 ; i <= n ; i++)printf("%.2f " , a[0][i]); puts("");for(int i = 1 ; i <= m ; i++){ for(int j = 1 ; j <= n ; j++){ printf("%.2f " , a[i][j]); }printf("%.2f " , a[i][0]); puts(""); }}void plot(int x , int y){ swap(id[x + n] , id[y]);double t = a[x][y]; a[x][y] = 1;for(int j = 0 ; j <= n ; j++)a[x][j] /= t; for(int i = 0 ; i <= m ; i++){if(i == x || a[i][y] < eps)continue; t = a[i][y] , a[i][y] = 0;for(int j = 0 ; j <= n ; j++)a[i][j] -= a[x][j] * t; }}bool simplex(){for(int i = 1 ; i <= n ; i++)id[i] = i; int x = 0, y = 0; int cnt = 0; ll minl; while(1){x = y = 0 , minl = inf; cnt++;for(int i = 1 ; i <= n ; i++)if(a[0][i] > eps){x = i;break;} if(!x)break;for(int i = 1 ; i <= m ; i++)if(a[i][x] > eps && minl > a[i][0] / a[i][x])minl = a[i][0] / a[i][x] , y = i; if(!y) {puts("Unbounded"); return false;} plot(y , x); }return true;}int main(){while(scanf("%d%d",&n,&m) == 2){ memset(a , 0 ,sizeof(a));for(int i = 1 ; i <= n ; i++)cin>>a[0][i]; for(int i = 1 ; i <= m ; i++){for(int j = 1 ; j <= n ; j++)cin>>a[i][j]; cin>>a[i][0]; }simplex();printf("Nasa can spend %d taka.\n",(int)ceil(-a[0][0]*m)); }}对偶定理考虑⼀个基本的线性规划模型{}{max :c 1∗x 1+c 2∗x 2+...+c n ∗x n a 11∗x 1+a 12∗x 2+...+a 1n ∗x n <=b 1..a m 1∗x 1+a m 2∗x 2+...+a mn ∗x n <=b mx i >=0其系数矩阵为a 11a 12...a 1n a 21a 22...a 2n a 31a 32...a 3n..a m 1a m 2...a mn那么上⾯这个线性规划模型的对偶问题的系数矩阵为上述系数矩阵的转置矩阵a 11a 12...a 1n a 21a 22...a 2n a 31a 32...a 3n..a m 1a m 2...a mnT 即:a 11a 21...a m 1a 12a 22...a m 2a 13a 32...a m 3..a 1n a 2n ...a nm那么线性规划模型对偶过来就是max :b 1∗y 1+b 2∗y 2+...+b m ∗y m a 11∗x 1+a 21∗x 2+...+a m 1∗x n <=c 1..a 1n ∗y 1+a 2n ∗y 2+...+a nm ∗y m <=c my i >=0基本上⼤多数的线性规划模型都可以通过对x i 的转换化成标准形式不过还是应该列个表:并且注意:原问题有⽆界解等价于对偶问题⽆可⾏解但是对偶问题⽆可⾏解时,原问题可能为⽆界解或者⽆可⾏解线性规划在⽹络流中的应⽤全⼳模矩阵(任何⼀个⾏数列数相同的⼦矩阵的值都是+1/-1)有⼀个很好的性质,对于⼀个线性规划模型的系数矩阵是⼀个全⼳模矩阵,那么有每⼀个单纯形法的调整系数都应当为(-1,0,1)线性规划对偶性--->>可以通过很显然的式⼦推导推导出---->>(最⼤流 = 最⼩割)部分题⽬没有很显然的建图,⼀般是转线性规划,然后看⼀看是不是⼀个全⼳模矩阵,如果是,就可以使⽤⽹络流解决有⼀个可以判断是否是全⼳模矩阵的⽅法直接考虑差分,对于每⼀个约束 + 表⽰⼊,-表⽰出,直接建图,跑⼀个最⼩最⼩费⽤流就好了也可以直接对偶掉,做⼀个单纯形法线性规划与特殊的整数规划前40分可以直接dp 掉还有⼀道题Codeforces 375E,有O (n 3)的dp 做法,但是线性规划可以很快的做掉。