Имеем код на python где идет расчет задачи коммивояжера, как добавить учет времени доставки?

from tsp_ip import tsp_ip
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

def create_distance_matrix(num_nodes, edges):
    # Инициализация матрицы
    distance_matrix = np.zeros((num_nodes, num_nodes))

    for edge in edges:
        i, j, distance = edge
        distance_matrix[i-1][j-1] = distance
        distance_matrix[j-1][i-1] = distance  # так как граф неориентированный
    
    return distance_matrix

def create_graph_from_distance_matrix(distance_matrix, node_names_with_idx):
    # Создание графа
    G = nx.Graph()

    # Добавление узлов (точек)
    num_points = distance_matrix.shape[0]
    G.add_nodes_from(node_names)

    # Добавление ребер с весами (расстояниями)
    for i in range(num_points):
        for j in range(i + 1, num_points):
            if distance_matrix[i, j] > 0:  # учтем только ненулевые расстояния
                G.add_edge(node_names_with_idx[i], node_names_with_idx[j], weight=distance_matrix[i, j])
    
    return G

def draw_graph(G):
    pos = nx.spring_layout(G)  # для визуализации
    weights = nx.get_edge_attributes(G, 'weight')
    
    plt.figure(figsize=(10, 8))
    nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=700, font_size=10)
    nx.draw_networkx_edge_labels(G, pos, edge_labels=weights)
    plt.title('Graph from Distance Matrix')
    plt.show()

text = '''
{ИдТочки},{kr_ТД013423},{kr_ТД007460},{kr_ТД010491},{kr_ТД013690},{kr_ТД008332},{kr_ТД010223},{kr_ТД011052},{kr_ТД011051},{kr_ТД011079},{kr_ТД007627},{kr_ТД007452},{kr_ТД008234},{kr_ТД015057},{kr_ТД010611},{kr_ТД008357},{kr_ТД011831},{kr_ТД010561},{kr_ТД014358},{kr_ТД015167},{kr_ТМ000004}
{kr_ТД013423},{0},{8522,6},{8667,1},{9411,6},{9453,8},{10240,7},{9783,9},{9245,9},{9968,9},{10326,1},{10613,5},{11398,8},{10102,3},{9740,3},{8620,4},{8663,6},{5600,2},{6633,4},{5843},{28577,1}
{kr_ТД007460},{8536,4},{0},{203,7},{1271,5},{1313,7},{1801,7},{1344,9},{885,8},{1529,9},{1887,1},{2031,7},{2959,8},{1742,2},{1380,2},{260,3},{303,5},{3103,6},{4346,3},{3035,8},{26290}
{kr_ТД010491},{8692},{203,7},{0},{888,3},{930,5},{1717,5},{1260,6},{1292,7},{1445,6},{1802,9},{2090,2},{2875,6},{2117,9},{1755,9},{636},{679,1},{3259,3},{4502},{3191,4},{26445,7}
{kr_ТД013690},{9430,6},{1276,8},{903,5},{0},{819,5},{1156,2},{699,4},{731,4},{884,4},{1241,6},{1529},{2314,3},{2297,2},{1933,5},{1256,2},{1417,7},{3997,8},{5240,5},{3930},{27184,2}
{kr_ТД008332},{9472,8},{1318,9},{945,6},{819,5},{0},{983,7},{1191,8},{1223,8},{1376,8},{1734},{2021,4},{2141,8},{2789,6},{2425,9},{1416,7},{1459,9},{4040},{5282,7},{3972,1},{27226,4}
{kr_ТД010223},{10259,7},{1801,7},{1732,6},{1156,2},{983,7},{0},{627},{1016,6},{1169,5},{1299,3},{1585},{1307,4},{2353,2},{2108,5},{1541,4},{1733},{4827},{6069,7},{4759,1},{28013,4}
{kr_ТД011052},{9802,9},{1344,9},{1275,8},{699,4},{1191,8},{627},{0},{559,8},{712,7},{1070},{1357,3},{1785,1},{2125,5},{1712,4},{1084,6},{1276,2},{4370,1},{5612,8},{4302,3},{27556,5}
{kr_ТД011051},{9259,7},{885,8},{1250,2},{731,4},{1223,8},{1016,6},{559,8},{0},{744,7},{1102},{1389,3},{2174,7},{1615,4},{1253,4},{625,5},{817,1},{3826,9},{5069,6},{3759},{27013,3}
{kr_ТД011079},{9987,9},{1529,9},{1460,8},{884,4},{1376,8},{1169,5},{712,7},{744,7},{0},{650,5},{937,8},{1729,4},{1706},{1342,3},{1269,5},{1461,2},{4555,1},{5797,8},{4487,3},{27741,5}
{kr_ТД007627},{10345,1},{1887,1},{1818},{1241,6},{1734},{1299,3},{1070},{1102},{650,5},{0},{71,3},{1270},{1247},{1002,3},{1626,8},{1818,4},{4912,4},{6155,1},{4844,5},{28098,8}
{kr_ТД007452},{10405,6},{2031,7},{1889,3},{1312,9},{1805,3},{1585},{1141,2},{1173,2},{721,7},{71,3},{0},{1181,4},{985},{740,3},{1771,4},{1963},{4972,8},{6215,5},{4904,9},{28159,2}
{kr_ТД008234},{11417,9},{2959,8},{2890,7},{2314,3},{2141,8},{1307,4},{1785,1},{2174,7},{1729,4},{1270},{1181,4},{0},{1418},{1705},{2699,5},{2891,1},{5985,1},{7227,8},{5917,2},{29171,5}
{kr_ТД015057},{10116,1},{1742,2},{2106,6},{2297,2},{2789,6},{2353,2},{2125,5},{1615,4},{1706},{1247},{985},{1418},{0},{450,8},{1481,9},{1673,5},{4683,3},{5926},{4615,4},{27869,7}
{kr_ТД010611},{9754,1},{1380,2},{1744,6},{1933,5},{2425,9},{1991,2},{1712,4},{1253,4},{1342,3},{1002,3},{740,3},{1705},{450,8},{0},{1119,9},{1311,5},{4321,3},{5564},{4253,4},{27507,7}
{kr_ТД008357},{8634,2},{260,3},{624,7},{1369,3},{1411,4},{1541,4},{1084,6},{625,5},{1269,5},{1626,8},{1771,4},{2699,5},{1481,9},{1119,9},{0},{191,6},{3201,4},{4444,1},{3133,5},{26387,8}
{kr_ТД011831},{8677,3},{303,5},{667,9},{1412,4},{1454,6},{1733},{1276,2},{817,1},{1461,2},{1818,4},{1963},{2891,1},{1673,5},{1311,5},{191,6},{0},{3244,6},{4487,3},{3176,7},{26431}
{kr_ТД010561},{5743,5},{2922,5},{3066,9},{3811,4},{3853,6},{4640,6},{4183,7},{3645,7},{4368,7},{4726},{5013,3},{5798,7},{4502,1},{4140,1},{3020,2},{3063,4},{0},{1553,4},{242,8},{23497,1}
{kr_ТД014358},{6127,7},{67599,3},{3989,5},{4734},{4776,2},{5563,2},{5106,3},{4568,3},{5291,3},{5648,6},{5935,9},{6721,3},{5424,7},{5062,7},{3942,8},{3986},{922,6},{0},{1165,4},{56535,8}
{kr_ТД015167},{5842,6},{3042,2},{3186,6},{3931,2},{3973,3},{4760,3},{4303,5},{3765,5},{4488,5},{4845,7},{5133,1},{5918,4},{4621,9},{4259,9},{3140},{3183,2},{409,8},{1652,5},{0},{23596,2}
{kr_ТМ000004},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}
'''

# Преобразуем текст в список строк
lines = text.replace('', '') 
lines = lines.replace('},{', '};{')
lines = lines.strip().split('\n')

# Заголовки для сопоставления индексируем и извлекаем без ИдТочки
headers = [header.strip('{}') for header in lines[0].split(';')][1:]

# Перемещаем последнее значение в начало списка заголовков
last_value = headers.pop()
headers.insert(0, last_value)

# Создадим отдельное соответствие для индексов
index_mapping = {i: headers[i-1] for i in range(1, len(headers) + 1)}

# Создадим структуру данных
data = []
for i, line in enumerate(lines[1:], start=1):
    values = [v.strip('{}') for v in line.split(';')[1:]]
    for j, value in enumerate(values, start=1):
        #if i < j:
        #    number_value = float(value.replace(',', '.'))
        #    data.append([i, j, number_value])
        #if i < j:
            number_value = float(value.replace(',', '.'))
            if not number_value==0:
                data.append([i, j, number_value])


edges = data
print(edges)

node_names = list(index_mapping.values())
print(node_names)

num_nodes = len(node_names)
print(num_nodes)

distance_matrix = create_distance_matrix(num_nodes, edges)

# Решение задачи коммивояжера (Traveling Salesman Problem)
path_len, graph_result = tsp_ip(distance_matrix, msg=False)

if path_len:
    # Get the list of edges of the optimal path
    res = nx.find_cycle(graph_result)
    print('Min path =', res)
    print('Length =', path_len)
    for re in res:
        b, e = re
        #print(''+node_names[b]+' : '+node_names[e])
        print(node_names[e])

else:
    print('Solution impossible!')

# Входной текст
input_text = '''
{Ид},{Наименование},{ОкнаДоставки},{ИдТранспортныхСредств},{ИдЗоны},{ИдМаршрута}
{kr_ТД013423},{662518, Березовский р-н, с.Есаулово, стр.1},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД007460},{662501, г.Сосновоборск, пр-кт Мира д.1, пом.1А},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД010491},{662501, Красноярский край, Сосновоборск г, Мира пр-кт, дом 3},{13.00.00-23.59.59,},{kr000000648,},{kr000000010},{}
{kr_ТД013690},{662501, г.Сосновоборск, ул.Ленинского Комсомола д.34},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД008332},{г.Сосновоборск, пр-кт Мира д.17},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД010223},{662501, Красноярский край, Сосновоборск г, Солнечная ул, здание 33},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД011052},{662501, Красноярский край, Сосновоборск г, Весенняя ул, дом 12},{13.00.00-23.59.59,},{kr000000648,},{kr000000010},{}
{kr_ТД011051},{662501, Красноярский край, Сосновоборск г, Весенняя ул, дом 20},{13.00.00-23.59.59,},{kr000000648,},{kr000000010},{}
{kr_ТД011079},{662501, Красноярский край, Сосновоборск г, Ленинского Комсомола ул, дом 18},{13.00.00-23.59.59,},{kr000000648,},{kr000000010},{}
{kr_ТД007627},{662501, г.Сосновоборск, ул.Ленинского Комсомола д.4},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД007452},{662501, г.Сосновоборск, ул.Ленинского Комсомола д.4, пом.2},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД008234},{г.Сосновоборск, ул.Новоселов, д.18},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД015057},{662500, г.Сосновоборск, ул.Юности д.1А},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД010611},{662501, Красноярский край, Сосновоборск г, Юности ул, дом 9},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД008357},{г.Сосновоборск, ул.Юности д.47},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД011831},{662501, Красноярский край, Сосновоборск г, Юности ул, дом 53},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД010561},{Красноярский край, Красноярск г, 16 км а/д Красноярск-Железногорск, здание 3},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД014358},{662518, Красноярский край, Березовский р-н, Есауловка п, Поповича ул, дом 20а},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
{kr_ТД015167},{662524, Красноярский край, Березовский р-н, дом 7/2, Южнее пос.Есаулова},{00.00.00-24.00.00,},{kr000000648,},{kr000000010},{}
'''  # Тут будет продолжение вашего текста

# Заменяем ‘},{’ на ‘;’ и убираем фигурные скобки
input_text = input_text.replace('},{', ';').replace('{', '').replace('}', '')

# Удаляем ненужные символы и разбиваем по строкам
lines = input_text.strip().split('\n')

# Извлекаем и печатаем первые две колонки
data = []
for line in lines:
    columns = line.split(';')  # Используем ‘;’ как разделитель
    data.append(columns[:2])  # Добавляем только первую и вторую колонку до data

# Вывод результата
#for item in data:
#    print(item)

def search_by_id(search_id, data):
    for row in data[1:]:  # Пропускаем заголовок
        if row[0] == search_id:
            return row[1]  # Возвращаем наименование (адрес) при совпадении Ид
    return None

for item in res:
    b, e = item
    result = search_by_id(node_names[e], data)
    print(result)