Untitled

 avatar
unknown
python
a year ago
2.4 kB
6
Indexable
import random

# Define the distance matrix (example distances between cities)
distance_matrix = {
    'A': {'A': 0, 'B': 5, 'C': 8, 'D': 4, 'E': 6},
    'B': {'A': 5, 'B': 0, 'C': 2, 'D': 7, 'E': 9},
    'C': {'A': 8, 'B': 2, 'C': 0, 'D': 3, 'E': 1},
    'D': {'A': 4, 'B': 7, 'C': 3, 'D': 0, 'E': 5},
    'E': {'A': 6, 'B': 9, 'C': 1, 'D': 5, 'E': 0}
}

# Calculate the total distance of a route
def calculate_total_distance(route):
    total_distance = 0
    for i in range(len(route) - 1):
        total_distance += distance_matrix[route[i]][route[i+1]]
    total_distance += distance_matrix[route[-1]][route[0]]  # Return to the starting city
    return total_distance

# Generate a neighboring solution by swapping two cities
def generate_neighbor(route):
    index1, index2 = random.sample(range(1, len(route)), 2)  # Exclude the starting city from swapping
    new_route = route[:]
    new_route[index1], new_route[index2] = new_route[index2], new_route[index1]  # Swap cities
    return new_route

# Hill Climbing algorithm
def hill_climbing(start_city, max_iterations):
    cities = [city for city in distance_matrix if city != start_city]
    current_solution = [start_city] + random.sample(cities, len(cities))
    current_distance = calculate_total_distance(current_solution)
    
    for _ in range(max_iterations):
        neighbor = generate_neighbor(current_solution)
        neighbor_distance = calculate_total_distance(neighbor)
        
        if neighbor_distance < current_distance:  # Minimization
            current_solution = neighbor
            current_distance = neighbor_distance
            
    return current_solution, current_distance

# Visualize the optimal route
def visualize_route(route):
    print("\nOptimal Route:")
    for i in range(len(route) - 1):
        print(route[i], "->", end=" ")
    print(route[-1], "->", route[0])  # Return to the starting city

# Main loop
while True:
    start_city = input("\nEnter the starting city (A, B, C, D, or E), or type 'exit' to quit: ").upper()
    if start_city == 'EXIT':
        break
    elif start_city not in distance_matrix:
        print("Invalid starting city. Please choose from A, B, C, D, or E.")
    else:
        max_iterations = 1000
        solution, distance = hill_climbing(start_city, max_iterations)
        visualize_route(solution)
        print("Total Distance:", distance)
Editor is loading...
Leave a Comment