Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from fractions import Fraction
  3. from itertools import count, izip
  4. print_width = 5 #увеличить если дроби не будут влезать
  5. m = 3 #количество уравнений
  6. n = 5 #количество переменных
  7. basis = [3,4,5] #номера базисных переменных (считаются с единицы)
  8. C = [2, 3, 0, 0, 0] #коеффициенты целевой функции
  9. table = [[-1, -5, 1, 0, 0, -16], #сама симплекс-таблица,
  10. [-3, -2, 0, 1, 0, -12], #должна быть в почти-каноничной форме
  11. [-2, -4, 0, 0, 1, -16]] #и с уже найденным опорным базисом
  12. #поехали, епт
  13.  
  14. table = [[Fraction(x) for x in row] for row in table]
  15. C = [Fraction(x) for x in C]
  16. basis = [x-1 for x in basis]
  17.  
  18. def pretty_print(matrix,basis):
  19. width = print_width
  20. print "Cb".rjust(width),"Xb".rjust(width)," ".join(("x%d"%(i+1)).rjust(width) for i in xrange(n)),"bt".rjust(width)
  21. for line in zip(basis,matrix):
  22. (xb,row) = line
  23. print str(C[xb]).rjust(width),("x%d"%(xb+1)).rjust(width),
  24. for elem in row:
  25. print str(elem).rjust(width),
  26. print ""
  27. def pretty_print2(name,array):
  28. width = print_width
  29. print "%s is: %s"%(name," ".join(str(x).rjust(width) for x in array).strip())
  30.  
  31. def make_basis(matrix,r,c):
  32. (h,w) = (m,n+1)
  33. b_row = matrix[r]
  34. newb = b_row[c]
  35. for i in xrange(w):
  36. b_row[i] /= newb
  37. for i,row in enumerate(matrix):
  38. if i!=r:
  39. if row[c]!=0:
  40. multiplier = row[c]
  41. for j in xrange(w):
  42. row[j] = row[j] - multiplier*b_row[j]
  43. iteration = 1
  44. while True:
  45. print "###ITERATION %d###" %iteration
  46. pretty_print(table,basis)
  47. rowmin,out_basis = min(izip(table, count()),key=lambda x:x[0][-1])
  48. delta = [(C[i] - sum(C[basis[j]]*table[j][i] for j in xrange(m))) for i in xrange(n)]
  49. pretty_print2("\nDelta", delta)
  50. deltamin = min(delta)
  51. if deltamin>=0:
  52. if rowmin[-1]>=0:
  53. print "All delta are positive and so are betta, plan is optimal!"
  54. break
  55. else:
  56. print "Getting x%d out of basis"%(basis[out_basis]+1)
  57. else:
  58. print "Another Whoops"
  59. gamma = [(-1 if rowmin[i]>=0 else abs(delta[i]/rowmin[i])) for i in xrange(n)]
  60. pretty_print2("Gamma", gamma)
  61. in_basis = -1
  62. min_gamma = None
  63. for i,val in enumerate(gamma):
  64. if val!=-1:
  65. if min_gamma is None:
  66. min_gamma = val
  67. in_basis = i
  68. elif val<min_gamma:
  69. min_gamma = val
  70. in_basis = i
  71. if in_basis==-1:
  72. print "Unlimited probably, no solution"
  73. break
  74. print "Inserting x%d into basis"%(in_basis+1)
  75. basis[out_basis] = in_basis
  76. make_basis(table,out_basis,in_basis)
  77. iteration = iteration+1
  78. raw_input("Oh noes")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement