Files
module1_3/final/scripts/f_net1125.py
2026-04-23 12:48:59 +08:00

112 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# f_net1125.py ← 边关系已算完,只算任务网络
from __future__ import annotations
import numpy as np
from typing import Dict, List, Tuple
NodeID = str
TaskScore = float # 网络效能得分 [0,1]
class TaskNetworkEvaluator:
"""
输入:
nodes - 节点数据(含 function_vector / performance / temporal
relations - 已算好的全部边关系
格式relations[("IS","DEF001","CMD001")] = 0.87
"""
def __init__(self,
nodes: Dict[NodeID, Dict],
relations: Dict[Tuple[str, NodeID, NodeID], float],
weights: Dict[str, Dict[str, float]] = None):
self.nodes = nodes
self.rels = relations
self.w = weights
# ---------- 工具 ----------
def _avg(self, scores: List[float]) -> float:
return float(np.mean(scores)) if scores else 0.0
def _collect_func(self, key: str) -> List[float]:
"""所有节点指定功能值"""
return [n["function_vector"][key] for n in self.nodes.values()]
def _collect_rel(self, tag: str) -> List[float]:
"""预存关系强度列表"""
return [v for k, v in self.rels.items() if k[0] == tag]
def _collect_resp(self) -> List[float]:
"""响应时间得分"""
return [np.exp(-0.1 * n["temporal"]["response_time"]) for n in self.nodes.values()]
# ---------- 2.1 综合防御 ----------
def eval_defense(self) -> TaskScore:
w = self.w["defense"]
f_ic = self._avg(self._collect_func("f_IC"))
f_ia = self._avg(self._collect_func("f_IA"))
l_is = self._avg(self._collect_rel("IS"))
t_resp = self._avg(self._collect_resp())
l_cc = self._avg(self._collect_rel("CC"))
return w["w1"] * f_ic + w["w2"] * f_ia + w["w3"] * l_is + w["w4"] * t_resp + w["w5"] * l_cc
# ---------- 2.2 火力打击 ----------
def eval_fire(self) -> TaskScore:
w = self.w["fire"]
f_cs = self._avg(self._collect_func("f_CS"))
f_ia = self._avg(self._collect_func("f_IA"))
l_co = self._avg(self._collect_rel("CO"))
perf_cs = self._avg([n["performance"]["core_performance"] * n["function_vector"]["f_CS"]
for n in self.nodes.values()])
l_is = self._avg(self._collect_rel("IS"))
return w["w1"] * f_cs + w["w2"] * f_ia + w["w3"] * l_co + w["w4"] * perf_cs + w["w5"] * l_is
# ---------- 2.3 后勤保障 ----------
def eval_logistics(self) -> TaskScore:
w = self.w["logistics"]
f_cps = self._avg(self._collect_func("f_CPS"))
f_dp = self._avg(self._collect_func("f_DP"))
l_pd = self._avg(self._collect_rel("PD"))
p_rel = self._avg([n["performance"]["mtbf"] / 1000 for n in self.nodes.values()])
f_it = self._avg(self._collect_func("f_IT"))
return w["w1"] * f_cps + w["w2"] * f_dp + w["w3"] * l_pd + w["w4"] * p_rel + w["w5"] * f_it
# ---------- 2.4 医疗救援 ----------
def eval_medical(self) -> TaskScore:
w = self.w["medical"]
f_cps = self._avg(self._collect_func("f_CPS"))
t_resp = self._avg(self._collect_resp())
f_it = self._avg(self._collect_func("f_IT"))
l_sf = self._avg(self._collect_rel("SF"))
fresh = self._avg([np.exp(-0.1 * n["temporal"]["data_age"]) for n in self.nodes.values()])
return w["w1"] * f_cps + w["w2"] * t_resp + w["w3"] * f_it + w["w4"] * l_sf + w["w5"] * fresh
# ---------- 2.5 紧急疏散 ----------
def eval_evacuation(self) -> TaskScore:
w = self.w["evacuation"]
f_cc = self._avg(self._collect_func("f_CC"))
f_it = self._avg(self._collect_func("f_IT"))
l_cc = self._avg(self._collect_rel("CC"))
f_cps = self._avg(self._collect_func("f_CPS"))
t_resp = self._avg(self._collect_resp())
return w["w1"] * f_cc + w["w2"] * f_it + w["w3"] * l_cc + w["w4"] * f_cps + w["w5"] * t_resp
# ---------- 一键评估 ----------
def eval_all(self) -> Dict[str, TaskScore]:
results = {
"defense": self.eval_defense(),
"fire": self.eval_fire(),
"logistics": self.eval_logistics(),
"medical": self.eval_medical(),
"evacuation": self.eval_evacuation(),
}
# 计算五个维度的分数
dimensions = {
"function": self._avg(self._collect_func("f_IC")),
"relationship": self._avg(self._collect_rel("IS")),
"performance": self._avg([n["performance"]["core_performance"] for n in self.nodes.values()]),
"temporal": self._avg(self._collect_resp()),
"interaction": self._avg(self._collect_rel("SF"))
}
results["dimensions"] = dimensions
return results