Advertisement
adwas33

Untitled

Mar 27th, 2023
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. import tkinter as tk
  2. import numpy as np
  3. from scipy.optimize import linprog
  4.  
  5.  
  6. class App(tk.Tk):
  7. def __init__(self):
  8. super().__init__()
  9. self.title("Zagadnienie pośrednika")
  10.  
  11. tk.Label(self, text="Podaż (rozdelone przecinkami):").grid(row=0, column=0)
  12. self.supply_entry = tk.Entry(self)
  13. self.supply_entry.grid(row=0, column=1)
  14.  
  15. tk.Label(self, text="Popyt (rozdelone przecinkami):").grid(row=1, column=0)
  16. self.demand_entry = tk.Entry(self)
  17. self.demand_entry.grid(row=1, column=1)
  18.  
  19. tk.Label(self, text="Ceny zakupu (rozdelone przecinkami):").grid(row=2, column=0)
  20. self.purchase_prices_entry = tk.Entry(self)
  21. self.purchase_prices_entry.grid(row=2, column=1)
  22.  
  23. tk.Label(self, text="Ceny sprzedaży (rozdelone przecinkami):").grid(row=3, column=0)
  24. self.sale_prices_entry = tk.Entry(self)
  25. self.sale_prices_entry.grid(row=3, column=1)
  26.  
  27. tk.Label(self, text="Koszty transportu (rozdelone przecinkami):").grid(row=4, column=0)
  28. self.transport_costs_entry = tk.Entry(self)
  29. self.transport_costs_entry.grid(row=4, column=1)
  30.  
  31. self.calculate_button = tk.Button(self, text="Oblicz", command=self.calculate)
  32. self.calculate_button.grid(row=5, column=1, pady=10)
  33.  
  34. def display_results(self, results_text):
  35. results_window = tk.Toplevel(self)
  36. results_window.title("Wyniki")
  37. results_label = tk.Label(results_window, text=results_text, justify=tk.LEFT)
  38. results_label.pack(padx=20, pady=20)
  39.  
  40. def calculate(self):
  41. supply = np.array(list(map(float, self.supply_entry.get().split(','))))
  42. demand = np.array(list(map(float, self.demand_entry.get().split(','))))
  43. purchase_prices = np.array(list(map(float, self.purchase_prices_entry.get().split(','))))
  44. sale_prices = np.array(list(map(float, self.sale_prices_entry.get().split(','))))
  45. transport_costs = np.array(list(map(float, self.transport_costs_entry.get().split(','))))
  46.  
  47. num_suppliers = len(supply)
  48. num_consumers = len(demand)
  49.  
  50. transport_costs = transport_costs.reshape(num_suppliers, num_consumers)
  51. profits = sale_prices.reshape(1, -1) - purchase_prices.reshape(-1, 1) - transport_costs
  52.  
  53. costs = profits.flatten()
  54.  
  55. supply_constraints = np.zeros((num_suppliers, num_suppliers * num_consumers))
  56. for i in range(num_suppliers):
  57. supply_constraints[i, i::num_suppliers] = 1
  58.  
  59. demand_constraints = np.zeros((num_consumers, num_suppliers * num_consumers))
  60. for i in range(num_consumers):
  61. demand_constraints[i, i * num_suppliers:(i + 1) * num_suppliers] = 1
  62. A_eq = np.vstack([supply_constraints, demand_constraints])
  63. b_eq = np.concatenate([supply, demand])
  64.  
  65. try:
  66. res = linprog(-costs, A_eq=A_eq, b_eq=b_eq, method='highs')
  67. except Exception as e:
  68. self.display_results(f"Błąd podczas optymalizacji: {e}")
  69. print(e)
  70. return
  71.  
  72. if res.success:
  73. optimal_transfers = np.round(res.x.reshape(num_suppliers, num_consumers))
  74. total_cost = np.sum(optimal_transfers * transport_costs)
  75. total_revenue = np.sum(optimal_transfers * (sale_prices - purchase_prices.reshape(-1, 1)))
  76. total_profit = np.sum(optimal_transfers * profits)
  77.  
  78. results_text = (
  79. "Tabela zysków jednostkowych:\n" + str(profits) +
  80. "\n\nTabela optymalnych przewozów:\n" + str(optimal_transfers) +
  81. f"\n\nKoszt całkowity: {total_cost:.2f}" +
  82. f"\nPrzychód całkowity: {total_revenue:.2f}" +
  83. f"\nZysk pośrednika: {total_profit:.2f}"
  84. )
  85. self.display_results(results_text)
  86. else:
  87. self.display_results(f"Błąd podczas optymalizacji: {res.message}")
  88.  
  89.  
  90. if __name__ == "__main__":
  91. app = App()
  92. app.mainloop()
  93.  
  94.  
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement