com2014-template/template/model/my_model_UCS.py

72 lines
2.5 KiB
Python

import math
import random
from model.base_model import Model
class MyUCSModel(Model):
def __init__(self):
super().__init__()
def init(self, nodes):
"""
Put your initialization here.
"""
super().init(nodes)
def getMST(self, node):
MST = []
distances = []
for i in range(0, self.N):
if i != node:
MST.append(i)
distances.append(self.dist(node, i))
return [x for _,x in sorted(zip(distances, MST))]
def fit(self, max_it=1000):
"""
Put your iteration process here.
"""
UCS_solutions = []
UCS_losses = []
for i in range(0, self.N):
solution = [i]
UCS_solutions.append(solution)
UCS_losses.append(math.inf)
MSTs = []
for i in range(0, self.N):
MSTs.append([-1] * self.N)
# Breadth First: Set each city as starting point, then go to next city simultaneously
min_loss = math.inf
while(len(UCS_solutions[ UCS_losses.index(min(UCS_losses)) ]) != self.N):
unvisited_list = list(range(0, self.N))
min_loss = min(UCS_losses)
# For each search path
for i in range(0, self.N):
if UCS_losses[i] == min_loss:
cur_city = UCS_solutions[i][-1]
unvisited_list = list( set(range(0, self.N)) - set(UCS_solutions[i]) )
if MSTs[cur_city][0] == -1:
MST = self.getMST(cur_city)
MSTs[cur_city] = MST
for j in MSTs[cur_city]:
if(j in unvisited_list):
UCS_solutions[i].append(j)
N = len(UCS_solutions[i])
cur_fit = 0
for k in range(len(UCS_solutions[i])):
coord_0, coord_1 = self.coords[UCS_solutions[i][k % N]], self.coords[UCS_solutions[i][(k + 1) % N]]
cur_fit += math.sqrt((coord_0[0] - coord_1[0]) ** 2 + (coord_0[1] - coord_1[1]) ** 2)
UCS_losses[i] = cur_fit
# if(UCS_losses[i] < min_loss):
# min_loss = UCS_losses[i]
break
self.best_solution = UCS_solutions[ UCS_losses.index(min(UCS_losses)) ]
self.fitness_list.append(self.fitness(self.best_solution))
return self.best_solution, self.fitness_list