From 348d616411c2c3eada32d49638de43858073a025 Mon Sep 17 00:00:00 2001 From: Aaryadotpy <91911418+AaryaNale@users.noreply.github.com> Date: Sat, 14 Oct 2023 12:53:21 +0530 Subject: [PATCH 1/5] Create traveling_salesman.py Added code --- src/python/traveling_salesman.py | 150 +++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 src/python/traveling_salesman.py diff --git a/src/python/traveling_salesman.py b/src/python/traveling_salesman.py new file mode 100644 index 00000000..856dcbe6 --- /dev/null +++ b/src/python/traveling_salesman.py @@ -0,0 +1,150 @@ +from itertools import permutations + +def calculate_total_distance(path, distances): + """ + Calculate the total distance of a path through cities. + + Args: + path (list of int): A list representing the order of cities to visit. + distances (list of lists of int): A distance matrix between cities. + + Returns: + int: The total distance of the path. + + Example: + >>> distances = [[0, 2, 9, 10], [1, 0, 6, 4], [15, 7, 0, 8], [6, 3, 12, 0]] + >>> calculate_total_distance([0, 1, 2, 3, 0], distances) + 21 + """ + total_distance = 0 + for i in range(len(path) - 1): + total_distance += distances[path[i]][path[i + 1]] + total_distance += distances[path[-1]][path[0]] + return total_distance + +def traveling_salesman_bruteforce(distances): + """ + Find the shortest path through cities using brute force. + + Args: + distances (list of lists of int): A distance matrix between cities. + + Returns: + tuple: A tuple containing the shortest path (list of int) and the shortest distance (int). + + Example: + >>> distances = [[0, 2, 9, 10], [1, 0, 6, 4], [15, 7, 0, 8], [6, 3, 12, 0]] + >>> traveling_salesman_bruteforce(distances) + ([0, 1, 3, 2], 21) + """ + num_cities = len(distances) + all_cities = list(range(num_cities)) + shortest_path = None + shortest_distance = float('inf') + + for path in permutations(all_cities): + distance = calculate_total_distance(path, distances) + if distance < shortest_distance: + shortest_distance = distance + shortest_path = path + + return shortest_path, shortest_distance + +def create_distance_matrix(num_cities): + """ + Create a distance matrix for a given number of cities. + + Args: + num_cities (int): The number of cities. + + Returns: + list of lists of int: A distance matrix between cities. + + Example: + >>> create_distance_matrix(4) + [[0, 2, 9, 10], [2, 0, 6, 4], [9, 6, 0, 8], [10, 4, 8, 0]] + """ + distances = [] + for i in range(num_cities): + row = [] + for j in range(num_cities): + if i == j: + row.append(0) + elif j > i: + distance = int(input(f"Enter distance between City {i + 1} and City {j + 1}: ")) + row.append(distance) + else: + row.append(distances[j][i]) + distances.append(row) + return distances + +def print_distance_matrix(distances): + """ + Print the distance matrix. + + Args: + distances (list of lists of int): A distance matrix between cities. + + Example: + >>> distances = [[0, 2, 9, 10], [1, 0, 6, 4], [15, 7, 0, 8], [6, 3, 12, 0]] + >>> print_distance_matrix(distances) + Distance Matrix: + [0, 2, 9, 10] + [2, 0, 6, 4] + [9, 6, 0, 8] + [10, 4, 8, 0] + """ + print("Distance Matrix:") + for row in distances: + print(row) + +def print_city_path(path): + """ + Print the shortest path through cities. + + Args: + path (list of int): A list representing the order of cities to visit. + + Example: + >>> print_city_path([0, 1, 3, 2]) + Shortest Path: City 1 -> City 2 -> City 4 -> City 3 + """ + city_path = [f"City {city + 1}" for city in path] + print("Shortest Path:", " -> ".join(city_path)) + +def main_menu(): + """ + Display a menu for the traveling salesman problem and handle user input. + + Example: + >>> # This function interacts with the user, so no specific doctests are provided. + >>> # You can run this function manually to test the menu functionality. + >>> main_menu() + """ + while True: + print("\nMenu:") + print("1. Create a distance matrix") + print("2. Find the shortest path") + print("3. Exit") + + choice = input("Enter your choice: ") + + if choice == '1': + num_cities = int(input("Enter the number of cities: ")) + distances = create_distance_matrix(num_cities) + print_distance_matrix(distances) + elif choice == '2': + if 'distances' in locals(): + shortest_path, shortest_distance = traveling_salesman_bruteforce(distances) + print_city_path(shortest_path) + print("Shortest Distance:", shortest_distance) + else: + print("Please create a distance matrix first.") + elif choice == '3': + print("Goodbye!") + break + else: + print("Invalid choice. Please select a valid option.") + +if __name__ == "__main__": + main_menu() From 258d58ae277292538151b3fd815a8084a00a7538 Mon Sep 17 00:00:00 2001 From: Aaryadotpy <91911418+AaryaNale@users.noreply.github.com> Date: Sun, 15 Oct 2023 23:33:22 +0530 Subject: [PATCH 2/5] Update traveling_salesman.py fixed the linter --- src/python/traveling_salesman.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/python/traveling_salesman.py b/src/python/traveling_salesman.py index 856dcbe6..42286936 100644 --- a/src/python/traveling_salesman.py +++ b/src/python/traveling_salesman.py @@ -1,5 +1,6 @@ from itertools import permutations + def calculate_total_distance(path, distances): """ Calculate the total distance of a path through cities. @@ -22,6 +23,7 @@ def calculate_total_distance(path, distances): total_distance += distances[path[-1]][path[0]] return total_distance + def traveling_salesman_bruteforce(distances): """ Find the shortest path through cities using brute force. @@ -40,7 +42,7 @@ def traveling_salesman_bruteforce(distances): num_cities = len(distances) all_cities = list(range(num_cities)) shortest_path = None - shortest_distance = float('inf') + shortest_distance = float("inf") for path in permutations(all_cities): distance = calculate_total_distance(path, distances) @@ -50,6 +52,7 @@ def traveling_salesman_bruteforce(distances): return shortest_path, shortest_distance + def create_distance_matrix(num_cities): """ Create a distance matrix for a given number of cities. @@ -71,13 +74,16 @@ def create_distance_matrix(num_cities): if i == j: row.append(0) elif j > i: - distance = int(input(f"Enter distance between City {i + 1} and City {j + 1}: ")) + distance = int( + input(f"Enter distance between City {i + 1} and City {j + 1}: ") + ) row.append(distance) else: row.append(distances[j][i]) distances.append(row) return distances + def print_distance_matrix(distances): """ Print the distance matrix. @@ -98,6 +104,7 @@ def print_distance_matrix(distances): for row in distances: print(row) + def print_city_path(path): """ Print the shortest path through cities. @@ -112,6 +119,7 @@ def print_city_path(path): city_path = [f"City {city + 1}" for city in path] print("Shortest Path:", " -> ".join(city_path)) + def main_menu(): """ Display a menu for the traveling salesman problem and handle user input. @@ -129,22 +137,25 @@ def main_menu(): choice = input("Enter your choice: ") - if choice == '1': + if choice == "1": num_cities = int(input("Enter the number of cities: ")) distances = create_distance_matrix(num_cities) print_distance_matrix(distances) - elif choice == '2': + elif choice == "2": if 'distances' in locals(): - shortest_path, shortest_distance = traveling_salesman_bruteforce(distances) + shortest_path, shortest_distance = traveling_salesman_bruteforce( + distances + ) print_city_path(shortest_path) print("Shortest Distance:", shortest_distance) else: print("Please create a distance matrix first.") - elif choice == '3': + elif choice == "3": print("Goodbye!") break else: print("Invalid choice. Please select a valid option.") + if __name__ == "__main__": main_menu() From 69f8069ea6a168a7cd4b902d56c768c228a7d158 Mon Sep 17 00:00:00 2001 From: "Kelvin S. do Prado" Date: Mon, 30 Oct 2023 07:43:21 -0300 Subject: [PATCH 3/5] Update traveling_salesman.py --- src/python/traveling_salesman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/traveling_salesman.py b/src/python/traveling_salesman.py index 42286936..f937ffaa 100644 --- a/src/python/traveling_salesman.py +++ b/src/python/traveling_salesman.py @@ -142,7 +142,7 @@ def main_menu(): distances = create_distance_matrix(num_cities) print_distance_matrix(distances) elif choice == "2": - if 'distances' in locals(): + if "distances" in locals(): shortest_path, shortest_distance = traveling_salesman_bruteforce( distances ) From 4ede8e0c5c6b26ec3d01915eda491a31d5cfacfc Mon Sep 17 00:00:00 2001 From: "Kelvin S. do Prado" Date: Mon, 30 Oct 2023 07:43:36 -0300 Subject: [PATCH 4/5] Rename traveling_salesman.py to travelling_salesman.py --- src/python/{traveling_salesman.py => travelling_salesman.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/python/{traveling_salesman.py => travelling_salesman.py} (100%) diff --git a/src/python/traveling_salesman.py b/src/python/travelling_salesman.py similarity index 100% rename from src/python/traveling_salesman.py rename to src/python/travelling_salesman.py From fc1ad8916872364059af7e39f913930c97808b11 Mon Sep 17 00:00:00 2001 From: "Kelvin S. do Prado" Date: Mon, 30 Oct 2023 07:45:18 -0300 Subject: [PATCH 5/5] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6e278335..a35ffb0e 100644 --- a/README.md +++ b/README.md @@ -546,8 +546,8 @@ In order to achieve greater coverage and encourage more people to contribute to - - + +