7、智能制造中的边缘计算资源调度与认知能力提升

智能制造中的边缘计算资源调度与认知能力提升

1. 智能制造边缘计算资源调度策略

1.1 混合计算框架与智能资源调度策略

当前,智能制造计算框架面临诸多挑战,如缺乏融合计算历史遗产的有效框架和资源调度策略,难以保证低延迟要求。为此,提出了混合计算框架,并设计了智能资源调度策略,以满足边缘计算支持下智能制造的实时需求。
首先,从网络角度出发,提供了智能制造环境下的四层计算系统,以支持 AI 任务操作。接着,基于贪心和阈值策略,设计了具有延迟约束的两阶段算法,用于调度边缘层的计算资源。这些策略在边缘计算的智能制造中,展现出了出色的实时性、满意度和能耗性能。

1.2 边缘计算资源调度策略的系统架构

1.2.1 制造业混合计算架构

传统框架中,计算任务由雾/边缘和云两层完成。但该架构无法满足实时需求,特别是在边缘服务器有大量任务排队时。引入智能网络节点、计算能力有限的代理设备、云计算服务器和雾计算服务器后,传统智能制造系统转变为混合计算架构。
从网络角度看,所有计算资源都集成到混合计算架构中,以满足延迟要求。该架构从任务节点(如制造设备)角度包含四个部分:
1. 设备计算层
2. 边缘计算层
3. 云服务器
4. SDN 层

这些元素通过工业网络(有线/无线网络)收集。云层服务器主要用于解决基于不同信息和大数据开发 AI 模型的计算密集型任务;边缘计算层的服务器用于完成实时 AI 工作;设备计算层的设备主要负责传感和控制工作;SDN 层用于控制和协调不同计算层。传统维护与混合制造计算架构存在差异。

1.2.2 制造计算的工作流程
import json import copy import sys import csv import os import os sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) # sys.path.append('....') from lib import get_allpath as method_get_all_path from lib import cal_metrics as method_cal_metrics # import MABAC as method_MABAC from lib.Rank.mabac import method_MABAC def get_path(topo_path): with open(topo_path, 'r') as f: Topo = json.load(f) f.close() start = Topo['start'] end = Topo['goal'][0]['host'] nodes = Topo['hosts'] edges = Topo['edges'] pathsnum = Topo['nums'] newnodes = [] newedges = [] tempedges={} for node in nodes: newnodes.append(node['host_name']) for edge in edges: path = [edge['source'], edge['target']] newedges.append(path) return start, end, newnodes, newedges,pathsnum def get_path1(start, end, nodes, edges): edgesDict = {} Numedges = {} edgesNum = {} for edge in edges: if edgesDict.get(edge[0]) == None: edgesDict[edge[0]] = [edge[1]] else: edgesDict[edge[0]].append(edge[1]) edgesDict[end] = [] myPath = method_get_all_path.GetPath(nodes, edgesDict, start, end) Path = myPath.getPath() # 存放全部攻击路径 edgePath = myPath.tran(Path) return edgePath def all_paths_conversion(all_paths, topo_path, start): path_id = [] # 每条边用编号代替 path_node = [] # 记录攻击路径上的点 with open(topo_path, 'r') as f: Topo = json.load(f) f.close() edge_ID_dict = {} for edge in Topo['edges']: dict = {edge['source'] + ',' + edge['target']: edge['edge_name']} edge_ID_dict.update(dict) # print(edge_ID_dict) for path in all_paths: temp_id = [] temp_path = [start] for source, target in path: temp_id.append(edge_ID_dict[source + ',' + target]) temp_path.append(target) path_id.append(temp_id) path_node.append(temp_path) return path_id, path_node def get_rank(m1, m2, m3, m4, weight, visit, edgesnum, topo_path, data_path, out,flag): # # 从右往左pop # for i in range(edgesnum - 1, -1, -1): # if visit[i] == 1: # m1.pop(i) # m2.pop(i) # m3.pop(i) # m4.pop(i) # # m10.pop(i) B_or_C = ['B', 'C', 'C', 'C', 'B', 'B', 'B', 'B', 'C', 'B'] # B表示Benefit,C表示Cost型 with open(topo_path, 'r') as f: edges = json.load(f)['edges'] f.close() m5_TFN = [] m6_TFN = [] m7_TFN = [] m8 = [] m9_TFN = [] for edge in edges: if edge['edge_name'] == 'E1': m5_TFN.append((0,0,0)) m6_TFN.append((0,0,0)) m7_TFN.append((0,0,0)) m8.append(0) m9_TFN.append((0,0,0)) continue # print(edge['val']) # 机密性C(b) 模糊值 m5_TFN.append(edge['val']['C']) # 完整性I(b) 模糊值 m6_TFN.append(edge['val']['I']) # 可用性A(b) 模糊值 m7_TFN.append(edge['val']['A']) # exploit(b) m8.append(edge['val']['ES']) # 设备影响值(b)模糊值 m9_TFN.append(edge['val']['TFN']) # print(edge['edge_name'], edge['val']['C'], len(m5_TFN)) cias=[copy.deepcopy(m5_TFN[1:]),copy.deepcopy(m6_TFN[1:]),copy.deepcopy(m7_TFN[1:]),copy.deepcopy(m9_TFN[1:])] m5 = method_MABAC.TFN_exact_value(m5_TFN) m6 = method_MABAC.TFN_exact_value(m6_TFN) m7 = method_MABAC.TFN_exact_value(m7_TFN) m9 = method_MABAC.TFN_exact_value(m9_TFN) for i in range(edgesnum - 1, -1, -1): if visit[i] == 1: m1.pop(i) m2.pop(i) m3.pop(i) m4.pop(i) m5.pop(i) m6.pop(i) m7.pop(i) m8.pop(i) m9.pop(i) metrics_10 = [m1] + [m2] + [m3] + [m4] + [m5] + [m6] + [m7] + [m8] + [m9] all_metrics_final = [] g = [] A_cias=[];n_cias=[] for i in range(len(metrics_10)): temp = metrics_10[i] if B_or_C[i] == 'B': # benefit n_m = method_MABAC.benefit_normalize(copy.deepcopy(temp)) else: # cost n_m = method_MABAC.cost_normalize(copy.deepcopy(temp)) A_m = method_MABAC.B_to_A_weight(copy.deepcopy(n_m), weight[i]) if i in [4,5,6,8]: n_cias.append(n_m) A_cias.append(A_m) g_i = method_MABAC.get_g(copy.deepcopy(A_m), visit) final_m = method_MABAC.refresh_A_with_g(copy.deepcopy(A_m), g_i) all_metrics_final.append(final_m) if(flag): out={} out.update({'CIA_Service': [cias,n_cias,A_cias]}) with open("result/tmp/CIA_Service.json", 'w') as f: json.dump(out, f) f.close() # print(all_metrics_final) data = list(zip(*all_metrics_final)) # 保存数据 with open(data_path, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerows(data) temp_sum = [] temp_sum_exp = [] temp_c3 = [] for i in range(len(data)): temp_sum.append(sum(data[i])) temp_sum_exp.append(sum(data[i]) - data[i][2]) temp_c3.append(data[i][2]) edge_scores = [-100] * edgesnum visit_num = 0 # print(len(data), len(visit)) for i in range(len(visit)): # print(i-visit_num) if visit[i] == 1: visit_num += 1 continue else: edge_scores[i] = sum(data[i - visit_num]) edgeID_score = [] for i in range(len(edge_scores)): #edgeID_score.append(['E' + str(i + 1), edge_scores[i]]) edgeID_score.append(['E' + str(i + 1), edge_scores[i], help[i]]) ranking=Single_round_sorting_results(edgeID_score,len(edgeID_score)) best_score = max(edge_scores) rank_1_edge = edge_scores.index(best_score) # rank1_edge这个是索引,加入索引为3,说明最重要的边是E4 return rank_1_edge,ranking def refresh_path(best_edge, all_paths, topo_path): # 删除all_paths中包含best_edge的边 with open(topo_path, 'r') as f: Topo = json.load(f) f.close() edge_ID_dict = {} for edge in Topo['edges']: dict = {edge['source'] + ',' + edge['target']: edge['edge_name']} edge_ID_dict.update(dict) for key in edge_ID_dict.keys(): if edge_ID_dict[key] == best_edge: # print(key) delete_edge = (key.split(',')[0], key.split(',')[1]) # print(delete_edge) for i in range(len(all_paths) - 1, -1, -1): if delete_edge in all_paths[i]: all_paths.pop(i) #print(edge_ID_dict) return all_paths def get_pathnum(topo): with open(topo_path, 'r') as f: topo = json.load(f) edges = {} for edge in topo["edges"]: key = (edge["source"], edge["target"]) edges[key] = edge pathsnum = caculatepathsnum(edges) return pathsnum def Single_round_sorting_results(edgeID_score, edgesnum): edgeID_score.sort(key=lambda x: -x[1]) # edgeID_score.sort(key=lambda x: (-x[1], x[2])) ranking = [0] * edgesnum result=[] for i, res in enumerate(edgeID_score): result.append(res) ranking[int(res[0][1:]) - 1] = i + 1 # print('ranking=', ranking) out.update({'ranking': result}) return ranking if __name__ == '__main__': topo_path = sys.argv[1]; weight_path = sys.argv[2]; data_path = sys.argv[3]; output_path = sys.argv[4]; metrics_path = sys.argv[5] with open(weight_path, 'r') as f: weight = json.load(f) f.close() weight = weight['weight'] with open('input/MainInput.json', 'r') as f: input = json.loads(f.read()) f.close() method=input['rrisk_cal']['method'] start, end, nodes, edges,nums= get_path(topo_path) all_paths = get_path1(start, end, nodes, edges) # all_paths 记录了攻击路径 cutset = []; visit = [0] * nums[2]; visit[0] = 1; best_edge = 0;help = [0] * nums[2];help[0] = 1 out = {};tmp={} rankings=[] with open(metrics_path, 'r') as f: metrics = list(csv.reader(f)) m1 = [float(row[1]) for row in metrics[1:]] m2 = [float(row[2]) for row in metrics[1:]] m3 = [float(row[3]) for row in metrics[1:]] m4 = [float(row[4]) for row in metrics[1:]] # m10 = [float(row[5]) for row in metrics[1:]] f.close() best_edge_index,ranking = get_rank(m1, m2, m3, m4, weight, visit, nums[2], topo_path, data_path, out,True) best_edge = 'E' + str(best_edge_index + 1) cutset.append(best_edge) rankings.append(ranking[1:]) visit[best_edge_index] = 1 help[best_edge_index] = max(help) + 1 # 更新攻击路径 all_paths = refresh_path(best_edge, copy.deepcopy(all_paths), topo_path) # print('best_edge', best_edge) # print('===========================') with open(output_path, 'w') as f: json.dump(out, f) f.close() if(method=='d'): while (len(all_paths) > 0): path_id, path_node = all_paths_conversion(all_paths, topo_path, start) m1 = method_cal_metrics.cal_AttackPath_Count(path_id,nums[2]) m2 = method_cal_metrics.cal_Shortest_AP_Length(path_id,nums[2]) m3 = method_cal_metrics.cal_AttackPath_Length_Average(path_id,nums[2]) m4 = method_cal_metrics.cal_shortest_distance_to_S0(path_id,nums[2]) best_edge_index,ranking = get_rank(m1, m2, m3, m4, weight, visit, nums[2], topo_path, data_path, out,False) best_edge = 'E' + str(best_edge_index + 1) cutset.append(best_edge) rankings.append(ranking[1:]) visit[best_edge_index] = 1 help[best_edge_index] = max(help) + 1 # 更新攻击路径 all_paths = refresh_path(best_edge, copy.deepcopy(all_paths), topo_path) # print('best_edge', best_edge) # print('===========================') tmp.update({'ranking':rankings}) tmp.update({'delete_edges':cutset}) with open("result/tmp/ranking.json", 'w') as f: json.dump(tmp, f) f.close() 如何在别的程序中调用这个排序算法程序,需要传入的参数以及程序输出的排序结果在哪里
08-28
这段代码实现了一个基于 **MABAC(Multi-Attributive Border Approximation area Comparison)** 的多准则决策排序算法,用于对网络攻击路径中的边(`edges`)进行优先级排序。它会根据输入的拓扑结构、权重配置、指标数据等,计算出每条边的重要性排序,并将结果输出为 JSON 文件。 --- ## 🧪 如何在别的程序中调用这个排序算法程序? ### ✅ 调用方式 该程序是一个可执行脚本,支持从命令行调用。因此,你可以在其他 Python 程序中使用 `subprocess` 模块来调用它。 #### 示例调用代码: ```python import subprocess # 定义参数路径 topo_path = "input/topology.json" weight_path = "input/weights.json" data_path = "output/metrics.csv" output_path = "output/ranking.json" metrics_path = "input/metrics.csv" # 调用脚本 subprocess.run([ "python", "path/to/your_script.py", topo_path, weight_path, data_path, output_path, metrics_path ]) ``` --- ## 📥 需要传入的参数(命令行参数) | 参数编号 | 参数名 | 含义说明 | |----------|----------------|----------| | 1 | `topo_path` | 拓扑结构文件路径(JSON 格式),包含网络节点和边信息 | | 2 | `weight_path` | 权重文件路径(JSON 格式),包含各指标的权重值 | | 3 | `data_path` | 输出路径,用于保存中间计算的指标数据(CSV 格式) | | 4 | `output_path` | 输出路径,用于保存最终排序结果(JSON 格式) | | 5 | `metrics_path` | 输入指标数据路径(CSV 格式),包含各项评估指标值 | --- ## 📤 程序输出的排序结果在哪里? ### ✅ 输出文件路径: - 排序结果写入由第 4 个参数指定的路径(`output_path`): - 例如:`"output/ranking.json"` ### 📄 输出格式(JSON): ```json { "ranking": [ [1, 2, 3, 4, 5, 6, 7, 8, 9], // 第一次排序结果 [2, 1, 3, 4, 5, 6, 7, 8, 9], // 第二次删除某边后重新排序 ... ], "delete_edges": ["E1", "E3", "E5"] // 每轮删除的最重要边 } ``` ### 📁 输出内容说明: - `"ranking"`: 每次删除边后的边排序结果,是一个二维数组,每一行对应一次排序。 - `"delete_edges"`: 每次删除的最重要边(优先级最高的边) --- ## 📁 中间文件说明 - `data_path`:用于保存中间处理的指标数据(CSV 格式) - `metrics_path`:输入的指标数据(CSV 格式) - `result/tmp/CIA_Service.json`:调试用的 CIA 指标中间输出文件(可选) --- ## ✅ 示例输入文件格式 ### `topology.json` 示例: ```json { "start": "S0", "goal": [{"host": "H3"}], "hosts": [ {"host_name": "S0"}, {"host_name": "H1"}, {"host_name": "H2"}, {"host_name": "H3"} ], "edges": [ {"source": "S0", "target": "H1", "edge_name": "E1", "val": {"C": [1,1,1], "I": [2,3,4], "A": [0.5,1,1.5], "ES": 3, "TFN": [1,2,3]}}, ... ], "nums": [4, 5, 9] } ``` ### `weights.json` 示例: ```json { "weight": [0.3, 0.2, 0.1, 0.4, 0.2, 0.1, 0.1, 0.3, 0.2] } ``` ### `metrics.csv` 示例: ```csv ID,M1,M2,M3,M4,M5,M6,M7,M8,M9 E1,0.5,0.7,0.2,0.8,0.6,0.4,0.3,3,0.5 E2,0.6,0.6,0.3,0.7,0.5,0.5,0.4,2,0.6 ... ``` --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值