-
Notifications
You must be signed in to change notification settings - Fork 0
/
obj_function.py
75 lines (66 loc) · 3.64 KB
/
obj_function.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# import math # pozwala na operacje matematyczne typu sqrt
# import matplotlib.pyplot as plt # do wykresów(składnia jak plot w matlabie)
# import csv # do wczytywania lini z pliku jako rekordy
import numpy as np
import load_data
def distance_function(permutation, distance_array, times_array):
u"""Zwraca czas potrzebny na pokonanie trasy pomiędzy otworami na płytce
wg danego wektora rozwiązania oraz czas potzrzebny na przezbrojenie wg
macierzy zmiany wierteł oraz czasu powrotu do punktu bazowego
"""
sum = 0
for i in range((permutation.shape[0] - 1)):
if times_array[permutation[i]][permutation[i + 1]] == 0:
sum += distance_array[permutation[i]][permutation[i + 1]]
else:
sum += distance_array[permutation[i]][permutation[0]] + distance_array[permutation[0]][permutation[i + 1]] \
+ times_array[permutation[i]][permutation[i + 1]]
return sum
def loss_function(permutation, distance_array, times_array, tmin):
u"""Funkcja kary - zwraca czas oczekiwania na ostygnięcie płytki
na podstawie czasu stygnięcia, czasu przejścia pomiędzy otworami oraz ewentualnego przezbrojenia
"""
sum = 0
for i in range((permutation.shape[0] - 1)):
if times_array[permutation[i]][permutation[i + 1]] == 0:
if distance_array[permutation[i]][permutation[i + 1]] < tmin:
sum += tmin - distance_array[permutation[i]][permutation[i + 1]]
else:
if (distance_array[permutation[i]][permutation[0]] + distance_array[permutation[0]][permutation[i + 1]] \
+ times_array[permutation[i]][permutation[i + 1]]) < tmin:
sum += tmin - (distance_array[permutation[i]][permutation[0]] + distance_array[permutation[0]][
permutation[i + 1]] + times_array[permutation[i]][permutation[i + 1]])
return sum
class ObjectiveFun():
u"""Udostępnia metody obliczania wartości funkcji celu oraz generowania
rzeczywistego wektora rozwiązania z uwzględnieniem powrotów do punktu bazowego
"""
def __init__(self, file_name, t_min, point_number, number_of_tools):
self.data = load_data.Pcb(file_name, point_number, number_of_tools)
self.D = self.data.distance_matrix()
self.T = self.data.times_matrix()
self.tmin = t_min
def obj_function(self, permutation):
u"""Zwraca całkowity czas potrzebny na pokonanie trasy pomiędzy otworami na płytce
wg danego wektora rozwiązania, w tym czas potzrzebny na przezbrojenie
oraz czas oczekiwania na ostygnięcie płytki
"""
permutation = np.insert(permutation, 0, [0])
permutation = np.insert(permutation, permutation.shape[0], [0])
return distance_function(permutation, self.D, self.T) + loss_function(permutation, self.D, self.T, self.tmin)
def real_permutation(self, permutation):
u"""Zwraca permutację na podstawie wektora rozwiązań, która
uwzględnia ewentualny powrót do punktu bazowego w celu przezbrojenia
"""
real_permutation = permutation
real_permutation = np.insert(real_permutation, 0, [0])
real_permutation = np.insert(real_permutation, real_permutation.shape[0], [0])
i = 0
while True:
if i == real_permutation.shape[0] - 1:
break
if self.T[real_permutation[i]][real_permutation[i + 1]] > 0:
if (real_permutation[i] != 0) and (real_permutation[i + 1] != 0):
real_permutation = np.insert(real_permutation, i + 1, [0])
i += 1
return real_permutation