def plot_solution_utilization_without_d_max(self):
     """
         Funkcja reprezentująca wykorzystanie stacji dokujących BEZ zasięgu ich działania
     """
     fig = plt.figure(figsize=(16, 12))
     ax = fig.add_subplot(111)
     im = ax.imshow(self.__plt_utilisation_without_d_max,
                    origin='lower',
                    interpolation='None',
                    cmap='YlOrBr')
     plt.xlabel('Pozycja osi X')
     plt.ylabel('Pozycja osi Y')
     plt.title(
         'Wykorzystanie poszczególnych stacji dokujących bez ograniczeń odległościowych'
     )
     size = self.__plt_utilisation_without_d_max.shape
     for (j,
          i), label in np.ndenumerate(self.__plt_utilisation_without_d_max):
         if int(label) != 0 and self.__plt_map[j][i]:
             ax.text(i, j, int(label), ha='center', va='center')
     plt.xticks(range(0, size[1]))
     plt.yticks(range(0, size[0]))
     fig.colorbar(im)
     save_plot_to_file(
         plt, 'Dystrybucja klientow do stacji dokujących BEZ ograniczenia ')
     plt.show()
 def __generate_plot_of_moves(self):
     """
     Funkcja służąca do wygenerowania mapy wszystkich ruchów jakie miały miejsce podczas działania algorytmu
     :return:
     """
     if self.__client_map is None:
         raise ValueError(
             'Nie można wygenerować zmian stacji dokujących bez mapy klientów!'
         )
     x_size = self.__client_map.shape[1]
     y_size = self.__client_map.shape[0]
     fig, ax = plt.subplots()
     im = plt.imshow(self.__client_map,
                     origin='lower',
                     interpolation='None',
                     cmap='viridis')
     x_a_copy = self.__x_a_list
     for itr in range(1, self.__iteration_count):
         # Utwórz macierz ruchu i na jej podstawie narysuj strzałki
         move = x_a_copy[itr] - x_a_copy[itr - 1]
         pos_arrow_head = np.where(move == 1)
         x_arrow_head = pos_arrow_head[0][0]
         y_arrow_head = pos_arrow_head[1][0]
         pos_arrow_begin = np.where(move == -1)
         x_arrow_begin = pos_arrow_begin[0][0]
         y_arrow_begin = pos_arrow_begin[1][0]
         dx = x_arrow_head - x_arrow_begin
         dy = y_arrow_head - y_arrow_begin
         ax.annotate("",
                     xy=(0.5, 0.5),
                     xytext=(0, 0),
                     arrowprops=dict(arrowstyle="->"))
         plt.arrow(x_arrow_begin,
                   y_arrow_begin,
                   dx,
                   dy,
                   color='white',
                   width=0.005,
                   length_includes_head=True,
                   head_width=0.1,
                   head_length=0.15)
         plt.scatter(x_arrow_begin,
                     y_arrow_begin,
                     facecolors='none',
                     edgecolors='white')
     # Zaznaczenie finalnej pozycji stacji dokujących
     x_a = x_a_copy[self.__iteration_count - 1]
     for x in range(0, x_size):
         for y in range(0, y_size):
             if x_a[x][y] == 1:
                 plt.plot(x, y, 'ro')
     plt.xlabel('Pozycja osi Y')
     plt.ylabel('Pozycja osi X')
     title = 'Mapa przemieszczen podczas działania algorytmu'
     plt.title(title)
     plt.colorbar(im)
     save_plot_to_file(plt, 'Mapa_przemieszczen_stacji_dokujacych')
     plt.show()
 def __plot_elems_in_nei(self):
     """"
         Wykres ilości przeszukanych elementów w sąsiedztwie w danej iteracji
     """
     x = np.linspace(1,
                     self.__iteration_count,
                     self.__iteration_count,
                     endpoint=True)
     plt.plot(x, self.__elems_in_nei_list, 'go')
     if self.__connect_dots_on_plot:
         plt.plot(x, self.__elems_in_nei_list, 'g')
     plt.xlabel('Numer iteracji')
     plt.ylabel('Ilość elementów przeszukanych w sąsiedztwie')
     plt.title(
         'Ilość elementów przeszukanych w sąsiedztwie w danej iteracji')
     save_plot_to_file(plt, 'Ilosc_przeszukanych_elementow_w_sasiedztwie')
     plt.show()
 def __plot_elems_in_long_tabu(self):
     """
         Generowanie wykresu ilości zabronień wynikająca z listy długoterminowej
     """
     x = np.linspace(1,
                     self.__iteration_count,
                     self.__iteration_count,
                     endpoint=True)
     plt.plot(x, self.__elems_in_long_tabu, 'co')
     if self.__connect_dots_on_plot:
         plt.plot(x, self.__elems_in_long_tabu, 'c')
     plt.xlabel('Numer iteracji')
     plt.ylabel('Ilość zabronień wynikająca z listy długoterminowej ')
     plt.title(
         'Ilość zabronień wynikająca z listy długoterminowej w danej iteracji'
     )
     save_plot_to_file(plt, 'Ilosc_zabronien_dlugoterminowej_tabo_list')
     plt.show()
 def __plot_av_long_cadence(self):
     """
         Generowanie wykresu średniego wieku zabronien na liście Tabu długoterminowej
     """
     x = np.linspace(1,
                     self.__iteration_count,
                     self.__iteration_count,
                     endpoint=True)
     plt.plot(x, self.__av_long_cadence, 'mo')
     if self.__connect_dots_on_plot:
         plt.plot(x, self.__av_long_cadence, 'm')
     plt.xlabel('Numer iteracji')
     plt.ylabel('Średni wiek zabronienia długoterminowej listy tabu ')
     plt.title(
         'Średni wiek zabronienia długoterminowej listy tabu w danej iteracji'
     )
     save_plot_to_file(plt,
                       'Sredni_wiek_elementow_dlugoterminowej_tabo_list')
     plt.show()
 def __plot_Q_a(self):
     """
     Funkcja reprezentująca wykres funkcji celu w danej iteracji
     """
     fig = plt.figure()
     x = np.linspace(1,
                     self.__iteration_count,
                     self.__iteration_count,
                     endpoint=True)
     plt.plot(x, self.__Q_a_list, 'bo')
     if self.__connect_dots_on_plot:
         plt.plot(x, self.__Q_a_list)
     plt.plot(self.__min_Q_a_pos + 1, self.__Q_a_list[self.__min_Q_a_pos],
              'ro')
     plt.xlabel('Numer iteracji')
     plt.ylabel('Wartośc funkcji celu')
     plt.title('Wykres wartości funkcji celu w danej iteracji')
     save_plot_to_file(plt, 'Wartosc_funkcji')
     plt.show()
def plot_map_barriers(_barrier_map: np.array):
    """
        Funkcja do wyswietalnia mapy barier ograniczajacej ruch robotow.
        Bariery rozumiemiemy jako pola bez mozliwosci ruchu robotów.
    """
    fig = plt.figure(figsize=(16, 12))
    ax = fig.add_subplot(111)
    im = ax.imshow(_barrier_map,
                   origin='lower',
                   interpolation='None',
                   cmap='Purples')
    plt.xlabel('Pozycja osi Y')
    plt.ylabel('Pozycja osi X')
    plt.title('Mapa rozmieszczenia barrier')
    size = _barrier_map.shape
    plt.xticks(range(0, size[1]))
    plt.yticks(range(0, size[0]))
    fig.colorbar(im)
    save_plot_to_file(plt, 'barrier_map')
    plt.show()
def generate_plot_of_telemetry(telemetry_data: Dict):
    """
        Funkcja służy do utworzenia wykresu przedstawiającego dane zebrane przez telemetrię
    """
    fig, ax = plt.subplots(figsize=(16, 9))
    # Sortowanie według łacznego czasu wykonania
    telemetry_data = dict(
        sorted(telemetry_data.items(), key=lambda x: x[1], reverse=True))
    name_of_function = telemetry_data.keys()
    total_time = telemetry_data.values()
    # Generowanie wykresu
    y_pos = np.arange(len(name_of_function))
    ax.barh(y_pos, total_time, align='center')
    ax.set_yticks(y_pos)
    ax.set_yticklabels(name_of_function)
    ax.invert_yaxis()  # labels read top-to-bottom
    ax.set_xlabel('Łączny czas wykonania w sekundach')
    ax.set_title('Czas wykonania poszczególnych funkcji algorytmu')
    save_plot_to_file(plt, 'telemetria')
    plt.show()
 def __plot_tabu_list_elements(self):
     """
     Funkcja służąca do generacji wykresu ilości elementów na liście Tabu
     """
     tabu_list_elements = []
     for tabu in self.__Tabu_list:
         tabu_list_elements.append(np.count_nonzero(tabu))
     fig = plt.figure()
     x = np.linspace(1,
                     self.__iteration_count,
                     self.__iteration_count,
                     endpoint=True)
     plt.plot(x, tabu_list_elements, 'bo')
     if self.__connect_dots_on_plot:
         plt.plot(x, tabu_list_elements)
     plt.xlabel('Numer iteracji')
     plt.ylabel('Ilość elementów na liście tabu')
     plt.title('Ilość elementów na liście tabu w danej iteracji')
     save_plot_to_file(plt, 'Ilosc_elementow_tabo_list')
     plt.show()
 def plot_av_dist_for_cell_with_given_cliens(self):
     fig, ax = plt.subplots(figsize=(16, 9))
     # Sortowanie według łacznego czasu wykonania
     # sorted_l = dict(sorted(self.__av_distance_for_clients_cell.items(), key=lambda x: x[1], reverse=True))
     sorted_l = self.__av_distance_for_clients_cell
     clients_no = sorted_l.keys()
     av_dist = sorted_l.values()
     # Generowanie wykresu
     y_pos = np.arange(len(clients_no))
     ax.barh(y_pos, av_dist, align='center')
     ax.set_yticks(y_pos)
     ax.set_yticklabels(clients_no)
     ax.invert_yaxis()  # labels read top-to-bottom
     ax.set_xlabel('Średnia odległość do najbliższej stacji dokującej')
     ax.set_ylabel('Ilość klientów w danej komórce')
     ax.set_title(
         'Średnia odległość do najbliższej stacji dokującej w zależności od ilości klientów w danej komórce'
     )
     save_plot_to_file(plt, 'srednia_odleglosc_w_zal_od_ilosc_klientow')
     plt.show()
 def plot_clients_within_plt_zone(self):
     """
         Funkcja służąca do reprezentacji graficznej obszaru obsługiwanego przez stacje dokujące
     """
     fig = plt.figure(figsize=(16, 12))
     ax = fig.add_subplot(111)
     im = ax.imshow(self.__client_within_plt_zone,
                    origin='lower',
                    interpolation='None',
                    cmap='cool')
     plt.xlabel('Pozycja osi X')
     plt.ylabel('Pozycja osi Y')
     plt.title('Zasięg działania stacji dokujących')
     size = self.__client_within_plt_zone.shape
     for (j, i), label in np.ndenumerate(self.__client_map):
         if self.__plt_map[j][i]:
             plt.plot(i, j, 'wo')
     plt.xticks(range(0, size[1]))
     plt.yticks(range(0, size[0]))
     save_plot_to_file(plt, 'Zasieg dzialania stacji dokujących')
     plt.show()
 def plot_av_clients_at_given_range(self):
     fig, ax = plt.subplots(figsize=(16, 9))
     # Sortowanie według łacznego czasu wykonania
     # sorted_l = dict(sorted(self.__av_clients_at_given_range.items(), key=lambda x: x[1], reverse=True))
     sorted_l = self.__av_clients_at_given_range
     dist = sorted_l.keys()
     av_clients = sorted_l.values()
     # Generowanie wykresu
     y_pos = np.arange(len(dist))
     ax.barh(y_pos, av_clients, align='center')
     ax.set_yticks(y_pos)
     ax.set_yticklabels(dist)
     ax.invert_yaxis()  # labels read top-to-bottom
     ax.set_xlabel('Średnia liczba klientów w danej komórce')
     ax.set_ylabel('Odległość do najbliższej stacji dokującej')
     ax.set_title(
         'Średnia ilość klientów w danej komórce w zależności od odległości do stacji dokującej'
     )
     save_plot_to_file(
         plt,
         'srednia_ilosc_klientow_w_danej_odleglosc_od_stacji_dokujacej')
     plt.show()
 def __plot_plt_map(self):
     """
     Funkcja reprezentująca optymalne rozmieszczenie stacji dokujących
     """
     if self.__client_map is None:
         fig = plt.figure()
         ax = fig.add_subplot(111)
         x_a = self.__x_a_list[self.__min_Q_a_pos]
         im = ax.imshow(x_a,
                        origin='lower',
                        interpolation='None',
                        cmap='Reds')
         plt.xlabel('Pozycja osi Y')
         plt.ylabel('Pozycja osi X')
         plt.title('Optymalna pozycja stacji dokujących')
         save_plot_to_file(plt, 'Optymalna_pozycja_stacji_dokujacych')
         plt.show()
     else:
         fig = plt.figure()
         ax = fig.add_subplot(111)
         x_a = self.__x_a_list[self.__min_Q_a_pos]
         im = ax.imshow(self.__client_map,
                        origin='lower',
                        interpolation='None',
                        cmap='viridis')
         x_size = x_a.shape[0]
         y_size = x_a.shape[1]
         for x in range(0, x_size):
             for y in range(0, y_size):
                 if x_a[x][y] == 1:
                     plt.plot(x, y, 'ro')
         plt.xlabel('Pozycja osi Y')
         plt.ylabel('Pozycja osi X')
         plt.title('Optymalna pozycja stacji dokujących')
         fig.colorbar(im)
         save_plot_to_file(plt, 'Optymalna_pozycja_stacji_dokujacych')
         plt.show()
def _plot_robots_movements(_robot_mov_list: np.array,
                           _barrier_map: np.array,
                           doc_station_map: np.array = None,
                           plot_name: str = 'przemieszczenie_robotow'):
    """
    Funkcja służąca do wygenerowania mapy wszystkich ruchów jakie miały miejsce podczas przeprowadzania symulacji
    Istnieje opcjoinalny parametr do naniesienia pozycji stacji dokujących
    :return:
    """
    barrier_map = copy(_barrier_map)

    x_size = _barrier_map.shape[1]
    y_size = _barrier_map.shape[0]
    fig, ax = plt.subplots()
    # Wyswietlanie mapy barrier
    im = plt.imshow(_barrier_map,
                    origin='lower',
                    interpolation='None',
                    cmap='plasma')

    (__iteration_count, robot_count, _) = _robot_mov_list.shape
    # Petla iterujaca po poszczegolnych etapach symulacji
    for itr in range(1, __iteration_count):
        # petla po poszczegolnych robotach
        for robot_id in range(robot_count):
            pos_arrow_head = _robot_mov_list[itr, robot_id, :]
            x_arrow_head = pos_arrow_head[1]
            y_arrow_head = pos_arrow_head[0]
            # Znajdz poorzednia pozycje danego robota
            pos_arrow_begin = _robot_mov_list[itr - 1, robot_id, :]
            x_arrow_begin = pos_arrow_begin[1]
            y_arrow_begin = pos_arrow_begin[0]
            dx = x_arrow_head - x_arrow_begin
            dy = y_arrow_head - y_arrow_begin
            ax.annotate("",
                        xy=(0.5, 0.5),
                        xytext=(0, 0),
                        arrowprops=dict(arrowstyle="->"))
            plt.arrow(x_arrow_begin,
                      y_arrow_begin,
                      dx,
                      dy,
                      color='white',
                      width=0.005,
                      length_includes_head=True,
                      head_width=0.1,
                      head_length=0.15)
            plt.scatter(x_arrow_begin,
                        y_arrow_begin,
                        facecolors='none',
                        edgecolors='white')

    # Zaznaczenie finalnej pozycji stacji dokujących
    if doc_station_map is not None:
        for x in range(0, x_size):
            for y in range(0, y_size):
                if doc_station_map[x][y] != 0:
                    plt.plot(y, x, 'ro')

    plt.xlabel('Pozycja osi Y')
    plt.ylabel('Pozycja osi X')
    title = 'Mapa przemieszczen robotow podczas działania algorytmu'
    plt.title(title)
    plt.colorbar(im)
    save_plot_to_file(plt, plot_name)
    plt.show()
def plot_client_map(_client_map: np.array,
                    max_clients_number_in_cell: int,
                    generate_3D_rotate_GIF: bool = False,
                    generate_2D: bool = False):
    """

    :param client_map: Mapa rozmieszczenia klientów
    :param max_clients_number_in_cell: Maksymalna ilość klientów jaka może byc w danej komórce
    :param generate_3D_rotate_GIF: Parametr służący do utworzenia animowanego modelu mapy klientów
    :param generate_2D: Parametr służący do reprezentacji mapy klientów w postaci 2D
    :return:
    """
    client_map = np.copy(_client_map)
    data = setting_menager.get_plot_client_map_settings()
    generate_3D_rotate_GIF = data['generate_3D_rotate_GIF']
    generate_2D = data['generate_2D']
    save_to_gif = data['save_to_gif']
    if generate_2D:
        fig = plt.figure(figsize=(16, 12))
        ax = fig.add_subplot(111)
        im = ax.imshow(client_map,
                       origin='lower',
                       interpolation='None',
                       cmap='Reds')
        plt.xlabel('Pozycja osi Y')
        plt.ylabel('Pozycja osi X')
        plt.title('Ilość klientów w danym miejscu')
        size = client_map.shape
        for (j, i), label in np.ndenumerate(client_map):
            ax.text(j, i, label, ha='center', va='center')
        plt.xticks(range(0, size[1]))
        plt.yticks(range(0, size[0]))
        fig.colorbar(im)
        save_plot_to_file(plt, 'client_map')
        plt.show()
    else:
        x_size = 0.5
        y_size = 0.5
        fig = plt.figure()
        ax = plt.axes(projection="3d")
        map_size = client_map.shape
        cmap = cm.get_cmap('viridis', max_clients_number_in_cell)
        for x in range(0, map_size[0]):
            for y in range(0, map_size[1]):
                ax.bar3d(x,
                         y,
                         0,
                         x_size,
                         y_size,
                         client_map[x][y],
                         color=cmap.colors[client_map[x][y]])
        plt.gca().invert_xaxis()
        plt.title('Rozmieszczenie klientów na mapie')
        ax.set_xlabel('Pozycja X')
        ax.set_ylabel('Pozycja Y')
        ax.set_zlabel('Ilość klientów na \ndanym obszarze')
        save_plot_to_file(plt, 'client_map')
        plt.show()
        if generate_3D_rotate_GIF:

            def animate(i):
                ax.view_init(elev=10., azim=i)
                return fig,

            # Utwórz animację na podstawie mapy
            anim = animation.FuncAnimation(fig,
                                           animate,
                                           frames=360,
                                           interval=20,
                                           blit=True)
            # Zapisz animację do pliku pod formatem GIF
            if save_to_gif:
                save_anim_to_file(anim, 'client_map.gif')
            else:
                save_anim_to_file(anim, 'client_map.mp4')