网上找了一些代码,发现有一些是不能用的,出现错误说集合为空

1.网上出现了好多次,但是不能用的,只能部分模型能用,比如例子中所示

原链接:https://www.jianshu.com/p/b233cfa06017

https://blog.csdn.net/kittyzc/article/details/81707464

 1 import numpy as np
 2
 3 def pivot():
 4     l = list(d[0][:-2])
 5     jnum = l.index(max(l)) #转入编号
 6     m = []
 7     for i in range(bn):
 8         if d[i][jnum] == 0:
 9             m.append(0.)
10         else:
11             m.append(d[i][-1]/d[i][jnum])
12     inum = m.index(min([x for x in m[1:] if x!=0]))  #转出下标
13     s[inum-1] = jnum
14     r = d[inum][jnum]
15     d[inum] /= r
16     for i in [x for x in range(bn) if x !=inum]:
17         r = d[i][jnum]
18         d[i] -= r * d[inum]
19
20 def solve():
21     flag = True
22     while flag:
23         if max(list(d[0][:-1])) <= 0: #直至所有系数小于等于0
24             flag = False
25         else:
26             pivot()
27
28 def printSol():
29     for i in range(cn - 1):
30         if i in s:
31             print("x"+str(i)+"=%.2f" % d[s.index(i)+1][-1])
32         else:
33             print("x"+str(i)+"=0.00")
34     print("objective is %.2f"%(-d[0][-1]))
35
36 d = np.loadtxt("data.txt", dtype=np.float)
37 (bn,cn) = d.shape
38 s = list(range(cn-bn,cn-1)) #基变量列表
39 solve()
40 printSol()
41
42 # txt文件里面的格式
43
44 1 14 6 0 0 0 0 0
45
46 1 1 1 1 0 0 0 4
47
48 1 0 0 0 1 0 0 2
49
50 0 0 1 0 0 1 0 3
51
52 0 3 1 0 0 0 1 6
53
54 # 求解模型
55 max z = x0+14*x1+6*x2
56
57 s.t.
58
59 x0 + x1 + x2 <= 4
60
61 x0 <= 2
62
63 x2 <= 3
64
65 3*x1 + x2 <= 6

2. 在我的模型里面能用,不过显示比较繁琐,如果想要得到自己想要的,还需要在几个函数里面return

原链接:http://www.dataguru.cn/thread-909474-1-1.html

  1 Max z =  18*x1 + 12.5*x2
  2
  3 s.t. x1 + x2 +x3 = 20
  4
  5 x1 + x4 = 12
  6
  7 x2 + x5 = 16
  8
  9 x1,x2,x3,x4,x5 >= 0
 10
 11 运行下面脚本(单纯形法的Python实现)
 12
 13 import numpy as np
 14
 15 # 实体类 Table
 16 # 控制类 Simplex
 17
 18 class Table:
 19
 20     def __init__(self):
 21
 22         pass
 23
 24     def set_para(self,A,b,c,base,z0):
 25
 26         """
 27
 28         输入LP必须已经化为标准形式
 29
 30         """
 31
 32         self.A=A
 33
 34         self.b=b
 35
 36         self.c=c
 37
 38         self.z0=z0
 39
 40         self.base=base
 41
 42         self.m,self.n=self.A.shape
 43
 44     def build(self):
 45
 46         self.table=np.zeros((self.m+1,self.n+1))
 47
 48         self.table[:-1,:1]=self.b.T
 49
 50         self.table[-1 ,0]=self.z0
 51
 52         self.table[:-1,1:]=self.A
 53
 54         self.table[-1, 1:]=c
 55
 56         self.baseVar=base
 57
 58     def is_best(self):
 59
 60         for sigma_index in range(self.n):
 61
 62             if sigma_index not in self.baseVar:
 63
 64                 sigma=self.table[-1,1+sigma_index]
 65
 66                 if sigma>0:
 67
 68                     return False
 69
 70         return True
 71
 72     def is_no_solution(self):
 73
 74         for sigma_index in range(self.n):
 75
 76             if sigma_index not in self.baseVar:
 77
 78                 sigma=self.table[-1,1+sigma_index]
 79
 80                 if sigma>0:
 81
 82                     no_solution_flag=True
 83
 84                     for a in self.table[:-1,1+sigma_index]:
 85
 86                         if a>0:
 87
 88                             no_solution_flag=False
 89
 90                     if no_solution_flag==True:
 91
 92                         return True
 93
 94         return False
 95
 96     def get_inVar(self):
 97
 98         max_sigma=0
 99
100         inVar=None
101
102         for sigma_index in range(self.n):
103
104             if sigma_index not in self.baseVar:
105
106                 sigma=self.table[-1,1+sigma_index]
107
108                 if sigma>max_sigma:
109
110                     max_sigma=sigma
111
112                     inVar=sigma_index
113
114         return inVar
115
116
117     def get_outVar(self,inVar):
118
119         rates=[]
120
121         for nobaseVar in range(self.m):
122
123             a=self.table[nobaseVar,inVar+1]
124
125             b=self.table[nobaseVar,     0 ]
126
127             if a>0:
128
129                 rate=b/a
130
131                 rates.append((rate,nobaseVar))
132
133         return min(rates)[1]
134
135     def in_out(self,inVar,outVar):
136
137         a=self.table[outVar,inVar+1]
138
139         self.table[outVar,:]/=a
140
141         for i in range(self.m+1):
142
143             if i != outVar:
144
145                 self.table[i,:]-=self.table[outVar,:]*self.table[i,inVar+1]
146
147         self.baseVar[outVar]=inVar
148
149
150     def show(self):
151
152         print ('基变量/取值:',self.baseVar,end='/')
153
154         print (self.table[:-1,0])
155
156         print ("单纯形表")
157
158         for i in range(self.m+1):
159
160             for j in range(self.n+1):
161
162                 print ('%6.2f'%self.table[i,j],end=' ')
163
164             print ()
165
166         print ()
167
168 class Simplex:
169
170     def __init__(self):
171
172         self.table=Table()
173
174         # 0 正常,尚未得到最优解,继续迭代
175
176         # 1 无解,无界解
177
178         # 2 达到最优解
179
180         self.status=0
181
182         self.inVar=None
183
184         self.outVar=None
185
186     def set_para(self,A,b,c,base,z0=0):
187
188         self.table.set_para(A,b,c,base,z0)
189
190     def output_result(self):
191
192         self._main()
193
194         if self.status==1:
195
196             print("此问题无界")
197
198         elif self.status==2:
199
200             print("此问题有一个最优解")
201
202         elif self.status==3:
203
204             print("此问题有无穷多个最优解")
205
206     def _main(self):
207
208         self._build_table()
209
210         while 1:
211
212             self.table.show()
213
214             if self._is_best() or self._is_no_solution():
215
216                 return
217
218             self._get_inVar()
219
220             self._get_outVar()
221
222             self._in_out()
223
224     def _build_table(self):
225
226         self.table.build()
227
228     def _is_best(self):
229
230         if self.table.is_best():
231
232             self.status=2
233
234             return True
235
236         return False
237
238     def _is_no_solution(self):
239
240         if self.table.is_no_solution():
241
242             self.status=1
243
244             return True
245
246         return False
247
248
249     def _get_inVar(self):
250
251         self.inVar=self.table.get_inVar()
252
253
254     def _get_outVar(self):
255
256         self.outVar=self.table.get_outVar(self.inVar)
257
258
259     def _in_out(self):
260
261         self.table.in_out(self.inVar,self.outVar)
262
263
264
265 if __name__=="__main__":
266
267     s=Simplex()
268
269     A=np.matrix([[1,1,1,0,0],
270
271                  [ 1, 0,0,1,0],
272
273                  [ 0, 1,0,0,1]])
274
275     b=np.matrix([[20,12,16]])
276
277     c=np.matrix([[18,12.5,0,0,0]])
278
279     base=[2,3,4]
280
281     s.set_para(A,b,c,base)
282
283 s.output_result()
01-05 21:26