def solve(cities): N = len(cities) dist = [[0] * N for i in range(N)] for i in range(N): for j in range(i, N): dist[i][j] = dist[j][i] = distance(cities[i], cities[j]) # step = min(N, 10) step = 10**3 ans_tour = generate_greedy_tour(N, dist) ans_path_length = sum(distance(cities[ans_tour[i]], cities[ans_tour[(i + 1) % N]]) for i in range(N)) for i in range(step): # tmp_tour = generate_greedy_tour(N, dist, (200 * i) % N) tour, path_length = swap_cross(cities, dist, N) # tour, path_length = swap_cross(cities, dist, ans_tour, N) if path_length < ans_path_length: ans_tour = tour ans_path_length = path_length return ans_tour if __name__ == '__main__': assert len(sys.argv) > 1 tour = solve(read_input(sys.argv[1])) print_tour(tour)
for i in range(len(tour)): length += dist[tour[i - 1]][tour[i % len(tour)]] return length def solve(cities): N = len(cities) sum_dis = 10**9 dist = [[0] * N for i in range(N)] dist = get_euclidean_distance(cities, N, dist) for start in range(min(10, N)): tour = kruskal(dist, N, start) # tour = two_opt(tour, dist) # tour = one_or_opt(tour, dist) # tour = two_or_opt(tour, dist) # 最も距離の短いものを選択 if sum_dis > total_distance(tour, dist): ans_tour = tour sum_dis = total_distance(tour, dist) return ans_tour if __name__ == '__main__': assert len(sys.argv) > 1 cities = read_input(sys.argv[1]) print_tour(solve(cities))
# improved=True # total distanceが短くなる時だけ変更 new_tour = copy.copy(tour) new_tour[i + 1], new_tour[j] = new_tour[j], new_tour[i + 1] if calcurate_total_distance( cities, new_tour) < calcurate_total_distance( cities, tour): tour = copy.copy(new_tour) improved = True return tour def search_best_route(cities): N = len(cities) sum_dis = 10**9 # スタート地点は全てのノードで試す for _ in range(N): current_city = _ tour = solve(cities, current_city) # greedy tour = solve_cross(cities, tour) # 交差を解除 if sum_dis > calcurate_total_distance(cities, tour): ans = tour sum_dis = calcurate_total_distance(cities, tour) return ans if __name__ == '__main__': assert len(sys.argv) > 1 cities = read_input(sys.argv[1]) print_tour(search_best_route(cities))
return tour def opt_2(tour, cities): for i in range(100000): point1 = int(random.uniform(1, len(tour))) point2 = int(random.uniform(1, len(tour))) while point2 == point1: point2 = int(random.uniform(1, len(tour))) orig = cal_dist(tour, cities) tour[point1], tour[point2] = tour[point2], tour[point1] updated = cal_dist(tour, cities) if orig < updated: tour[point1], tour[point2] = tour[point2], tour[point1] return tour def cal_dist(tour, cities): dist = 0 for i in range(len(tour)-1): # for i in range(tour-1): dist += distance(cities[tour[i]], cities[tour[i+1]]) dist += distance(cities[tour[len(tour)-1]], cities[0]) return dist if __name__ == '__main__': assert len(sys.argv) > 1 tmp_tour = greedy(read_input(sys.argv[1])) tour = opt_2(tmp_tour[:], read_input(sys.argv[1])) print_tour(tour) # print(cal_dist(tour, read_input(sys.argv[1])))
print("Trial No.", i + 1, "Starting from node:", current_city) unvisited_cities = set(range(0, N)) unvisited_cities.remove(current_city) path = [current_city] while unvisited_cities: next_city = min(unvisited_cities, key=lambda city: dist[current_city][city]) unvisited_cities.remove(next_city) path.append(next_city) current_city = next_city path = two_opt(path, input) if total_distance(path, input) < best_dist: best_path = path return best_path def write_output(path: list[int]): output = open("output_6.csv", "w") output.write("index\n") for node in path: output.write(str(node) + "\n") output.close if __name__ == '__main__': input = read_input("input_6.csv") path = greedy_algorithm(input) write_output(path) print_tour(path)
def solve(cities): N = len(cities) #リストの長さを求める dist = [[0] * N for i in range(N)] for i in range(N): #リストの長さ分だけfor文が回る for j in range(i, N): #iが今いる場所、jが次の地点の場所 dist[i][j] = dist[j][i] = distance(cities[i], cities[j]) #距離を求めている print("distance : ", i, j, dist[i][j]) # distance 0は同じ地点を指している current_city = 0 #初期値、0からスタート unvisited_cities = set(range(1, N)) #訪れていない場所をobject型?でセットしている tour = [current_city] #初期値をtourでセットしている while unvisited_cities: #訪れてない場所全部を見ている next_city = min( unvisited_cities, key=lambda city: dist[current_city][city]) #最小値のものをnext_cityに入れる unvisited_cities.remove(next_city) #訪れていない場所から次のものを除外 tour.append(next_city) #返す用のリストtourにappend current_city = next_city #今いる場所をcurrent_cityとして返している return tour if __name__ == '__main__': assert len(sys.argv) > 1 #assertは想定と違ったら止まる(エラー処理) tour = solve(read_input( sys.argv[1])) #引数の1つ目を呼び出す、read_inputでファイルの読み込みを行っている print_tour(tour) #tour (list型) を呼び出す