This repository has been archived on 2021-10-31. You can view files and clone it, but cannot push or open issues or pull requests.
AICup/code/io_tsp.py
2019-10-23 21:11:32 +02:00

64 lines
1.9 KiB
Python

import numpy as np
from typing import List
from matplotlib import pyplot as plt
from numpy.core._multiarray_umath import ndarray
class Instance:
nPoints: int
best_sol: int
name: str
lines: List[str]
dist_matrix: ndarray
points: ndarray
def __init__(self, name_tsp):
self.read_instance(name_tsp)
def read_instance(self, name_tsp):
# read raw data
file_object = open(name_tsp)
data = file_object.read()
file_object.close()
self.lines = data.splitlines()
# store data set information
self.name = self.lines[0].split(' ')[2]
self.nPoints = np.int(self.lines[3].split(' ')[2])
self.best_sol = np.int(self.lines[5].split(' ')[2])
# read all data points and store them
self.points = np.zeros((self.nPoints, 3))
for i in range(self.nPoints):
line_i = self.lines[7 + i].split(' ')
self.points[i, 0] = line_i[0]
self.points[i, 1] = line_i[1]
self.points[i, 2] = line_i[2]
self.create_dist_matrix()
def print_info(self):
print('name: ' + self.name)
print('nPoints: ' + str(self.nPoints))
print('best_sol: ' + str(self.best_sol))
def plot_data(self):
plt.figure(figsize=(8, 8))
plt.title(self.name)
plt.scatter(self.points[:, 1], self.points[:, 2])
plt.show()
@staticmethod
def distance_euc(zi, zj):
xi, xj = zi[0], zj[0]
yi, yj = zi[0], zj[0]
return round(np.sqrt((xi - xj) ** 2 + (yi - yj) ** 2))
def create_dist_matrix(self):
self.dist_matrix = np.zeros((self.nPoints, self.nPoints))
for i in range(self.nPoints):
for j in range(i, self.nPoints):
self.dist_matrix[i, j] = self.distance_euc(self.points[i][1:3], self.points[j][1:3])
self.dist_matrix += self.dist_matrix.T