-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdual_simplex.py
84 lines (82 loc) · 2.79 KB
/
dual_simplex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import numpy as np
import pandas as pd
def dual_simplex(matrix):
while np.min(matrix.iloc[1:,0]) <= 0:
#出基变量
out_basic = matrix.iloc[1:,0].idxmin()
#确定进基变量
in_basic = None
idxset = set(list(matrix.loc["rc"].index)[1:]) - set(list(matrix.index)[1:])
minsita = 1e10
for idx in idxset:
if matrix.loc[out_basic,idx] < 0:
sita = -matrix.loc["rc",idx]/matrix.loc[out_basic,idx]
if sita < minsita:
minsita = sita
in_basic = idx
if in_basic:
#pivote
matrix.loc[out_basic,:] = matrix.loc[out_basic,:]/matrix.loc[out_basic,in_basic]
for idx in matrix.index:
if idx != out_basic:
matrix.loc[idx,:] = matrix.loc[idx,:] - matrix.loc[idx,in_basic]*matrix.loc[out_basic,:]
matrix.rename(index={out_basic:in_basic},inplace=True)
#print(matrix)
#return
else:
#infeasible
print("the LP is infeasible")
return
else:
return -matrix.iloc[0,0]
def simplex(matrix):
while np.min(matrix.iloc[0,1:]) < 0:
#进基变量
in_basic = matrix.iloc[0,1:].idxmin()
#确定进基变量
out_basic = None
idxset = set(list(matrix.index)[1:])
minsita = 1e10
for idx in idxset:
if matrix.loc[idx,in_basic] > 0:
sita = matrix.loc[idx,"b"]/matrix.loc[idx,in_basic]
if sita < minsita:
minsita = sita
out_basic = idx
if out_basic:
#pivote
matrix.loc[out_basic,:] = matrix.loc[out_basic,:]/matrix.loc[out_basic,in_basic]
for idx in matrix.index:
if idx != out_basic:
matrix.loc[idx,:] = matrix.loc[idx,:] - matrix.loc[idx,in_basic]*matrix.loc[out_basic,:]
matrix.rename(index={out_basic:in_basic},inplace=True)
#print(matrix)
#return
else:
#infeasible
print("the LP is infeasible")
return
else:
return -matrix.iloc[0,0]
matrix = pd.DataFrame(
data=np.array([[0,7,2,0,0,0],
[4,-1,2,1,0,0],
[20,5,1,0,1,0],
[-7,-2,-2,0,0,-1]]),
columns = ["b","x1","x2","x3","x4","x5"],
index=["rc","x3","x4","x5"]
)
print(matrix)
obj = dual_simplex(matrix.copy())
print(obj)
print(matrix)
matrix = pd.DataFrame(
data=np.array([[0,-7,-2,0,0,0,1000],
[4,-1,2,1,0,0,0],
[20,5,1,0,1,0,0],
[7,2,2,0,0,-1,1]]),
columns = ["b","x1","x2","x3","x4","x5","x6"],
index=["rc","x3","x4","x6"]
)
obj = simplex(matrix.copy())
print(obj)