def calculate_adjacent_delay(graph, u): """计算一个节点的delay""" delay_sum = 0 for v in range(graph.number_of_nodes()): if u == v: pass else: path = Network.k_shortest_path(graph, u, v, 1)[0] delay_sum += Evaluation.calculate_delay(graph, path) return delay_sum / (graph.number_of_nodes() - 1)
def cut_then_map(sub, req, node_map, algorithm_name): """求解链路映射问题""" link_map = {} sub_copy = copy.deepcopy(sub) for vLink in req.edges: vn_from, vn_to = vLink[0], vLink[1] resource = req[vn_from][vn_to]['bw'] # 剪枝操作,先暂时将那些不满足当前待映射虚拟链路资源需求的底层链路删除 sub_tmp = copy.deepcopy(sub_copy) sub_edges = [] for sLink in sub_tmp.edges: sub_edges.append(sLink) for edge in sub_edges: sn_from, sn_to = edge[0], edge[1] if sub_tmp[sn_from][sn_to]['bw_remain'] <= resource: sub_tmp.remove_edge(sn_from, sn_to) vdl = req.graph['delay'] vjt = req.graph['jitter'] vpl = req.graph['packetloss'] k = Network.get_qos_class(req) # 在剪枝后的底层网络上寻找一条可映射的最短路径 sn_from, sn_to = node_map[vn_from], node_map[vn_to] if nx.has_path(sub_tmp, source=sn_from, target=sn_to): for path in Network.k_shortest_path(sub_tmp, sn_from, sn_to, 1): if algorithm_name == "MC": sdl = Evaluation.calculate_delay(sub, path) if sdl <= req.graph['delay']: link_map.update({vLink: path}) # 这里的资源分配是暂时的 start = path[0] for end in path[1:]: bw_tmp = sub_copy[start][end][ 'bw_remain'] - resource sub_copy[start][end]['bw_remain'] = round( bw_tmp, 6) start = end break else: continue elif algorithm_name == "RLD": sdl = Evaluation.calculate_delay(sub, path) if sdl <= k * vdl: link_map.update({vLink: path}) # 这里的资源分配是暂时的 start = path[0] for end in path[1:]: bw_tmp = sub_copy[start][end][ 'bw_remain'] - resource sub_copy[start][end]['bw_remain'] = round( bw_tmp, 6) start = end break else: continue elif algorithm_name == "RLJ": sdl = Evaluation.calculate_delay(sub, path) sjt = Evaluation.calculate_jitter(sub, path) if sdl <= k * vdl and sjt <= k * vjt: link_map.update({vLink: path}) # 这里的资源分配是暂时的 start = path[0] for end in path[1:]: bw_tmp = sub_copy[start][end][ 'bw_remain'] - resource sub_copy[start][end]['bw_remain'] = round( bw_tmp, 6) start = end break else: continue elif algorithm_name == "RLQ": sdl = Evaluation.calculate_delay(sub, path) sjt = Evaluation.calculate_jitter(sub, path) spl = Evaluation.calculate_packet_loss(sub, path) if sdl <= k * vdl and sjt <= k * vjt and spl <= k * vpl: link_map.update({vLink: path}) # 这里的资源分配是暂时的 start = path[0] for end in path[1:]: bw_tmp = sub_copy[start][end][ 'bw_remain'] - resource sub_copy[start][end]['bw_remain'] = round( bw_tmp, 6) start = end break else: continue else: break # 返回链路映射集合 return link_map