-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackpack.py
More file actions
149 lines (116 loc) · 5.7 KB
/
Copy pathbackpack.py
File metadata and controls
149 lines (116 loc) · 5.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import tkinter as tk
from tkinter import messagebox
import json
from datetime import datetime
# Функция для добавления решений в файл
def recording_the_solution(task_type, backpack_weight, number_of_items, answer, items):
solution = {
"task_type": task_type,
"backpack_weight": backpack_weight,
"number_of_items": number_of_items,
"answer": answer,
"items": items,
"date_time": datetime.now().isoformat()
}
# Запись решения в файл
with open("solutions.json", "a") as f:
f.write(json.dumps(solution) + "\n")
# Функция для решения задачи о рюкзаке
def backpack_solver(capacity, weights, values, n):
K = [[0 for x in range(capacity + 1)] for x in range(n + 1)]
for i in range(n + 1):
for w in range(capacity + 1):
if i == 0 or w == 0:
K[i][w] = 0
elif weights[i - 1] <= w:
K[i][w] = max(values[i - 1] + K[i - 1][w - weights[i - 1]], K[i - 1][w])
else:
K[i][w] = K[i - 1][w]
res = K[n][capacity]
w = capacity
items_in_backpack = []
for i in range(n, 0, -1):
if res <= 0:
break
if res == K[i - 1][w]:
continue
else:
items_in_backpack.append(i - 1)
res = res - values[i - 1]
w = w - weights[i - 1]
return K[n][capacity], items_in_backpack
# Функция для задачи плотной упаковки рюкзака
def dense_pack_backpack(capacity, weights, n):
index_weights = list(range(n))
index_weights.sort(key=lambda x: weights[x])
total_weight = 0
items_in_backpack = []
for i in index_weights:
if total_weight + weights[i] <= capacity:
total_weight += weights[i]
items_in_backpack.append(i)
return total_weight, items_in_backpack
# Основной класс приложения
class BackpackApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("Backpack1 Problem Solver")
self.geometry("600x400")
self.create_widgets()
def create_widgets(self):
self.choice_var = tk.StringVar(value="backpack")
self.backpack_radio = tk.Radiobutton(self, text="Maximize Value", variable=self.choice_var, value="backpack")
self.backpack_radio.pack()
self.dense_pack_radio = tk.Radiobutton(self, text="Maximize Density", variable=self.choice_var, value="dense_pack")
self.dense_pack_radio.pack()
self.label1 = tk.Label(self, text="Введите вес рюкзака:")
self.label1.pack()
self.bag_weight = tk.Entry(self)
self.bag_weight.pack()
self.item_count_label = tk.Label(self, text="Количество предметов:")
self.item_count_label.pack()
self.item_count = tk.Entry(self)
self.item_count.pack()
self.item_weight_label = tk.Label(self, text="Введите веса предметов через запятую:")
self.item_weight_label.pack()
self.item_weight = tk.Entry(self)
self.item_weight.pack()
self.item_value_label = tk.Label(self, text="Введите ценности предметов через запятую:")
self.item_value_label.pack()
self.item_value = tk.Entry(self)
self.item_value.pack()
self.solve_button = tk.Button(self, text="Получить решение", command=self.get_solution)
self.solve_button.pack()
self.result_text = tk.Text(self, height=10)
self.result_text.pack()
self.quit_button = tk.Button(self, text="Выход", command=self.quit)
self.quit_button.pack()
def get_solution(self, e=None):
global result
try:
task_type = self.choice_var.get()
weight = int(self.bag_weight.get())
if weight < 0:
messagebox.showerror("Ошибка ввода", str(e))
count = int(self.item_count.get())
weights = list(map(int, self.item_weight.get().split(',')))
if task_type == "backpack":
values = list(map(int, self.item_value.get().split(',')))
if len(weights) != count or len(values) != count:
raise ValueError("Количество предметов не совпадает с введенными данными.")
result_value, items_used = backpack_solver(weight, weights, values, count)
result = f"Максимальная ценность рюкзака: {result_value}. Предметы: {items_used}."
recording_the_solution("Backpack", weight, count, result_value, json.dumps(items_used))
elif task_type == "dense_pack":
if len(weights) != count:
raise ValueError("Количество предметов не совпадает с введенными данными.")
total_weight, items_used = dense_pack_backpack(weight, weights, count)
result = f"Заполненный вес рюкзака: {total_weight}. Предметы: {items_used}."
recording_the_solution("Dense Pack", weight, count, total_weight, json.dumps(items_used))
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, result)
except ValueError as e:
messagebox.showerror("Ошибка ввода", str(e))
if __name__ == "__main__":
app = BackpackApp()
app.mainloop()