当前位置:文档之家› 0050算法笔记——【线性规划】单纯形算法(未完全实现)

0050算法笔记——【线性规划】单纯形算法(未完全实现)

0050算法笔记——【线性规划】单纯形算法(未完全实现)
0050算法笔记——【线性规划】单纯形算法(未完全实现)

1、线性规划问题及其表示

线性规划问题可表示为如下形式:

变量满足约束条件(8.2)-(8.5)式的一组值称为线性规划问题的一个可行解。

所有可行解构成的集合称为线性规划问题的可行区域。

使目标函数取得极值的可行解称为最优解。

在最优解处目标函数的值称为最优值。

有些情况下可能不存在最优解。

通常有两种情况:

(1)根本没有可行解,即给定的约束条件之间是相互排斥的,可行区域为空集;

(2)目标函数没有极值,也就是说在n 维空间中的某个方向上,目标函数值可以无限增大,而仍满足约束条件,此时目标函数值无界。

例:

这个问题的解为(x1,x2,x3,x4) = (0,3.5,4.5,1);最优值为16。

2、线性规划基本定理

约束条件(8.2)-(8.5)中n个约束以等号满足的可行解称为线性规划问题的基本可行解。

若n>m,则基本可行解中至少有n-m个分量为0,也就是说,基本可行解中最多有m个分量非零。

线性规划基本定理:如果线性规划问题有最优解,则必有一基本可行最优解。

上述定理的重要意义在于,它把一个最优化问题转化为一个组合问题,即在(8.2) -(8.5)式的m+n个约束条件中,确定最优解应满足其中哪n个约束条件的问题。

由此可知,只要对各种不同的组合进行测试,并比较每种情况下的目标函数值,直到找到最优解。

Dantzig于1948年提出了线性规划问题的单纯形算法。

单纯形算法的特点是:

(1)只对约束条件的若干组合进行测试,测试的每一步都使目标函

数的值增加;

(2)一般经过不大于m或n次迭代就可求得最优解。

3、约束标准型线性规划问题的单纯形算法

当线性规划问题中没有不等式约束(8.2)和(8.4)式,而只有等式约束(8.3)和变量非负约束(8.5)时,称该线性规划问题具有标准形式。

先考察一类更特殊的标准形式线性规划问题。这一类线性规划问题中,每一个等式约束中,至少有一个变量的系数为正,且这个变量只在该约束中出现。

在每一约束方程中选择一个这样的变量,并以它作为变量求解该约

束方程。这样选出来的变量称为左端变量或基本变量,其总数为m个。剩

下的n-m个变量称为右端变量或非基本变量。

这一类特殊的标准形式线性规划问题称为约束标准型线性规划问题。

虽然约束标准型线性规划问题非常特殊,但是对于理解线性规划问

题的单纯形算法是非常重要的。

任意一个线性规划问题可以转换为约束标准型线性规划问题。

例:

任何约束标准型线性规划问题,只要将所有非基本变量都置为0,从约束方程式中解出满足约束的基本变量的值,可求得一个基本可行解。

单纯形算法的基本思想就是从一个基本可行解出发,进行一系列的基本可行解的变换。

每次变换将一个非基本变量与一个基本变量互调位置,且保持当前的线性规划问题是一个与原问题完全等价的标准线性规划问题。

基本可行解x=(7,0,0,12,0,10)。

单纯形算法的第1步:选出使目标函数增加的非基本变量作为入基变量。

查看单纯形表的第1行(也称之为z行)中标有非基本变量的各列

中的值。

选出使目标函数增加的非基本变量作为入基变量。

z行中的正系数非基本变量都满足要求。

在上面单纯形表的z行中只有1列为正,即非基本变量相应的列,

其值为3。

选取非基本变量x3作为入基变量。

单纯形算法的第2步:选取离基变量。

在单纯形表中考察由第1步选出的入基变量所相应的列。

在一个基本变量变为负值之前,入基变量可以增到多大。

如果入基变量所在的列与基本变量所在行交叉处的表元素为负数,那么该元素将不受任何限制,相应的基本变量只会越变越大。

如果入基变量所在列的所有元素都是负值,则目标函数无界,已经得到了问题的无界解。

如果选出的列中有一个或多个元素为正数,要弄清是哪个数限制了入基变量值的增加。

受限的增加量可以用入基变量所在列的元素(称为主元素)来除主元素所在行的“常数列”(最左边的列)中元素而得到。所得到数值越小说明受到限制越多。

应该选取受到限制最多的基本变量作为离基变量,才能保证将入基变量与离基变量互调位置后,仍满足约束条件。

上例中,惟一的一个值为正的z行元素是3,它所在列中有2个正元素,即4和3。

min{12/4,10/3}=4,应该选取x4为离基变量;

入基变量x3取值为3。

单纯形算法的第3步:转轴变换。

转轴变换的目的是将入基变量与离基变量互调位置。

给入基变量一个增值,使之成为基本变量;

修改离基变量,让入基变量所在列中,离基变量所在行的元素值减为零,而使之成为非基本变量。

解离基变量所相应的方程,将入基变量x3用离基变量x4表示为

再将其代入其他基本变量和所在的行中消去x3 ,

代入目标函数得到

形成新单纯形表

单纯形算法的第4步:转回并重复第1步,进一步改进目标函数值。

不断重复上述过程,直到z行的所有非基本变量系数都变成负值为止。这表明目标函数不可能再增加了。

在上面的单纯形表中,惟一的值为正的z行元素是非基本变量x2相应的列,其值为1/2。

因此,选取非基本变量x2作为入基变量。

它所在列中有惟一的正元素5/2,即基本变量x1相应行的元素。

因此,选取x1为离基变量。

再经步骤3的转轴变换得到新单纯形表。

新单纯形表z行的所有非基本变量系数都变成负值,求解过程结束。

整个问题的解可以从最后一张单纯形表的常数列中读出。

目标函数的最大值为11;

最优解为:x*=(0,4,5,0,0,11)。

单纯形算法计算步骤如下:

步骤1:选入基变量。

如果所有cj≤0,则当前基本可行解为最优解,计算结束。

否则取ce>0相应的非基本变量xe为入基变量。

步骤2:选离基变量。

对于步骤1选出的入基变量xe ,如果所有aie≤0 ,则最优解无界,计算结束。

否则计算

选取基本变量xk为离基变量。

新的基本变量下标集为

新的非基本变量下标集为

步骤3:作转轴变换。

新单纯形表中各元素变换如下。

步骤4:转步骤1。

4、将一般问题转化为约束标准型

有几种巧妙的办法可以将一般的线性规划问题转换为约束标准型线性规划问题。

首先,需要把(8.2)或(8.4)形式的不等式约束转换为等式约束。

具体做法是,引入松弛变量,利用松弛变量的非负性,将不等式转化为等式。

松驰变量记为yi,共有m1+m3个。

在求解过程中,应当将松弛变量与原来变量同样对待。求解结束后,

抛弃松弛变量。

注意松弛变量前的符号由相应的原不等式的方向所确定。

为了进一步构造标准型约束,还需要引入m个人工变量,记为zi。

至此,原问题已经变换为等价的约束标准型线性规划问题。

对极小化线性规划问题,只要将目标函数乘以-1即可化为等价的极大化线性规划问题。

5、一般线性规划问题的2阶段单纯形算法

引入人工变量后的线性规划问题与原问题并不等价,除非所有zi

都是0 。

为了解决这个问题,在求解时必须分2个阶段进行。

第一阶段用一个辅助目标函数替代原来的目标函数。

这个线性规划问题称为原线性规划问题所相应的辅助线性规划问题。

对辅助线性规划问题用单纯形算法求解。

如果原线性规划问题有可行解,则辅助线性规划问题就有最优解,

且其最优值为0,即所有zi都为0。

在辅助线性规划问题最后的单纯形表中,所有zi均为非基本变量。

划掉所有zi相应的列,剩下的就是只含xi和yi的约束标准型线性规划问题了。

单纯形算法第一阶段的任务就是构造一个初始基本可行解。

单纯形算法第二阶段的目标是求解由第一阶段导出的问题。

此时要用原来的目标函数进行求解。

如果在辅助线性规划问题最后的单纯形表中,zi不全为0,则原线性规划问题没有可行解,从而原线性规划问题无解。

6、一般线性规划问题的2阶段单纯形算法

用单纯形算法解一般的线性规划问题时,可能会遇到退化的情形,即在迭代计算的某一步中,常数列中的某个元素的值变成0,使得相应的基本变量取值为0。

如果选取退化的基本变量为离基变量,则作转轴变换前后的目标函数值不变。在这种情况下,算法不能保证目标函数值严格递增,因此,可能出现无限循环。

考察下面的由Beale在1955年提出的退化问题的例子。

按照2阶段单纯形算法求解该问题将出现无限循环。

Bland提出避免循环的一个简单易行的方法。

Bland提出在单纯形算法迭代中,按照下面的2个简单规则就可以避免循环。

规则1:设,取xe为入基变量。

规则2:设

取xk为离基变量。

算法leave(col)已经按照规则2选取离基变量。

选取入基变量的算法enter(objrow) 中只要加一个break语句即可。

7、算法描述和实现

[cpp]view plain copy

1.//线性规划单纯性算法

2.#include "stdafx.h"

3.#include

4.#include

5.#include

https://www.doczj.com/doc/dc7070707.html,ing namespace std;

7.

8.class LinearProgram

9.{

10.public:

11. LinearProgram(char * filename);

12. ~LinearProgram();

13.void solve();

15.int enter(int objrow);

16.int leave(int col);

17.int simplex(int objrow);

18.int phase1();

19.int phase2();

20.int compute();

21.void swapbasic(int row,int col);

22.void pivot(int row,int col);

23.void stats();//这个方法是干什么的?

24.void setbasic(int * basicp);

25.void output();

26.int m, //约束总数

27. n,//变量数

28. m1, //不等式约束数<=

29. m2, //等式约束

30. m3, //不等式约束数>=

31. n1,n2, //n1 = n + m3,n2 = n1 + m1

32. error, //记录错误类型

33. *basic, //基本变量下标

34. *nonbasic; //非基本变量下标

35.double **a,minmax;

36.};

37.

38.//从标准输入文件中读入数据,构造初始单纯形表

39.LinearProgram::LinearProgram(char *filename)

40.{

41. ifstream inFile;

42.int i,j;

43.double value;

44. cout<<"按照下列格式输入数据:"<

45. cout<<"1:+1(max)或-1(min);m;n"<

46. cout<<"2:m1;m2;m3"<

47. cout<<"约束系数和右端项"<

48. cout<<"目标函数系数"<

49. error = 0;

50.

51. inFile.open(filename);

52. inFile>>minmax;

53. inFile>>m;

54. inFile>>n;

55.

56.//输入各类约束数

57. inFile>>m1;

59. inFile>>m3;

60.

61.if(m!=m1+m2+m3)

62. {

63. error = 1;

64. }

65.

66. n1 = n + m3;

67. n2 = n + m1 + m3;

68. Make2DArray(a,m+2,n1+1);//构造二维数组

69. basic = new int[m+2];

70. nonbasic = new int[n1+1];

71.

72.//初始化基本变量和非基本变量

73.for(int i=0; i<=m+1; i++)

74. {

75.for(int j=0; j<=n1; j++)

76. {

77. a[i][j] = 0;

78. }

79. }

80.

81.for(int j=0; j<=n1; j++)

82. {

83. nonbasic[j] = j;

84. }

85.

86.//引入松弛变量和人工变量

87.for(int i=1,j=n1+1; i<=m; i++,j++)

88. {

89. basic[i] = j;

90. }

91.for(int i=m-m3+1,j=n+1; i<=m; i++,j++)

92. {

93. a[i][j] = -1.0;

94. a[m+1][j] = -1.0;

95. }

96.

97.//输入约束系数和右端项

98.for(int i=1; i<=m; i++)

99. {

100.for(int j=1; j<=n; j++)

101. {

102. inFile>>value;

103. a[i][j] = value;

104. }

105. inFile>>value;

106.if(value<0)

107. {

108. error = 1;

109. }

110. a[i][0] = value;

111. }

112.

113.//输入目标函数系数

114.for(int j=1; j<=n; j++)

115. {

116. inFile>>value;

117. a[0][j] = value * minmax;

118. }

119.

120.//引入人工变量,构造第1阶段的辅助目标函数

121.for(int j=1; j<=n; j++)

122. {

123.for(int i=m1+1,value=0.0; i<=m; i++)

124. {

125. value += a[i][j];

126. }

127. a[m+1][j] = value;

128. }

129. inFile.close();

130.}

131.

132.//根据目标函数系数所在的行objrow,执行约束标准型线性规划问题的单纯形算法133.int LinearProgram::simplex(int objrow)

134.{

135.for(int row = 0;;)

136. {

137.int col = enter(objrow);

138.if(col>0)

139. {

140. row = leave(col);

141. }

142.else

143. {

144.return 0;

145. }

146.if(row>0)

147. {

148. pivot(row,col);

149. }

150.else

151. {

152.return 2;

153. }

154. }

155.}

156.

157.//根据目标函数系数所在行objrow,选取入基变量

158.int LinearProgram::enter(int objrow)

159.{

160.double temp = DBL_EPSILON; //?什么含义?

161.for(int j=1,col=0; j

162. {

163.if(nonbasic[j]<=n2 && a[objrow][j]>temp) 164. {

165. col = j;

166. temp = a[objrow][j];

167.break; //Bland避免循环法则

168. }

169. }

170.return col;

171.}

172.

173.//根据入基变量所在列col,选取离基变量

174.int LinearProgram::leave(int col)

175.{

176.double temp = DBL_MAX; //怎么定义的?值为多少?177.for(int i=1,row=0; i<=m; i++)

178. {

179.double val = a[i][col];

180.if(value>DBL_EPSLION)

181. {

182. val = a[i][0]/val;

183.if(val

184. {

185. row = i;

186. temp = val;

187. }

188. }

189. }

190.return row;

191.}

192.

193.//以入基变量所在列col和离基变量所在行row交叉处元素a[row][col]为轴心,做转轴变换

194.void LinearProgram::pivot(int row,int col)

195.{

196.for(int j=0; j<=n1; j++)

197. {

198.if(j!=col)

199. {

200. a[row][j] = a[row][j]/a[row][col];

201. }

202. }

203. a[row][col] = 1.0/a[row][col];

204.for(int i=0; i

205. {

206.if(i!=row)

207. {

208.for(int j=0; j<=n1; j++)

209. {

210.if(j!=col)

211. {

212. a[i][j] = a[i][j] - a[i][col]*a[row][j];

213.if(fabs(a[i][j]

214. {

215. a[i][j] = 0.0;

216. }

217. }

218. }

219. }

220. }

221. swapbasic(row,col);

222.}

223.

224.//交换基本变量row和非基本变量col的位置

225.void LinearProgram::swapbasic(int row,int col)

226.{

227.int temp = basic[row];

228. basic[row] = nonbasic[col];

229. nonbasic[col] = temp;

230.}

231.

232.//对一般的线性规划问题执行两阶段单纯形算法

233.int LinearProgram::compute()

234.{

235.if(error>0)

236. {

237.return error;

238. }

239.if(m!=m1)

240. {

241. error = phase1();

242.if(error>0)

243. {

244.return error;

245. }

246. }

247. rturn phase2();

248.}

249.

250.//构造初始基本可行解的第一阶段单纯形算法由phase1()实现251.//辅助目标函数存储在数组a的第trows行

252.int LinearProgram::phase1()

253.{

254. error = simplex(m+1);

255.if(error>0)

256. {

257.return error;

258. }

259.for(int i=1; i<=m; i++)

260. {

261.if(basic[i]>n2)

262. {

263.if(a[i][0]>DBL_EPSILON)

264. {

265.return 3;

266. }

267.for(int j=1; j<=n1; j++)

268. {

269.if(fabs(a[i][j]>=DBL_EPSILON) 270. {

271. pivot(i,j);

272.break;

273. }

274. }

275. }

276. }

277.return 0;

278.}

279.

280.//第二阶段根据第一阶段找到的基本可行解,对原来的目标函数用单纯形算法求解281.//原目标函数存储在数组a的第0行

282.int LinearProgram::phase2()

283.{

284.return simplex(0);

285.}

286.

287.//执行两阶段单纯形算法

288.void LinearProgram::solve()

289.{

290. cout<

292.switch(error)

293. {

294.case 0:output();break;

295.case 1:cout<<"输入数据错误--"<

296.case 2:cout<<"无界解--"<

297.case 3:cout<<"无可行解--"<

298. }

299. cout<<"计算结束"<

300.}

301.

302.//输出结果

303.void LinearProgram::output()

304.{

305.int width = 8,*basicp;

306. doube zero = 0.0;

307. basicp = new int[n+m+1];

308. setbasic(basicp);

309. cout.setf(ios::fixed|ios::showpoint|ios::right);

310. cout.precision(4);s

311. stats();//?????这句话是执行什么了?

312. cout<

313. cout<<"最优解:"<

314.for(int j=1; j<=n; j++)

315. {

316. cout<<"x"<

317.if(basicp[j]!=0)

318. {

319. cout<

320. }

321.else

322. {

323. cout<

325. cout<

326. }

327. cout<

328.delete []basicp;

329.}

330.

331.int main()

332.{

333.return 0;

334.}

使用C语言实现单纯形法求解线性规划问题

上机实验报告 一、实验目的和要求 1、目的: ●掌握单纯形算法的计算步骤,并能熟练使用该方法求解线性规划问题。 ●了解算法→程序实现的过程和方法。 2、要求: ●使用熟悉的编程语言编制单纯形算法的程序。 ●独立编程,完成实验,撰写实验报告并总结。 二、实验内容和结果 1、单纯形算法的步骤及程序流程图。 (1)、算法步骤

(2)、程序图 各段代码功能描述: (1)、定义程序中使用的变量 #include #include #define m 3 /*定义约束条件方程组的个数*/ #define n 5 /*定义未知量的个数*/ float M=1000000.0; float A[m][n]; /*用于记录方程组的数目和系数;*/ float C[n]; /*用于存储目标函数中各个变量的系数*/

float b[m]; /*用于存储常约束条件中的常数*/ float CB[m]; /*用于存储基变量的系数*/ float seta[m]; /*存放出基与入基的变化情况*/ float delta[n]; /*存储检验数矩阵*/ float x[n]; /*存储决策变量*/ int num[m]; /*用于存放出基与进基变量的情况*/ float ZB=0; /*记录目标函数值*/ (2)、定义程序中使用的函数 void input(); void print(); int danchunxing1(); int danchunxing2(int a); void danchunxing3(int a,int b); (3)、确定入基变量,对于所有校验数均小于等于0,则当前解为最优解。 int danchunxing1() { int i,k=0; int flag=0; float max=0; for(i=0;i

最新单纯形法解线性规划问题

一、用单纯形第Ⅰ阶段和第Ⅱ阶段解下列问题 s.t. 解:1)、将该线性问题转为标准线性问题 一、第一阶段求解初始可行点 2)、引入人工变量修改约束集合 取人工变量为状态变量,问题变量和松弛变量为决策变量,得到如下单纯形表,并是所有决策变量的值为零,得到人工变量的非负值。 2 -2 -1 1 2 1 1 -1 -1 1 2 -1 -2 1 2 5 -2 -4 1 -1 1 5 0 0 0 0 0 3)、对上述单纯形表进行计算,是目标函数进一步减小,选为要改变的决策变量,计算改变的限值。 2 -2 -1 1 2 1 1 1 -1 -1 1 0 2 -1 -2 1 2 0 5 -2 -4 1 -1 1 5 1 0 0 0 0 0 0 1 0 0 0 4)、由于,为人工变量,当其到达零值时,将其从问题中拿掉保证其值不会再变。同时将以改变的决策变量转换为状态变量。增加的值使目标函数值更小。 1 -3 1 1 1 0 1 1 -1 1

1 -3 1 1 1 0 0 0 0 0 0 0 0 5)使所有人工变量为零的问题变量的值记为所求目标函数的初始可行点,本例为, 二、第二阶段用单纯形法求解最优解 -2 2 1 0 1 1 -1 0 -2 1 2 1 5 1 3 要使目标函数继续减小,需要减小或的值,由以上计算,已经有两个松弛变量为零,因此或不能再减小了,故该初始可行点即为最优解。

2、求解问题 s.t. 如果目标函数变成,确定使原解仍保持最优的c值范围,并把目标函数最 大值变达成c的函数。 解:先采用单纯形法求解最优解,再对保持最优解时C值的范围进行讨论。 1)将问题华为标准线性问题 s.t. 2)用单纯形表表示约束条件,同时在不引入人工变量的前提下,取松弛变量得初始值为零值,求解初始解和最优解 10 -1 -1 -1 10 -20 1 5 1 -20 -2 -1 -1 0 0 0 0 要使目标函数继续减小,可以增大,增大的限值是10。 10 -1 -1 -1 10 0 -20 1 5 1 -20 -10 -2 -1 -1 0 -20 0 0 0 10 0 0 3)转轴。将为零的松弛变量和决策变量交换进行转轴 10 -1 -1 -1 10 -10 4 0 -1 -10 0 -20 1 1 2 -20

单纯形法的计算方法

第4章 单纯形法的计算方法单纯形法求解线性规划的思路: 一般线性规划问题具有线性方程组的变量数大于方程个数, 这时有不定的解。但可以从线性方程组中找出一个个的单纯形, 每一个单纯形可以求得一组解, 然后再判断该解使目标函数值是增大还是变小, 决定下一步选择的单纯形。这就是迭代,直到目标函数实现最大值或最小值为止。 4.1 初始基可行解的确定 为了确定初始基可行解, 要首先找出初始可行基, 其方法如下。 (1)第一种情况:若线性规划问题 max z = 从Pj ( j = 1 , 2 , ? , n)中一般能直接观察到存在一个初始可行基 (2)第二种情况:对所有约束条件是“ ≤”形式的不等式, 可以利用化为标准型的方法, 在每个约束条件的左端加上一个松弛变量。经过整理, 重新对 及 ( i = 1 , 2 , ? , m; j = 1 , 2 , ? , n)进行编号, 则可得下列方程组 显然得到一个m×m单位矩阵 以B 作为可行基。将上面方程组的每个等式移项得 令由上式得 又因 ≥0, 所以得到一个初始基可行解 (3)第三种情况:对所有约束条件是“ ≥”形式的不等式及等式约

束情况, 若不存在单位矩阵时, 就采用人造基方法。即对不等式约束减去一个非负的剩余变量后, 再加上一个非负的人工变量; 对于等式约束再加上一个非负的人工变量, 总能得到一个单位矩阵。 4.2 最优性检验和解的判别 对线性规划问题的求解结果可能出现唯一最优解、无穷多最优解、无界解和无可行解四种情况, 为此需要建立对解的判别准则。一般情况下, 经过迭代后可以得到: 将上代入目标函数,整理后得 令 于是 再令 则 (1) 最优解的判别定理 若为对应于基B的一个基可行解,且对于一切 且有则 为最优解。称为检验数。 (2) 无穷多最优解的判别定理 若为一个基可行解, 且对于一切 且有 又存在某个非基变量的检验数,则线性规划问题有无穷多最优解。 (3) 无界解判别定理 若为一个基可行解,有一个> 0 ,并且对i = 1 , 2 , ?, m,有≤0 , 那么该线性规划问题具有无界解(或称无最优解)。 4.3 基变换

单纯形法典型例题

科学出版社《运筹学》教材 第一章引言 第二章线性规划,姜林 第三章对偶规划,姜林 第四章运输问题,姜林 第五章整数规划,姜林 第六章非线性规划,姜林 第七章动态规划,姜林 第八章多目标规划,姜林 第九章图与网络分析,熊贵武 第十章排队论,熊贵武 第十一章库存论,王勇 第十二章完全信息博弈,王勇 第十三章不完全信息博弈,王勇 第十四章决策论与影响图 第十五章运筹学模型的计算机求解 成年人每天需要从食物中摄取的营养以及四种食品所含营养和价格见下表。问 如何选择食品才能在满足营养的前提下使购买食品的费用最小? 食品名称热量(kcal) 蛋白质(g) 钙(mg)价格(元)猪肉1000 50 400 14 鸡蛋800 60 200 6

大米900 20 300 3 白菜200 10 500 2 营养需求量 2000 55 800 解:设需猪肉、鸡蛋、大米和白菜各需 x1,x2,x3,x4斤。则热量的需求量为: 2000 20090080010004 3 2 1 x x x x 蛋白质 某工厂要做100套钢架,每套有长 3.5米、2.8米和2根2.4米的圆钢组成(如右图)已知原 料长12.3米,问应如何下料使需用的原材料最省。 解:假设从每根 12.3米的原材料上截取 3.5米、2.8米和2根2.4 米,则每根原材料需浪费 1.2米,做100套需浪费材料 120米,现 采用套裁的方法。 方案一二三四五六3.5 2.8 2.4 0 0 5 0 4 0 1 2 1 1 3 0 2 0 2 2 1 1 合计剩余 12 0.3 11.2 1.1 11.5 0.8 11.9 0.4 11.8 0.5 12.2 0.1 现在假设每种方案各下料x i (i=1、2、3、4、5、6),则可列出方程: minZ=0.3x 1+1.1x 2+0.8x 3+0.4x 4+0.5x 5+0.1x 6 约束条件: x 3+x 4+2x 5+2x 6=100 4x 2+2x 3+3x 4+x 6=100 5x 1+x 3+2x 5+x 6=200 ,,,800 50030020040055 102060503000 2009008001000. .23614min 4 3214 3 2 1 4 32 14 32 14321x x x x x x x x x x x x x x x x t s x x x x z

使用单纯形法解线性规划问题

使用单纯形法解线性规划问题 要求:目标函数为:123min 3z x x x =-- 约束条件为: 123123 1312321142321,,0 x x x x x x x x x x x -+≤??-++≥?? -+=??≥? 用单纯形法列表求解,写出计算过程。 解: 1) 将线性规划问题标准化如下: 目标函数为:123max max()3f z x x x =-=-++ s.t.: 123412356 1371234567211 42321,,,,,,0 x x x x x x x x x x x x x x x x x x x -++=??-++-+=??-++=??≥? 2) 找出初始基变量,为x 4、x 6、x 7,做出单纯形表如下: 表一:最初的单纯形表 变量 基变量 x 1 x 2 x 3 x 4 x 5 x 6 x 7 b i x 4 1 -2 1 1 0 0 0 11 x 6 -4 1 2 0 -1 1 0 3 x 7 -2 0 1 0 0 0 1 1 -f -3 1 1 3) 换入变量有两种取法,第一种取为x 2,相应的换出变量为x 6,进行第一次迭代。迭代后新的单纯形表为: 表二:第一种换入换出变量取法迭代后的单纯形表 变量 基变量 x 1 x 2 x 3 x 4 x 5 x 6 x 7 b i x 4 -7 5 1 -2 2 3

x2-4120-1103 x7-20100011 -f10-101-10-3 由于x1和x5对应的系数不是0就是负数,所以此时用单纯形法得不到最优解。 表一中也可以把换入变量取为x3,相应的换出变量为x7,进行一次迭代后的单纯形表为: 表三:第二种换入换出变量取法迭代后的单纯形表 变量 基变量x1x2x3x4x5x6x7 b i x43-20100-110 x60100-11-21 x3-20100011 -f-110000-1-1 4)表三中,取换入变量为x2,换出变量为x6,进行第二次迭代。之后的单纯形 表为: 表四:第二次迭代后的单纯形表 变量 基变量x1x2x3x4x5x6x7 b i x43001-22-512 x20100-11-21 x3-20100011 -f-10001-11-2 5)表四中,取换入变量为x7,换出变量为x3,进行第三次迭代。之后的单纯形 表为: 表五:第三次迭代后的单纯形表 变量 基变量x1x2x3x4x5x6x7 b i x4-7051-22017 x2-4120-1103 x7-20100011 -f10-101-10-3可以看出,此时x1,x5对应的系数全部非零即负,故迭代结束,没有最优解。 结论: 综上所述,本线性规划问题,使用单纯形法得不到最优解。

第1章线性规划及单纯形法

线性规划及单纯形法 一.选择 1. 运筹学应用分析、试验、(C )的方法,对经济管理系统中人、财、物等有限资源进行统筹安排,为决策者提供有依据的最优方案,以实现最有效的管理。 A 统筹 B 量化 C 优化 D 决策 2. 运筹学研究的基本手段是(A )。 A 建立数学模型 B 进行数学分析 C 进行决策分析 D 建立管理规范 3. 运筹学研究的基本特点是( C )。 A 进行系统局部独立分析 B 考虑系统局部优化 C 考虑系统的整体优化 D 进行系统的整体决策 4. 线性规划问题的数学模型包含三个组成要素:决策变量、目标函数、(B ) A 表达式 B 约束条件 C 方程变量 D 价值系数 5. 线性规划问题的基可行解X 对应线性规划问题可行域(凸集)的( C ) A 边 B 平面 C 顶点 D 内部 6. 目标函数取极小化(Z min )的线性规划问题可以转化为目标函数取极大化即(C )的线性规划问题求解 A Z min B )min(Z - C )max(Z - D Z max - 7. 标准形式的线性规划问题,最优解(C )是可行解 A 一定 B 一定不 C 不一定 D 无法确定 8. 在线性规划问题中,称满足所有约束条件方程和非负限制的解为( C )。 A 最优解 B 基可行解 C 可行解 D 基解 9. 生产和经营管理中经常提出任何合理安排,使人力、物力等各种资源得到充分利用,获得最大的效益,这就是所谓的(D ) A 管理问题 B 规划问题 C 决策问题 D 优化问题 10. 在线性规划问题中,图解法适合用于处理变量( B )个的线性规划问题 A 1 B 2 C 3 D 4 11. 求解线性规划问题时,解的情况有:唯一最优解、无穷多最优解、( C )、无可行解 A 无解B 无基解 C 无界解 D 无基可行解 12. 在用图解法求解的时,找不到满足约束条件的公共范围,这时问题有(D ),其原因是模型本身有错误,约束条件之间相互矛盾,应检查修正。 A 唯一最优解 B 无穷多最优解 C 无界解D 无可行解 13. 线性规划问题的基可行解()T n X X X ,,1 =为基可行解的充要条件是X 的正分量所对 应的系数列向量是(B ) A 线性相关 B 线性独立 C 非线性独立 D 无法判断 14. 线性规划问题进行最优性检验和解的判别时,如果当0≤j σ时,人工变量仍留在基本量中且不为零,(D ) A 唯一最优解 B 无穷多最优解 C 无界解 D 无可行解 15.如果集合C 中任意两个点21,X X 其连线上的所有点也都是集合C 中的点,称C 为(B )

单纯形法求解线性规划的步骤

单纯形法求解线性规划的步骤 1>初始化 将给定的线性规划问题化成标准形式,并建立一个初始表格,它最右边的单元格都就是非负的(否则无解),接下来的m 列组成一个m*m的单元矩阵(目标行的单元格则不必满足这一条件),这m列确定了初始的基本可行解的基本变量,而表格中行用基本变量来表示 2>最优化测试 如果目标行的所有单元格都就是非负的(除了最右列中代表目标函数值的那个单元格),就可以停止了,该表格代表了一个最优解,它的基本变量的值在最右列中,而剩下的非基本变量都为0 3>确定输入变量 从目标行的前n个单元格中选择一个负的单元格(选择绝对值最大的那个)该单元格所在的列确定的输入变量及主元列 4>确定分离变量 对于主元列的每个正单元格,求出θ比率(如果主元格的单元格为负或为0,说明该问题就是无解的,算法终止),找出θ比率最小的列,改行确定了分离变量与主元行 5>建立下一张表格 将主元行的所有单元格除以主元得到新的主元行,包括主元行在内的每一行,要减去改行主元列单元格与新主元行的成绩(除主元行为1外,这一步将主元列的所有单元格变成0)、把主元列的变量名进行代换,得到新的单纯形表,返回第一步 为求简单 在本程序中,需要自己建立标准矩阵(比如加入松弛变量等工作需要用户自己完成),程序的输入有两种方式: 1:指定行与列,由用户自行输入每一个元素SimpleMatrix(introw=0,int col=0); 2:直接在主程序中初始化一个二维数组,然后利用构造函数SimpleMatrix(introw,int col,double **M) 来初始化与处理(本程序所用的实例用的就是这种方法) 程序中主要的函数以及说明 ~SimpleMatrix(); 销毁动态分配的数组、用于很难预先估计矩阵的行与列,所以在程序中才了动态的内存分配、需要重载析构函数bool Is_objectLine_All_Positive(); //判断目标行就是否全部为非负数,最后一列不作考虑 这个函数用来判断就是否已经存在最优解 bool Is_MainCol_All_Negative(int col);//判断主元列就是否全部为负数或零 这个函数用来判断线性规划就是否就是无解的 bool Is_column_all_Positive(int col); //判断col列中就是否全部为正(不包括目标行)

《运筹学》习题线性规划部分练习题及答案

《运筹学》线性规划部分练习题 一、思考题 1.什么是线性规划模型,在模型中各系数的经济意义是什么? 2.线性规划问题的一般形式有何特征? 3.建立一个实际问题的数学模型一般要几步? 4.两个变量的线性规划问题的图解法的一般步骤是什么? 5.求解线性规划问题时可能出现几种结果,那种结果反映建模时有错误? 6.什么是线性规划的标准型,如何把一个非标准形式的线性规划问题转化成标准形式。 7.试述线性规划问题的可行解、基础解、基础可行解、最优解、最优基础解的概念及它们之间的相互关系。 8.试述单纯形法的计算步骤,如何在单纯形表上判别问题具有唯一最优解、有无穷多个最优解、无界解或无可行解。 9.在什么样的情况下采用人工变量法,人工变量法包括哪两种解法? 10.大M 法中,M 的作用是什么?对最小化问题,在目标函数中人工变量的系数取什么?最大化问题呢? 11.什么是单纯形法的两阶段法?两阶段法的第一段是为了解决什么问题?在怎样的情况下,继续第二阶段? 二、判断下列说法是否正确。 1.线性规划问题的最优解一定在可行域的顶点达到。 2.线性规划的可行解集是凸集。 3.如果一个线性规划问题有两个不同的最优解,则它有无穷多个最优解。 4.线性规划模型中增加一个约束条件,可行域的范围一般将缩小,减少一个约束条件,可行域的范围一般将扩大。 5.线性规划问题的每一个基本解对应可行域的一个顶点。 6.如果一个线性规划问题有可行解,那么它必有最优解。 7.用单纯形法求解标准形式(求最小值)的线性规划问题时,与 > j σ 对应的变量都 可以被选作换入变量。 8.单纯形法计算中,如不按最小非负比值原则选出换出变量,则在下一个解中至少有一个基变量的值是负的。 9.单纯形法计算中,选取最大正检验数k σ对应的变量k x作为换入变量,可使目标函数值得到最快的减少。 10.一旦一个人工变量在迭代中变为非基变量后,该变量及相应列的数字可以从单纯形表中删除,而不影响计算结果。 三、建立下面问题的数学模型 1.某公司计划在三年的计划期内,有四个建设项目可以投资:项目Ⅰ从第一年到 第三年年初都可以投资。预计每年年初投资,年末可收回本利120% ,每年又可以重新将所获本利纳入投资计划;项目Ⅱ需要在第一年初投资,经过两年可收回本利150% ,又可以重新将所获本利纳入投资计划,但用于该项目的最大投资额不得超过20万元;项目Ⅲ需要在第二年年初投资,经过两年可收回本利160% ,但用于该项目的最大投资额不得超过15万元;项目Ⅳ需要在第三年年初投资,年末可收回本利140% ,但用于该项目的最大投资额不得超过10万元。在这个计划期内,该公司第一年可供投资的资金有30万元。问怎样的投资方案,才能使该公司在这个计划期获得最大利润? 2.某饲养场饲养动物,设每头动物每天至少需要700克蛋白质、30克矿物质、100克维生素。现有五种饲料可供选用,各种饲料每公斤营养成分含量及单 价如下表2—1所示:

单纯形法求解线性规划的步骤

单纯形法求解线性规划的步骤

单纯形法求解线性规划的步骤 1>初始化 将给定的线性规划问题化成标准形式,并建立一个初始表格,它最右边的单元格都是非负的(否则无解),接下来的m列组成一个m*m的单元矩阵(目标行的单元格则不必满足这一条件),这m列确定了初始的基本可行解的基本变量,而表格中行用基本变量来表示 2>最优化测试 如果目标行的所有单元格都是非负的(除了最右列中代表目标函数值的那个单元格),就可以停止了,该表格代表了一个最优解,它的基本变量的值在最右列中,而剩下的非基本变量都为0 3>确定输入变量 从目标行的前n个单元格中选择一个负的单元格(选择绝对值最大的那个)该单元格所在的列确定的输入变量及主元列 4>确定分离变量 对于主元列的每个正单元格,求出θ比率(如果主元格的单元格为负或为0,说明该问题是无解的,算法终止),找出θ比率最小的列,改行确定了分离变量和主元行 5>建立下一张表格 将主元行的所有单元格除以主元得到新的主元行,包括主元行在内的每一行,要减去改行主元列单元格和新主元行的成绩(除主元行为1外,这一步将主元列的所有单元格变成0).把主元列的变量名进行代换,得到新的单纯形表,返回第一步 为求简单 在本程序中,需要自己建立标准矩阵(比如加入松弛变量等工作需要用户自己完成),程序的输入有两种方式: 1:指定行和列,由用户自行输入每一个元素SimpleMatrix(introw=0,int col=0); 2:直接在主程序中初始化一个二维数组,然后利用构造函数SimpleMatrix(introw,int col,double **M) 来初始化和处理(本程序所用的实例用的是这种方法) 程序中主要的函数以及说明 ~SimpleMatrix(); 销毁动态分配的数组.用于很难预先估计矩阵的行和列,所以在程序中才了动态的内存分配.需要重载析构函数 bool Is_objectLine_All_Positive(); //判断目标行是否全部为非负数,最后一列不作考虑 这个函数用来判断是否已经存在最优解 bool Is_MainCol_All_Negative(int col);//判断主元列是否全部为负数或零 这个函数用来判断线性规划是否是无解的 bool Is_column_all_Positive(int col); //判断col列中是否全部为正(不包括目标行)

单纯形法求解原理过程

单纯形法 需要解决的问题: 如何确定初始基本可行解; 如何由一个基本可行解迭代出另一个基本可行解,同时使目标函数获得较大的下降; 如何判断一个基本可行解是否为最优解。 min f(X)=-60x1-120x2 s.t. 9x1+4x2+x3=360 3x1+10x2+x4=300 4x1+5x2+x5=200 x i≥0 (i=1,2,3,4,5) (1) 初始基本可行解的求法。当用添加松弛变量的方法把不等式约 束换成等式约束时,我们往往会发现这些松弛变量就可以作为 初始基本可行解中的一部分基本变量。 例如:x1-x2+x3≤5 x1+2x2+x3≤10 x i≥0 引入松弛变量x4,x5后,可将前两个不等式约束换成标准形式 x1-x2+x3+x4=5 x1+2x2+x3+x5=10 x i≥0 (i=1,2,3,4,5) 令x1=x2=x3=0,则可立即得到一组基本可行解 x1=x2=x3=0,x4=5,x5=10 同理在该实例中,从约束方程式的系数矩阵 中可以看出其中有个标准基,即 与B对应的变量x3,x4,x5为基本变量,所以可将约束方程写成 X3=360-9x1-4x2 x4=300-3x1-10x2 x5=200-4x1-5x2 若令非基变量x1=x2=0,则可得到一个初始基本可行解X0 X0=[0,0,360,300,200] T 判别初始基本可行解是否是最优解。此时可将上式代入到目标函数中,得:

F(X)=-60x1-120x2 对应的函数值为f(X0)=0。 由于上式中x1,x2系数为负,因而f(X0)=0不是最小值。因此所得的解不是最优解。 (2) 从初始基本可行解X0迭代出另一个基本可行解X1,并判断X1是否 为最优解。从一个基本可行解迭代出另一个基本可行解可分为 两步进行: 第一步,从原来的非基变量中选一个(称为进基变量)使其成为基本变量; 第二步,从原来的基本变量中选一个(称为离基变量)使其成为新的非基变量。 选择进基和离基变量的原则是使目标函数值得到最快的下降和使所有的基本变量值必须是非负。 在目标函数表达式中,非基变量x1,x2的系数是负值可知,若x1,x2不取零而取正值时,则目标函数还可以下降。因此,只要目标函数式中还存在负系数的非基变量,就表明目标函数还有下降的可能。也就还需要将非基本变量和基本变量进行对换。一般选择目标函数式中系数最小的(即绝对值最大的负系数)非基变量x2换入基本变量,然后从x3,x4,x5中换出一个基本变量,并保证经变换后得到的基本变量均为非负。 当x1=0,约束表达式为: X3=360-4x2≥0 x4=300-10x2≥0 x5=200-5x2≥0 从上式中可以看出,只有选择 x2=min{}=30 才能使上式成立。由于当x2=30时,原基本变量x4=0,其余x3和x5都满足非负要求。因此,可以将x2,x4互换。于是原约束方程式可得到:4x2+x3=360-9x1 10x2 =300-3x1-x4 5x2+x5=200-4x1 用消元法将上式中x2的系数列向量变[4,10,5]T换成标准基向量[0,1,0]T。其具体运算过程如下: -*4/10 : x3=240-78x1/10+4 x4/10 /10 : x2 =30-3x1/10-x4/10

线性规划单纯形法matlab解法

%单纯形法matlab程序-ssimplex % 求解标准型线性规划:max c*x; . A*x=b; x>=0 % 本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b % N是初始的基变量的下标 % 输出变量sol是最优解, 其中松弛变量(或剩余变量)可能不为0 % 输出变量val是最优目标值,kk是迭代次数 % 例:max 2*x1+3*x2 % . x1+2*x2<=8 % 4*x1<=16 % 4*x2<=12 % x1,x2>=0 % 加入松驰变量,化为标准型,得到 % A=[1 2 1 0 0 8; % 4 0 0 1 0 16; % 0 4 0 0 1 12; % 2 3 0 0 0 0]; % N=[3 4 5]; % [sol,val,kk]=ssimplex(A,N) % 然后执行 [sol,val,kk]=ssimplex(A,N)就可以了。 function [sol,val,kk]=ssimplex(A,N) [mA,nA]=size(A); kk=0; % 迭代次数 flag=1;

while flag kk=kk+1; if A(mA,:)<=0 % 已找到最优解 flag=0; sol=zeros(1,nA-1); for i=1:mA-1 sol(N(i))=A(i,nA); end val=-A(mA,nA); else for i=1:nA-1 if A(mA,i)>0&A(1:mA-1,i)<=0 % 问题有无界解 disp('have infinite solution!'); flag=0; break; end end if flag % 还不是最优表,进行转轴运算 temp=0; for i=1:nA-1 if A(mA,i)>temp temp=A(mA,i); inb=i; % 进基变量的下标 end

图解法和单纯形法求解线性规划问题

图解法和单纯形法求解以下线性规划问题 1.1 图解法解线性规划问题 只含两个变量的线性规划问题,可以通过在平面上作图的方法求解,步骤如下: (1)以变量x1为横坐标轴,x2为纵坐标轴,适当选取单位坐标长度建立平面坐标直 角坐标系。由变量的非负性约束性可知,满足该约束条件的解均在第一象限内。 (2)图示约束条件,找出可行域(所有约束条件共同构成的图形)。 (3)画出目标函数等值线,并确定函数增大(或减小)的方向。 (4)可行域中使目标函数达到最优的点即为最优解。 然而,由于图解法不适用于求解大规模的线性规划问题,其实用意义不大。 1.2 单纯形法解线性规划问题 它的理论根据是:线性规划问题的可行域是n维向量空间Rn中的多面凸集,其最优值如果存在必在该凸集的某顶点处达到。顶点所对应的可行解称为基本可行解。 单纯形法的基本思想是:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。如果问题无最优解也可用此法判别。 单纯形法的一般解题步骤可归纳如下:①把线性规划问题的约束方程组表达成典范型方程组,找出基本可行解作为初始基本可行解。②若基本可行解不存在,即约束条件有矛盾,则问题无解。③若基本可行解存在,从初始基本可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。④按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。⑤若迭代过程中发现问题的目标函数值无界,则终止迭代。 1.3 线性规划问题的标准化 使用单纯形法求解线性规划时,首先要化问题为标准形式

使用单纯形法解线性规划问题

使用单纯形法解线性规划 问题 The Standardization Office was revised on the afternoon of December 13, 2020

使用单纯形法解线性规划问题 要求:目标函数为:123min 3z x x x =-- 约束条件为: 123123 1312321142321,,0 x x x x x x x x x x x -+≤??-++≥?? -+=??≥? 用单纯形法列表求解,写出计算过程。 解: 1)将线性规划问题标准化如下: 目标函数为:123max max()3f z x x x =-=-++ .: 1234123561371234567211 42321,,,,,,0x x x x x x x x x x x x x x x x x x x -++=??-++-+=??-++=??≥? 2)找出初始基变量,为x 4、x 6、x 7,做出单纯形表如下: 表一:最初的单纯形表 3) 换入变量有两种取法,第一种取为x 2,相应的换出变量为x 6,进行第一 次迭代。迭代后新的单纯形表为: 表二:第一种换入换出变量取法迭代后的单纯形表

由于x1和x5对应的系数不是0就是负数,所以此时用单纯形法得不到最优解。 表一中也可以把换入变量取为x3,相应的换出变量为x7,进行一次迭代后的单纯形表为: 表三:第二种换入换出变量取法迭代后的单纯形表 4)表三中,取换入变量为x2,换出变量为x6,进行第二次迭代。之后的单纯形表为: 表四:第二次迭代后的单纯形表 5)表四中,取换入变量为x7,换出变量为x3,进行第三次迭代。之后的单纯形表为: 表五:第三次迭代后的单纯形表

第一章线性规划及单纯形法习题

第一章 线性规划及单纯形法习题 1.用图解法求解下列线性规划问题,并指出问题具有唯一最优解、无穷最优解还是无可行解。 (1)??? ??≥≥+≥++=0,42266432min 2121212 1x x x x x x x x z (2) ??? ??≥≥+≥++=0,12432 223max 2 121212 1x x x x x x x x (3) ?? ? ??≤≤≤≤≤++=8 3105120 106max 21212 1x x x x x x z (4) ??? ??≥≤+-≥-+=0,2322 265max 1 2212121x x x x x x x x z 2.将下列线性规划问题化成标准形式。 (1)????? ? ?≥≥-++-≤+-+-=-+-+-+-=无约束 43214321432143214321,0,,2321422 245243min x x x x x x x x x x x x x x x x x x x x z (2) ????? ? ?≥≤≥-++-≤-+-=++-+-=无约束 32143213213213 21,0,023*******min x x x x x x x x x x x x x x x x z 3.对下列线性规划问题找出所有基本解,指出哪些是基可行解,并确定最优解。 (1) ??? ?? ? ?=≥=-=+-+=+++++=)6,,1(0231024893631223min 61432143213 21 j x x x x x x x x x x x x x x z j (2) ??? ??=≥=+++=+++++-=)4,,1(0102227 4322325min 432143214321 j x x x x x x x x x x x x x z j 4.分别用图解发法和单纯形法求解下述问题,并对照单纯形表中的各基本可行解对应图解法中可行域的哪一顶点。

单纯形法在线性规划中的应用

单纯形法在线性规划中的应用 摘要 求解线性规划问题,就是在各项资源条件的限制下,如何确定方案,使预期的目标达到最优。本文重点介绍了求解线性规划问题目前最常见的两种方法,图解法和单纯形法。图解法适合于只含两个变量的线性规划问题,文中只做了简单的描述。而单纯形法是求解线性规划问题的通用方法,适合于求解大规模的线性规划问题,本文作了重点描述,对单纯形法中的基本概念如基变量、非基变量、基向量、非基向量、可行基以及基本可行解等概念作了详细的陈述,在此基础上,介绍了线性规划问题的标准化、单纯形法的基本原理、确定初始可行解、最优性检验、解的判别、基本可行解的改进、换入变量的确定-最大增加原则、换出变量的确定-最小比值原则、表格单纯形法、大M法、两阶段法等。 关键词:线性规划图解法单纯形法基变量基向量可行基基本可行解

正文 引言 在生产管理和经济活动中,经常遇到这些问题,如生产计划问题,即如何合理利用有限的人、财、物等资源,以便得到最好的经济效果;材料利用问题,即如何下料使用材最少;配料问题,即在原料供应量的限制下如何获取最大利润;劳动力安排问题,即如何用最少的劳动力来满足工作的需要;运输问题,即如何制定调运方案,使总运费最小;投资问题,即从投资项目中选取方案,使投资回报最大等等。对于这些问题,都能建立相应的线性规划模型。事实上,线性规划就是利用数学为工具,来研究在一定条件下,如何实现目标最优化。 解线性规划问题目前最常见的方法有两种,图解法和单纯形法。单纯形法是求解线性规划问题的通用方法。 1 线性规划问题的求解方法 1.1 图解法解线性规划问题 只含两个变量的线性规划问题,可以通过在平面上作图的方法求解,步骤如下: (1)以变量x 1为横坐标轴,x 2 为纵坐标轴,适当选取单位坐标长度建立平面 坐标直角坐标系。由变量的非负性约束性可知,满足该约束条件的解均在第一象限内。 (2)图示约束条件,找出可行域(所有约束条件共同构成的图形)。 (3)画出目标函数等值线,并确定函数增大(或减小)的方向。 (4)可行域中使目标函数达到最优的点即为最优解。 然而,图解法虽然直观、简便,但当变量数多于三个以上时,其实用意义不大。

使用单纯形法解线性规划问题

使用单纯形法解线性规划问题 要求:目标函数为:123min 3z x x x =-- 约束条件为: 123123 1312321142321,,0 x x x x x x x x x x x -+≤??-++≥?? -+=??≥? 用单纯形法列表求解,写出计算过程。 解: 1) 将线性规划问题标准化如下: 目标函数为:123max max()3f z x x x =-=-++ s.t.: 123412356 1371234567211 42321,,,,,,0 x x x x x x x x x x x x x x x x x x x -++=??-++-+=??-++=??≥? 2) 找出初始基变量,为x 4、x 6、x 7,做出单纯形表如下: 表一:最初的单纯形表 3) 换入变量有两种取法,第一种取为x 2,相应的换出变量为x 6,进行第一次迭代。迭代后新的单纯形表为: 表二:第一种换入换出变量取法迭代后的单纯形表

由于x1和x5对应的系数不是0就是负数,所以此时用单纯形法得不到最优解。 表一中也可以把换入变量取为x3,相应的换出变量为x7,进行一次迭代后的单纯形表为: 表三:第二种换入换出变量取法迭代后的单纯形表 4)表三中,取换入变量为x2,换出变量为x6,进行第二次迭代。之后的单纯形表为: 表四:第二次迭代后的单纯形表 5)表四中,取换入变量为x7,换出变量为x3,进行第三次迭代。之后的单纯形表为: 表五:第三次迭代后的单纯形表 可以看出,此时x1,x5对应的系数全部非零即负,故迭代结束,没有最优解。 结论: 综上所述,本线性规划问题,使用单纯形法得不到最优解。

单纯形法的计算方法

第4章 单纯形法的计算方法 单纯形法求解线性规划的思路: 一般线性规划问题具有线性方程组的变量数大于方程个数, 这时有不定的解。但可以从线性方程组中找出一个个的单纯形, 每一个单纯形可以求得一组解, 然后再判断该解使目标函数值是增大还是变小, 决定下一步选择的单纯形。这就是迭代, 直到目标函数实现最大值或最小值为止。 4.1 初始基可行解的确定 为了确定初始基可行解, 要首先找出初始可行基, 其方法如下。 (1)第一种情况:若线性规划问题 max z =n j j j=1c x ∑ 1,1,2,...,0,1,2,...n ij j i j j a x b i m x j n =?==???≥=?∑ 从Pj ( j = 1 , 2 , ? , n )中一般能直接观察到存在一个初始可行基 121(,,...,)n B P P P 0 0?? ?0 1 0 ?== ? ?0 0 1?? (2)第二种情况:对所有约束条件是“ ≤”形式的不等式, 可以利用化为标准型的方法, 在每个约束条件的左端加上一个松弛变量。经过整理, 重新对 j x 及ij a ( i = 1 , 2 , ? , m ; j = 1 , 2 , ? , n )进行编号, 则可得下列方 程组 11,1111 22,1122,1112.........,,...,0 m m n n m m n n m m m m nn n n n x a x a x b x a x a x b x a x a x b x x x +++++++++=?? +++=?? ??+++=??≥? 显然得到一个m ×m 单位矩阵

单纯形法例题

单纯形法例题 1、例1、目标函数 max z=2+3 约束条件: 解:首先要将约束条件化为标准形:由此可以看出我们需要加上三个松弛变量, .得到的标准形式为: max z=2+3+ 0+0+0 然后要将其初始的单纯形表画出来: 23000 b 08121004 01640010- 01200013 23000 由初始单纯形表可以看出,为换入变量,而为换出变量;然后根据:= (也就是如果与主元素同行,则用现在的值除以主元素即可得到即将要填入的值,否则,就用现在的值减去与主元素构成矩形的边角上的值的乘积再除以主元素之后的值。例如:上面的第一行所对应的b值为8-(12*2)/4=2,故填入值应该为2。而则是由我们根据非基变量的检验数的大小,挑选出最大的那个,作为换入变量,然后用b的值除以该换入变量所在的列的所有值,得到列的值。 23000 b 02010-1/22 016400104 3301001/4- 2000-3/4由于在检验数中仍然存在大于等于0的数,而且P1,P5的坐标中有正分量存在,所以需要继续进行迭代运算。通过观察可以看出主元素为1,换入变量为,换出变量为,故得到的单纯形表如下:

23000 b 221010-1/2- 0800-414 3301001/412 00-201/4由于检验数中存在正数,且P5和P3中有正分量存在,所以需要继续迭代(换入变 23000 b 241001/40 0400-21/21 32011/2-1/80 00-3/2-1/80 (4,2,0,0,4),故目标函数值z=2*4+2*3=14 2、合理利用线材问题,现在要做100套钢架,每套用长为,,和的钢各一根, 已知原料长,问应如何下料,使用的原材料最省; 解:首先我们必须要清楚该问题的需要设立的变量是什么。我们分析一下问题,做100套钢架,需要长的钢100根,的钢100根,的钢100根。而一份原料长度是, 长度/m 下料根数 截取方案 12345 112 212 3132所用长度 剩余长度0 方案,使得剩余的总长度最少。由此,我们可以将目标函数和约束条件表述出来: 目标函数:min z=+++ 约束条件 首先可以写出线性方程组的矩阵形式:发现不存在单位矩阵,所以要采用人造基的方式,也就是要添加人工变量:,那么线性方程组可以

用单纯形法求解线性规划问题

目录 一.摘要 (2) 二.实验目的 (2) 三.实验内容 (2) 四.建立数学模型 (3) 五.实验原理 (5) 六.MALTAB程序代码及注释 (7) 七.结果运行测试 (13) 八.心得与感悟 (15)

一.摘要: 线性规划是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法.研究线性约束条件下线性目标函数的极值问题的数学理论和方法,英文缩写LP。 自1946年G.B.Dantizig提出单纯形法以来,它一直是求解线性规划问题的最有效的数学方法之一。单纯形法的理论根据是:线性规划问题的可行域是 n 维向量空间Rn中的多面凸集,其最优值如果存在必在该凸集的某顶点处达到。顶点所对应的可行解称为基本可行解。通过引入普通单纯形法,依次迭代并判断,逐步逼近,最后得到最优解。若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。如果问题无最优解也可用此法判别。 关键字:线性规划,单纯形法,最优值,最优解 二.实验目的: 1.加强学生分析问题能力,锻炼数学建模能力。 2.了解并掌握MATLAB软件中的线性规划问题的编程、求解和分析。 3.利用所学的MALTAB语言,完成对单纯形法问题的编程设计。 三.实验内容: 某商场决定,营业员每周连续工作5天后连续休息2天,轮流休息,据统计,商场每天需要营业员如下:星期一:300,二:300;三:350,四:400,五:480,六:600;日:500; (1)商场人力资源部应如何安排每天上班的人数才能使商场总的营业员最少 (2)若商场可以雇佣临时工,上班时间同正式工,若正式工每天工资80,临时工每天100,问商场是否应雇佣临时工及雇佣多少名?

相关主题
文本预览
相关文档 最新文档