Advertisement
adwas33

Untitled

Mar 18th, 2023
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 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.  
  54. costs = profits.flatten()
  55. supply_constraints = np.hstack([np.eye(num_suppliers) for _ in range(num_consumers)])
  56. demand_constraints = np.hstack([np.eye(num_consumers) for _ in range(num_suppliers)])
  57.  
  58. A_eq = np.vstack([supply_constraints, demand_constraints])
  59. b_eq = np.concatenate([supply, demand])
  60.  
  61. try:
  62. res = linprog(-costs, A_eq=A_eq, b_eq=b_eq, method='highs')
  63. except Exception as e:
  64. self.display_results(f"Błąd podczas optymalizacji: {e}")
  65. return
  66.  
  67. if res.success:
  68. optimal_transfers = np.round(res.x.reshape(num_suppliers, num_consumers))
  69. total_cost = np.sum(optimal_transfers * transport_costs)
  70. total_revenue = np.sum(optimal_transfers * (sale_prices - purchase_prices.reshape(-1, 1)))
  71. total_profit = np.sum(optimal_transfers * profits)
  72.  
  73. results_text = (
  74. "Tabela zysków jednostkowych:\n" + str(profits) +
  75. "\n\nTabela optymalnych przewozów:\n" + str(optimal_transfers) +
  76. f"\n\nKoszt całkowity: {total_cost:.2f}" +
  77. f"\nPrzychód całkowity: {total_revenue:.2f}" +
  78. f"\nZysk pośrednika: {total_profit:.2f}"
  79. )
  80. self.display_results(results_text)
  81. else:
  82. self.display_results(f"Błąd podczas optymalizacji: {res.message}")
  83.  
  84.  
  85. if __name__ == "__main__":
  86. app = App()
  87. app.mainloop()
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement