def pivot(N, B, A, b, c, v, l, e):
'''
N对应非基本元变量下标,B对应基本元变量下标,A对应非基本元在约束方程组中的系数相反数形成的矩阵,
b对应约束条件中小于等于号右边的数值集合,c对应目标函数中变量系数形成的集合,v对应当前目标函数的取值,
l对应转出变量下标在B中的位置,e对应转入变量下标在N中的位置
'''
b[l] = b[l] / A[l][e] #将给定等式的常数和除了传入变量意外的其他变量对应的系数除以转入变量对应的系数
for j in range(len(A[0])):
if j == e:
continue
A[l][j] = A[l][j] / A[l][e]
A[l][e] = 1 / A[l][e] #这是等号左边变量转入右边后对应的系数
for i in range(len(A)): #改变其他等式常数和变量系数
if i == l:
continue
b[i] = b[i] - A[i][e] * b[l]
for j in range(len(A[0])):
if j == e:
continue
A[i][j] = A[i][j] - A[i][e] * A[l][j]
A[i][e] = -A[i][e] * A[l][e] #由于A中元素对应约束条件中变量系数的相反数,因此A中元素相乘后符号会负负得正,因此前面要加个负号
v = v + c[e] * b[l] #变量替换后目标修改目标函数的值
for j in range(len(c)): #目标函数中转出变量替换成转入变量后修改相关xishu7
if j == e:
continue
c[j] = c[j] - c[e] * A[l][j]
c[e] = -c[e] * A[l][e]
leaving_variable_index = B[l]
entering_variable_index = N[e]
B[l] = entering_variable_index
N[e] = leaving_variable_index
return (N, B, A, b, c, v)
A = [
[1, 1, 3],
[2, 2, 5],
[4, 1, 2]
]
B = [4, 5, 6]
N = [1, 2, 3]
b = [30, 24, 36]
c = [3, 1, 2]
v = 0
l = 2
e = 0
(N, B, A, b, c, v)=pivot(N, B, A, b, c,v, l, e)
print("index of no basic variables after pivoting: ", N)
print("index of basic variables after pivoting: ", B)
print("coefficients of no basic variables after pivoting: ", A)
print("object function coefficients after pivoting is : ", c)
print("object function value after pivoting is : ", v)
对于如上的代码,通过一个具体的例子来说明这段代码的运行逻辑,如果假设要解决的线性规划的系统如下:
添加图片注释,不超过 140 字(可选)
将该线性规划系统经过转换之后变成标准型的形式:
添加图片注释,不超过 140 字(可选)
对于此时的基本元的下标是4,5,6,因此变量B所对应的内容是B={4,5,6},同理非基本元的下标是1,2,3,在约束条件中非基本元对应的系数相反数集合为
添加图片注释,不超过 140 字(可选)
同时约束条件中常量集合为b={30,24,26},在目标函数中变量对应系数集合为e={3,1,2},代码中输入变量v对应目标函数当前取值结果,根绝simplex算法会把所有非基本元取值为0,所以此时目标函数对应的结果为0。
根据simplex算法,从目标函数中选择一个系数为正的变量,因此可以选择变量x1,然后再保持变量大于等于0的前提下增加它的值,看那个约束条件让他的增加值是最少的。
最后一个约束条件让x1的增加值最少,选择最后一个约束条件进行下一步变换,转入变量对应x1,转出变量对应x6,而x1在三个约束条件中对应的系数处于矩阵A的第一列,代码含中的输入变量x1=0,变量x6下标对应B[2],因此e=2。