运筹学实验-1

单纯形法程序的设计与实现

算法思路

读入数据 -> 处理数据(添加松弛变量,人工变量) -> 计算每一列的检验数 -> 决定继续迭代还是结束

算法具体实现

1 设立的变量

vector<intc;//目标函数系数
vector<double>a;//约束条件系数
vector<double>b;//约束条件右部数字
vector<int>s;//约束条件符号
vector<double>test;//检验数
vector<double>xita;//θ
int *P;//基
int line = 0,row=0; //最初的行数和列数
int artificial = 0; //因为大于等于号需要添加的人工向量

2 读入数据(对应代码中 read_data() 函数)

数据格式:

1(表示目标函数是max);0(表示目标函数是min)

4 5 1   目标函数系数向量

3   3   约束条件矩阵维数

3 2 1 18 2         最后一个数字表示约束条件符号,2表示大于等于

2 1 0 4 1          最后一个数字表示约束条件符号,1表示小于等于

1 2 0 5 0         最后一个数字表示约束条件符号,0表示等于

3 处理数据(对应代码中 read_data() 函数)

中心思想:转化为标准型

第一个数字表示目标函数是求max还是min,如果是min直接将目标函数的系数取相反数;对于约束条件矩阵,其变化与否取决于约束条件的符号,即矩阵中每一行最后一个数字:如果是等于(=0),默认需要添加人工变量,直接添加人工变量并将该变量对应的目标函数系数设为-M(本程序中M的值设为999,足够进行所以数据的计算);如果是小于等于(=1),仅添加一个松弛变量即可,约束条件矩阵系数为1;如果是大于等于,情况稍复杂,既需要添加松弛变量,约束条件矩阵系数为-1,又需要添加人工变量,约束条件矩阵系数为1。
如此一来,可以保证经处理过的矩阵中一定有单位矩阵便于后续单纯形法的计算。此时系数矩阵的列数为 line + row + artificial,其中 line 为读入系数矩阵的行数,row 为读入系数矩阵的列数不包括符号右边的常数和表示约束条件符号的数字,artificial 为因约束条件是大于等于而添加的人工变量的个数

4 单纯形法计算(对应代码中 cal_test()、cal_xita()和simplex() 函数)

cal_test() 函数计算每一列(也可以说是每一个变量)的检验数,如果所有检验数均小于等于0则停止迭代输出答案,如果存在检验数大于0则取检验数最大的那一列,该列对应的变量即为换入变量 ex_in 。继续计算该列不同行的 θ(即b[j]/a[i][j]) 值,cal_xita()函数实现了此计算,输出 θ 最小的值对应的行,该行对应的变量即为换出变量 ex_out 。
确定了换入和换出变量之后,更改对应的约束矩阵系数使换入变量对应的列组成单位矩阵的一部分即可。最后更改记录基的数组 P 的值(例如,P[0]=3表示单纯形表第一行的基为x3)即可。

输出结果

结果以“result.txt”命名附于压缩文件中(运行程序在build文件中同样可以得到)。
以第一个测试数据的结果为例:

5 3 1 1 0 0 0							
-5 6 15 0 1 0 0 
2 1 1 0 0 -1 1 							//首先给出转化为标准型并添加了人工变量之后的系数矩阵
test number:2008 1014 1011 0 0 -999 0 	//每一列对应的检验数
we will exchange in x1					//存在检验数大于0的情况,确定换入变量
xita:1.8 999 2.5 						//换入列每一行对应的θ值
we will exchange out line1				//找到最小的θ值,确定换出变量
1 0.6 0.2 0.2 0 0 0 
0 9 16 1 1 0 0 
0 -0.2 0.6 -0.4 0 -1 1 					//改变基变量之后的系数矩阵,后续迭代同上
test number:0 -190.8 609.4 -401.6 0 -999 0 
we will exchange in x3
xita:9 1.5 2.33333 
we will exchange out line2
1 0.4875 0 0.1875 -0.0125 0 0 
0 0.5625 1 0.0625 0.0625 0 0 
0 -0.5375 0 -0.4375 -0.0375 -1 1 
test number:0 -533.587 0 -439.688 -38.0875 -999 0 
Iteration complete						//所有检验数小于等于0,迭代完成

the result as follows:
x1 = 1.5
x3 = 1.5
x7 = 0.5								//最终结果
-----------------

算法评估

运行时间:0.002 secs

压缩包文件

运筹学实验-1.md : 实验报告

results.txt : 测试结果

simplex-method : 源码文件

build-simplex-method-Desktop_Qt_5_14_1_MinGW_64_bit-Debug : bulild文件(含输入文件testdata.txt)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值