#!/usr/bin/python3
# coding=utf8
import tkinter
from tkinter import *
from math import factorial
from matplotlib import pyplot as plt
import numpy as np
from scipy.interpolate import spline
# Функция рассчитывает p0
def calc_p0(s, m, ro):
p0 = 0
for i in range(0, s):
p0 += (ro ** i) / factorial(i)
p0 = 1 / (p0 + (ro ** (s + 1)) / (factorial(s) * s) * ((1 - ((ro / s) ** m)) / (1 - (ro / s))))
return p0
# Функция рассчитывает вероятность занятости k печей
def calc_p_k(k, s, ro):
p0 = calc_p0(s, (s - k), ro)
if k <= s:
p_k = (p0 * (ro ** k)) / factorial(k)
else:
p_k = (p0 * (ro ** k)) / (factorial(s) * (s ** (k - s)))
return p_k
# Функция рассчитывает среднее число свободных печей
def calc_m2(k, s, ro):
m2 = 0
p0 = calc_p0(s, (s - k), ro)
for i in range(0, s):
m2 += ((s - i) * (ro ** i) * p0) / factorial(i)
return m2
# Функция рассчитывает совокупные затраты порта при заданных значениях
def calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, k):
p0 = calc_p0(s, m, ro)
avg_queue = p0 * ((ro**(s+1)) / (s * factorial(s))) * ((1-((ro/s)**m) * (m + 1 - m * (ro/s))) / ((1-(ro/s))**2))
m1 = avg_queue
m2 = calc_m2(k, s, ro)
p_k = calc_p_k(k, s, ro)
cost = e * c1 * k + c2 * (s - m2) * t + c3 * m2 * t + c5 * t * lmbd * p_k + c4 * m1 * t
return cost
def calculate(lmbd, mu, e, c1, c2, c3, c4, c5, t, s, smooth):
lmbd = lmbd.get()
mu = mu.get()
e = e.get()
c1 = c1.get()
c2 = c2.get()
c3 = c3.get()
c4 = c4.get()
c5 = c5.get()
t = t.get()
s = s.get()
# Считаем приведенную интенсивность (ро)
ro = lmbd / mu
cost_arr = []
x_axis = []
for i in range(1, s):
m = s - i
cost = calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, i)
x_axis.append(i)
cost_arr.append(cost)
# Вычисляем оптимальное количество печей - индекс в массиве стоимостей с наименьшим членом массива
opt_furnace_num = cost_arr.index(min(cost_arr)) + 1
# Строим график зависимости затрат порта от количества причалов при заданных значениях
plt.subplots(num="График №1", figsize=(10, 10), dpi=80)
plt.title("Зависимость затрат от соотношения назначения печей")
xnew = np.linspace(min(x_axis), max(x_axis), (len(x_axis) * 100))
y_smooth = spline(x_axis, cost_arr, xnew)
y_axis = cost_arr
if smooth.get() == 1:
x_axis = xnew
y_axis = y_smooth
line_red, = plt.plot(x_axis, y_axis, "r--", lw=1, linestyle="-", label="затраты, руб")
plt.legend(handles=[line_red])
window = Tk()
window.geometry("300x50")
window.title("Результаты рассчетов")
text = "Оптимальное количество печей:"
w = Message(window, text=text, width=500)
w.config(font=("times", 14))
w.grid(row=0, column=0, sticky="w")
text = round(opt_furnace_num)
w = Message(window, text=text, width=500)
w.config(font=("times", 14, "bold"))
w.grid(row=0, column=1, sticky="w" + "e")
plt.show()
# Создаем окно для ввода данных
root = Tk()
root.title("Лабораторная работа № 6. ТМО.")
input_intensity = DoubleVar()
input_intensity.set(10)
input_intensity_label = Label(text="Интенсивность прихода слитокв (шт/сут):")
input_intensity_label.grid(sticky="w")
input_intensity_entry = Entry(textvariable=input_intensity)
input_intensity_entry.grid(row=0, column=1)
output_intensity = DoubleVar()
output_intensity.set(2)
output_intensity_label = Label(text="Интенсивность нагрева слитков перед ковкой (шт/сут):")
output_intensity_label.grid(sticky="w")
output_intensity_entry = Entry(textvariable=output_intensity)
output_intensity_entry.grid(row=1, column=1)
capital_efficiency_ratio = DoubleVar()
capital_efficiency_ratio.set(0.15)
capital_efficiency_ratio_label = Label(text="Коэффициент эффективности капитоловложений (руб/год):")
capital_efficiency_ratio_label.grid(sticky="w")
capital_efficiency_ratio_entry = Entry(textvariable=capital_efficiency_ratio)
capital_efficiency_ratio_entry.grid(row=2, column=1)
furnace_cost = DoubleVar()
furnace_cost.set(100000)
furnace_cost_label = Label(text="Цена одной печи (руб):")
furnace_cost_label.grid(sticky="w")
furnace_cost_entry = Entry(textvariable=furnace_cost)
furnace_cost_entry.grid(row=3, column=1)
furnace_keep_cost = DoubleVar()
furnace_keep_cost.set(50)
furnace_keep_cost_label = Label(text="Цена содержания одной печи (руб):")
furnace_keep_cost_label.grid(sticky="w")
furnace_keep_cost_entry = Entry(textvariable=furnace_keep_cost)
furnace_keep_cost_entry.grid(row=4, column=1)
furnace_keep_downtime_cost = DoubleVar()
furnace_keep_downtime_cost.set(30)
furnace_keep_downtime_cost_label = Label(text="Цена содержания одной печи в простое (руб):")
furnace_keep_downtime_cost_label.grid(sticky="w")
furnace_keep_downtime_cost_entry = Entry(textvariable=furnace_keep_downtime_cost)
furnace_keep_downtime_cost_entry.grid(row=5, column=1)
queue_cost = DoubleVar()
queue_cost.set(60)
queue_cost_label = Label(text="Затраты на содержание слитка в копильнике (руб/сут):")
queue_cost_label.grid(sticky="w")
queue_cost_entry = Entry(textvariable=queue_cost)
queue_cost_entry.grid(row=6, column=1)
heat_cost = DoubleVar()
heat_cost.set(1600)
heat_cost_label = Label(text="Затраты на разогрев отосланных на склад слитков (руб/сут):")
heat_cost_label.grid(sticky="w")
heat_cost_entry = Entry(textvariable=heat_cost)
heat_cost_entry.grid(row=7, column=1)
year_worktime_fund = DoubleVar()
year_worktime_fund.set(365)
year_worktime_fund_label = Label(text="Годовой фонд рабочего врмени (сут):")
year_worktime_fund_label.grid(sticky="w")
year_worktime_fund_entry = Entry(textvariable=year_worktime_fund)
year_worktime_fund_entry.grid(row=8, column=1)
furnace_max = IntVar()
furnace_max.set(10)
furnace_max_label = Label(text="Максимальное количество печей (шт):")
furnace_max_label.grid(sticky="w")
furnace_max_entry = Entry(textvariable=furnace_max)
furnace_max_entry.grid(row=9, column=1)
image = PhotoImage(file="tusur3_100x100.png")
label = Label(image=image)
label.image = image
label.grid(row=0, column=2, columnspan=2, rowspan=10, sticky="w" + "e" + "n" + "s", padx=5, pady=5)
smooth_flag = IntVar()
smooth_flag.set(1)
check_button = Checkbutton(text="Сглаживание графиков", variable=smooth_flag, onvalue=1, offvalue=0)
check_button.grid(row=11, column=0, sticky="w")
message_button = Button(text="Рассчитать",
command=lambda: calculate(input_intensity, output_intensity, capital_efficiency_ratio,
furnace_cost, furnace_keep_cost, furnace_keep_downtime_cost,
queue_cost, heat_cost, year_worktime_fund, furnace_max, smooth_flag))
message_button.grid(row=11, column=2, padx=5, pady=5, sticky="e")
ico = tkinter.Image("photo", file="tusur2.png")
root.iconphoto(root, ico)
root.mainloop()
вот, хочется сделать правильно с точки зрения качества кода, чтобы потом знать как писать продакшн код, поэтому буду рад услышать любые замечания, дополнения, критику