Advertisement
jfabella

Untitled

Sep 20th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.63 KB | None | 0 0
  1. import sys
  2. from pprint import pprint
  3. import assignment_problem_min as apm
  4. import numpy as np
  5. from PyQt5.QtWidgets import *
  6. from PyQt5.uic import loadUiType
  7. from munkres import Munkres, print_matrix
  8. import subprocess
  9.  
  10. ui, _ = loadUiType('Hungarian.ui')
  11.  
  12.  
  13. class MainApp(QMainWindow, ui):
  14. def __init__(self):
  15. QMainWindow.__init__(self)
  16. self.setupUi(self)
  17. self.Handle_UI_Changes()
  18. self.Handle_Buttons()
  19.  
  20. def Handle_UI_Changes(self):
  21. self.tabWidget.tabBar().setVisible(False)
  22. self.tabWidget.setCurrentIndex(0)
  23. self.solutionOutput.setReadOnly(True)
  24. self.answerOutput.setReadOnly(True)
  25. self.solutionOutput_2.setReadOnly(True)
  26. self.answerOutput.setReadOnly(True)
  27.  
  28. def Handle_Buttons(self):
  29. self.configureAssignmentButton.clicked.connect(self.Handle_Matrices)
  30. self.refreshButton.clicked.connect(self.RefreshAction)
  31. self.backButton.clicked.connect(self.BackAction)
  32. self.playButton.clicked.connect(self.PlayAction)
  33. self.modifyButton.clicked.connect(self.ModifyButton)
  34. self.homeButton.clicked.connect(self.HomeButton)
  35. self.refreshButton_2.clicked.connect(self.RefreshAction_Max)
  36. self.backButton_2.clicked.connect(self.BackAction_Max)
  37. self.playButton_2.clicked.connect(self.PlayAction_Max)
  38. self.modifyButton_2.clicked.connect(self.ModifyButton_Max)
  39. self.homeButton_2.clicked.connect(self.HomeButton_Max)
  40.  
  41. def Handle_Matrices(self):
  42. temp = self.hungarianChooser.currentText()
  43. if temp == 'Minimization':
  44. self.CreateMatrix()
  45. else:
  46. self.CreateMatrix_Max()
  47.  
  48. # =----------------------------------------------------------------------MAXIMIZATION------------------------------------------------------#
  49. # ------------------------------------------------------------------------------------------------------------------------------------------#
  50. def CreateMatrix_Max(self):
  51. row_number = int(self.rowNumber.currentText()) + 1
  52. column_number = int(self.columnNumber.currentText()) + 1
  53.  
  54. self.matrixTable_2.setRowCount(row_number)
  55. self.matrixTable_2.setColumnCount(column_number)
  56.  
  57. for i in range(1, row_number):
  58. for j in range(1, column_number):
  59. self.matrixTable_2.setItem(i, j, QTableWidgetItem('0'))
  60.  
  61. for i in range(1, column_number):
  62. self.matrixTable_2.setItem(0, i, QTableWidgetItem('job ' + str(i)))
  63.  
  64. for i in range(1, row_number):
  65. self.matrixTable_2.setItem(i, 0, QTableWidgetItem('name ' + str(i)))
  66.  
  67. self.tabWidget.setCurrentIndex(3)
  68.  
  69. def RefreshAction_Max(self):
  70. self.CreateMatrix_Max()
  71.  
  72. def BackAction_Max(self):
  73. self.tabWidget.setCurrentIndex(0)
  74. self.rowNumber.setCurrentIndex(0)
  75. self.columnNumber.setCurrentIndex(0)
  76.  
  77. def PlayAction_Max(self):
  78. print("PlayAction po")
  79. self.AssignmentProblemMax()
  80. self.tabWidget.setCurrentIndex(4)
  81.  
  82. def HomeButton_Max(self):
  83. self.tabWidget.setCurrentIndex(0)
  84.  
  85. def ModifyButton_Max(self):
  86. self.tabWidget.setCurrentIndex(3)
  87.  
  88. def AssignmentProblemMax(self):
  89. print('Hello Po')
  90. arr = []
  91. numberOfRows = int(self.rowNumber.currentText())
  92. numberOfColumns = int(self.columnNumber.currentText())
  93.  
  94. for i in range(1, numberOfRows + 1):
  95. for j in range(1, numberOfColumns + 1):
  96. arr.append(int(self.matrixTable_2.item(i, j).text()))
  97.  
  98. stringRows = []
  99. stringCol = []
  100.  
  101. for i in range(1, numberOfRows + 1):
  102. stringRows.append(self.matrixTable_2.item(i, 0).text())
  103.  
  104. for i in range(1, numberOfColumns + 1):
  105. stringCol.append(self.matrixTable_2.item(0, i).text())
  106.  
  107. np_arr = np.array(arr)
  108. np_arr = np_arr.reshape(numberOfRows, numberOfColumns)
  109.  
  110. np_arr_2 = np.array(arr)
  111. np_arr_2 = np_arr_2.reshape(numberOfRows,numberOfColumns)
  112.  
  113. #########################The Solution##############################
  114.  
  115. theSolution = "THE SOLUTION : \n"
  116. # Creating Temporary array of zeros
  117. temp_arr = np.zeros(numberOfRows * numberOfColumns, dtype=int)
  118. temp_arr = temp_arr.reshape(numberOfRows, numberOfColumns)
  119. #
  120. temp_arr_2 = np.zeros(numberOfRows * numberOfColumns, dtype=int)
  121. temp_arr_2 = temp_arr_2.reshape(numberOfRows, numberOfColumns)
  122. np.place(temp_arr_2, temp_arr_2 == 0, 1)
  123.  
  124. temp_arr = np.invert(np_arr_2) + temp_arr_2
  125.  
  126. theSolution += "Negate all values : \n"
  127. theSolution += "Because the objective is to maximize the total cost we negate all elements:\n"
  128. theSolution += str(temp_arr) + '\n'
  129. theSolution += '\n'
  130.  
  131. temp_arr_2 = np.zeros(numberOfRows * numberOfColumns, dtype=int)
  132. temp_arr_2 = temp_arr_2.reshape(numberOfRows, numberOfColumns)
  133.  
  134. theSolution += "Make the Matrix non negative\n"
  135. theSolution += "we add the maximum value to each entry to make the cost matrix non negative:\n"
  136. maxNumber = np.amax(np_arr_2)
  137.  
  138. for i in range(0, numberOfColumns):
  139. temp_arr_2[:, i] = maxNumber
  140.  
  141. temp_arr = temp_arr + temp_arr_2
  142. theSolution += str(temp_arr) + '\n'
  143.  
  144. theSolution += '\n'
  145. theSolution += "Subtract Minimum Row Values\n"
  146.  
  147. temp_arr_2 = np.zeros(numberOfRows * numberOfColumns, dtype=int)
  148. temp_arr_2 = temp_arr_2.reshape(numberOfRows, numberOfColumns)
  149.  
  150. row_minima = np.amin(temp_arr, axis=1)
  151.  
  152. for i in range(0, len(row_minima)):
  153. temp_arr_2[i, :] = row_minima[i]
  154.  
  155. temp_arr = temp_arr - temp_arr_2
  156. theSolution += str(temp_arr) + '\n'
  157.  
  158. theSolution += '\n'
  159. theSolution += "Subtract Minimum Column Values" + '\n'
  160.  
  161. temp_arr_2 = np.zeros(numberOfRows * numberOfColumns, dtype=int)
  162. temp_arr_2 = temp_arr_2.reshape(numberOfRows, numberOfColumns)
  163.  
  164. col_minima = np.amin(temp_arr, axis=0)
  165.  
  166. for i in range(0, len(col_minima)):
  167. temp_arr_2[:, i] = col_minima[i]
  168.  
  169. temp_arr = temp_arr - temp_arr_2
  170. theSolution += str(temp_arr) + '\n'
  171. theSolution += "\nCover all zeros with a minimum number of lines\n"
  172. theSolution += "Create Additional zeros\n"
  173.  
  174.  
  175.  
  176.  
  177. ###################################################################
  178. matrix = np_arr
  179.  
  180. cost_matrix = []
  181. for row in matrix:
  182. cost_row = []
  183. for col in row:
  184. cost_row += [sys.maxsize - col]
  185. cost_matrix += [cost_row]
  186.  
  187. m = Munkres()
  188. indexes = m.compute(cost_matrix)
  189. theOriginalMatrix = 'THE ORIGINAL MATRIX\n'
  190. theOriginalMatrix += str(matrix) + '\n'
  191. theOriginalMatrix += '\n'
  192. theFinalAnswer = 'Highest profit through this matrix:\n'
  193. theFinalAnswer += str(matrix) + '\n'
  194. theFinalAnswer += '\n'
  195. total = 0
  196.  
  197. theFinalAnswer += 'Index of Each Row and Column in the Matrix\n'
  198. for row, column in indexes:
  199. value = matrix[row][column]
  200. total += value
  201. theFinalAnswer += ('(%d, %d) -> %d' % (row, column, value))
  202. theFinalAnswer += '\n'
  203.  
  204. theFinalAnswer += '\nAssigned Values: \n'
  205. for row, column in indexes:
  206. theFinalAnswer += stringRows[row] + ' is assigned to ' + stringCol[column]
  207. theFinalAnswer += '\n'
  208.  
  209. theFinalAnswer += '\n'
  210. theFinalAnswer += ('total profit=%d' % total)
  211.  
  212. self.answerOutput_2.setText(theFinalAnswer)
  213.  
  214. self.solutionOutput_2.setText(theOriginalMatrix + '\n' + theSolution +'\n' + theFinalAnswer)
  215.  
  216.  
  217.  
  218.  
  219. # =----------------------------------------------------------------------MINIMIZATION------------------------------------------------------#
  220. # ------------------------------------------------------------------------------------------------------------------------------------------#
  221. def CreateMatrix(self):
  222. outfile = open("data.jnfljc", "w")
  223. outfile.write("")
  224. outfile.close()
  225.  
  226. row_number = int(self.rowNumber.currentText()) + 1
  227. column_number = int(self.columnNumber.currentText()) + 1
  228.  
  229. self.matrixTable.setRowCount(row_number)
  230. self.matrixTable.setColumnCount(column_number)
  231.  
  232. for i in range(1, row_number):
  233. for j in range(1, column_number):
  234. self.matrixTable.setItem(i, j, QTableWidgetItem('0'))
  235.  
  236. for i in range(1, column_number):
  237. self.matrixTable.setItem(0, i, QTableWidgetItem('job ' + str(i)))
  238.  
  239. for i in range(1, row_number):
  240. self.matrixTable.setItem(i, 0, QTableWidgetItem('name ' + str(i)))
  241.  
  242. self.tabWidget.setCurrentIndex(1)
  243.  
  244. def RefreshAction(self):
  245. self.CreateMatrix()
  246.  
  247. def BackAction(self):
  248. self.tabWidget.setCurrentIndex(0)
  249. self.rowNumber.setCurrentIndex(0)
  250. self.columnNumber.setCurrentIndex(0)
  251.  
  252. def PlayAction(self):
  253. self.tabWidget.setCurrentIndex(2)
  254. self.AssignmentProblemMin()
  255.  
  256. def HomeButton(self):
  257. self.tabWidget.setCurrentIndex(0)
  258.  
  259. def ModifyButton(self):
  260. outfile = open("data.jnfljc", "w")
  261. outfile.write("")
  262. outfile.close()
  263. self.tabWidget.setCurrentIndex(1)
  264.  
  265. def AssignmentProblemMin(self):
  266. arr = []
  267. numberOfRows = int(self.rowNumber.currentText())
  268. numberOfColumns = int(self.columnNumber.currentText())
  269.  
  270. for i in range(1, numberOfRows + 1):
  271. for j in range(1, numberOfColumns + 1):
  272. arr.append(int(self.matrixTable.item(i, j).text()))
  273.  
  274. np_arr = np.array(arr)
  275. np_arr = np_arr.reshape(numberOfRows, numberOfColumns)
  276.  
  277. np_arr2 = np.array(arr)
  278. np_arr2 = np_arr2.reshape(numberOfRows, numberOfColumns)
  279.  
  280. theOriginalMatrix = ''
  281. theOriginalMatrix += 'THE ORIGINAL MATRIX\n'
  282. theOriginalMatrix += str(np_arr)
  283. theOriginalMatrix += '\n'
  284.  
  285. stringRows = []
  286. stringCol = []
  287.  
  288. for i in range(1, numberOfRows + 1):
  289. stringRows.append(self.matrixTable.item(i, 0).text())
  290.  
  291. for i in range(1, numberOfColumns + 1):
  292. stringCol.append(self.matrixTable.item(0, i).text())
  293.  
  294. theSolution = "\nTHE SOLUTION\n"
  295.  
  296. if (numberOfRows > numberOfColumns):
  297. temp_arr = np_arr2
  298. theSolution += '\n'
  299. theSolution += "Subtract Minimum Row Values\n"
  300.  
  301. temp_arr_2 = np.zeros(numberOfRows * numberOfColumns, dtype=int)
  302. temp_arr_2 = temp_arr_2.reshape(numberOfRows, numberOfColumns)
  303.  
  304. row_minima = np.amin(temp_arr, axis=1)
  305.  
  306. for i in range(0, len(row_minima)):
  307. temp_arr_2[i, :] = row_minima[i]
  308.  
  309. temp_arr = temp_arr - temp_arr_2
  310. theSolution += str(temp_arr) + '\n'
  311.  
  312. theSolution += '\n'
  313. theSolution += "Subtract Minimum Column Values" + '\n'
  314.  
  315. temp_arr_2 = np.zeros(numberOfRows * numberOfColumns, dtype=int)
  316. temp_arr_2 = temp_arr_2.reshape(numberOfRows, numberOfColumns)
  317.  
  318. col_minima = np.amin(temp_arr, axis=0)
  319.  
  320. for i in range(0, len(col_minima)):
  321. temp_arr_2[:, i] = col_minima[i]
  322.  
  323. temp_arr = temp_arr - temp_arr_2
  324. theSolution += str(temp_arr) + '\n'
  325. theSolution += "\nCover all zeros with a minimum number of lines\n"
  326. theSolution += "Create Additional zeros\n"
  327. else:
  328. tempText = apm.hungarianMethod(np_arr)
  329.  
  330. from scipy.optimize import linear_sum_assignment
  331. row_ind, col_ind = linear_sum_assignment(np_arr)
  332.  
  333. theFinalAnswer = ''
  334.  
  335. theFinalAnswer += "The Original Array is : \n"
  336. theFinalAnswer += str(np_arr2) + '\n'
  337. theFinalAnswer += "\nIndex of each row and column in the matrix and value\n"
  338. for i in range(0, len(row_ind)):
  339. theFinalAnswer += '(' + str(row_ind[i]) + ', ' + str(col_ind[i]) + ')' + ' --> ' + str(
  340. np_arr2[row_ind[i]][col_ind[i]]) + '\n'
  341. theFinalAnswer += '\n'
  342.  
  343. theFinalAnswer += 'Assigned Values: \n'
  344.  
  345. optimal_value = 0
  346.  
  347. for i in range(0, len(row_ind)):
  348. theFinalAnswer += stringRows[row_ind[i]] + ' is assigned to ' + stringCol[col_ind[i]] + '\n'
  349. optimal_value += int(np_arr2[row_ind[i]][col_ind[i]])
  350. # print(str(row_ind[i]) + ' ' + str(col_ind[i]))
  351. # print(np_arr2)
  352. # print(optimal_value)
  353.  
  354. theFinalAnswer += '\n' + 'The Optimal Value is: ' + str(optimal_value)
  355.  
  356. # the solution from our data.jnfljc
  357. theSolutionArr = []
  358. with open("data.jnfljc") as file:
  359. for line in file:
  360. line = line.replace("\n", "")
  361. theSolutionArr.append(line)
  362.  
  363.  
  364.  
  365. for i in theSolutionArr:
  366. theSolution += i + '\n'
  367.  
  368. theSolution += '\n'
  369. theWholeText = ''
  370. theWholeText += theOriginalMatrix
  371. theWholeText += theSolution
  372. theWholeText += theFinalAnswer
  373.  
  374. self.solutionOutput.setText(theWholeText)
  375. self.answerOutput.setText(theFinalAnswer)
  376.  
  377.  
  378. ################################################################################################################################################
  379.  
  380.  
  381. def main():
  382. app = QApplication(sys.argv)
  383. window = MainApp()
  384. window.show()
  385. app.exec_()
  386.  
  387.  
  388. if __name__ == '__main__':
  389. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement