Пример #1
0
    
    
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)
    
Пример #2
0
    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))
Пример #3
0
                    # 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))
Пример #4
0
    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])))
Пример #5
0
        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)
Пример #6
0

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型) を呼び出す