Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -7,6 +7,9 @@ import numpy as np
|
|
| 7 |
|
| 8 |
# Algoritma Held-Karp untuk TSP
|
| 9 |
def held_karp_tsp(dist_matrix):
|
|
|
|
|
|
|
|
|
|
| 10 |
n = len(dist_matrix)
|
| 11 |
inf = float('inf')
|
| 12 |
memo = {}
|
|
@@ -70,12 +73,14 @@ def get_coordinates(city_name):
|
|
| 70 |
def create_distance_matrix(coordinates):
|
| 71 |
valid_coordinates = [c for c in coordinates if c is not None]
|
| 72 |
n = len(valid_coordinates)
|
|
|
|
|
|
|
| 73 |
dist_matrix = np.zeros((n, n))
|
| 74 |
for i in range(n):
|
| 75 |
for j in range(i + 1, n):
|
| 76 |
dist_matrix[i][j] = geodesic(valid_coordinates[i], valid_coordinates[j]).kilometers
|
| 77 |
dist_matrix[j][i] = dist_matrix[i][j]
|
| 78 |
-
return dist_matrix
|
| 79 |
|
| 80 |
# Fungsi untuk menampilkan peta rute
|
| 81 |
def plot_route(map_obj, coordinates, route):
|
|
@@ -98,19 +103,22 @@ st.title("Traveling Salesman Problem Solver")
|
|
| 98 |
st.subheader("Pilih Kota")
|
| 99 |
city_count = st.number_input("Jumlah kota", min_value=2, step=1)
|
| 100 |
city_names = []
|
|
|
|
| 101 |
for i in range(int(city_count)):
|
| 102 |
city_name = st.text_input(f"Kota {i+1}", key=f"city_{i}")
|
| 103 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
|
| 105 |
if st.button("Optimasi Rute"):
|
| 106 |
-
|
| 107 |
-
valid_coordinates = [c for c in coordinates if c is not None]
|
| 108 |
|
| 109 |
if len(valid_coordinates) < 2:
|
| 110 |
-
st.error("
|
| 111 |
else:
|
| 112 |
-
#
|
| 113 |
-
dist_matrix = create_distance_matrix(valid_coordinates)
|
| 114 |
min_cost, optimal_route = held_karp_tsp(dist_matrix)
|
| 115 |
|
| 116 |
# Tampilkan hasil
|
|
|
|
| 7 |
|
| 8 |
# Algoritma Held-Karp untuk TSP
|
| 9 |
def held_karp_tsp(dist_matrix):
|
| 10 |
+
if len(dist_matrix) < 2:
|
| 11 |
+
return 0, []
|
| 12 |
+
|
| 13 |
n = len(dist_matrix)
|
| 14 |
inf = float('inf')
|
| 15 |
memo = {}
|
|
|
|
| 73 |
def create_distance_matrix(coordinates):
|
| 74 |
valid_coordinates = [c for c in coordinates if c is not None]
|
| 75 |
n = len(valid_coordinates)
|
| 76 |
+
if n < 2:
|
| 77 |
+
return [], []
|
| 78 |
dist_matrix = np.zeros((n, n))
|
| 79 |
for i in range(n):
|
| 80 |
for j in range(i + 1, n):
|
| 81 |
dist_matrix[i][j] = geodesic(valid_coordinates[i], valid_coordinates[j]).kilometers
|
| 82 |
dist_matrix[j][i] = dist_matrix[i][j]
|
| 83 |
+
return dist_matrix, valid_coordinates
|
| 84 |
|
| 85 |
# Fungsi untuk menampilkan peta rute
|
| 86 |
def plot_route(map_obj, coordinates, route):
|
|
|
|
| 103 |
st.subheader("Pilih Kota")
|
| 104 |
city_count = st.number_input("Jumlah kota", min_value=2, step=1)
|
| 105 |
city_names = []
|
| 106 |
+
city_coords = []
|
| 107 |
for i in range(int(city_count)):
|
| 108 |
city_name = st.text_input(f"Kota {i+1}", key=f"city_{i}")
|
| 109 |
+
city_coords.append(get_coordinates(city_name))
|
| 110 |
+
if city_coords[-1] is None:
|
| 111 |
+
st.warning(f"Kota '{city_name}' tidak ditemukan. Harap periksa ejaan dan coba lagi.")
|
| 112 |
+
else:
|
| 113 |
+
city_names.append(city_name)
|
| 114 |
|
| 115 |
if st.button("Optimasi Rute"):
|
| 116 |
+
dist_matrix, valid_coordinates = create_distance_matrix(city_coords)
|
|
|
|
| 117 |
|
| 118 |
if len(valid_coordinates) < 2:
|
| 119 |
+
st.error("Tidak cukup kota yang valid untuk dioptimalkan.")
|
| 120 |
else:
|
| 121 |
+
# Hitung rute optimal
|
|
|
|
| 122 |
min_cost, optimal_route = held_karp_tsp(dist_matrix)
|
| 123 |
|
| 124 |
# Tampilkan hasil
|