博主头像
HailinCode

Full-Stack Developer

默认分类

DJI 一代 4G 面板:Windows 设备管理与诊断工具

DJI 一代 4G 面板已更新至 v0.1.13,在 Windows 上查看模块状态、收发短信和检查连接问题。默认窗口缩小为 1100×720,支持浅色、深色和跟随系统;软件下载与详细说明见上方 GitHub 卡片。 以下均为 v0.1.13 模拟数据界面,由程序离屏渲染生成,不代表真实联网、短信或驱动验收。较高的概览图用于展示完整卡片,默认窗口仍为 1100×720。 概览只展示当前状态:运营商、信号、上下行速率和温度。宽屏左栏依次是趋势图、Windows 网络详情,右栏为设备与 SIM;小窗口按卡片顺序滚动。IP 地址区域保持紧凑,可复制全部地址;页头的 GitHub 圆形图标直接打开本项目。 首次打开检查模块连接,也可以直接进入;需要时从设置中重新打开。模块网络检查可在首次引导或独立的「诊断」页进入,按证据区分模块通路与电脑实际出口。 模块短信与本地历史分别展示,提供搜索、阅读、回复和发送确认。读取可能改变短信已读状态;通用只读模块禁止模块读取、刷新、发送、删除及存储切换,本地历史浏览和导出仍可使用。发送结果未知时不会自动重发。 「设备工具」分为预设、只读查询和 AT 命令(高级),按项查看模块信息与能力状态,并显示采集时间。写操作沿用前提检查、明确确认与结果核验;无线参数和小区变化位于独立的「无线」页面。 「设置 → 常规」提供浅色、深色、跟随系统,以及简体中文、繁體中文和 English。切换可在设备探测等待期间处理,保存后下次启动继续使用;保存失败会显示原因。新版同时修复按钮文字居中和关于标题。

数学建模

层次分析法(AHP)

Analytic Hierarchy Process — 系统性多准则决策方法 将复杂决策问题分解为三层结构,通过两两比较量化判断,最终得出各方案的综合优先级权重。 对同一层级的元素进行两两比较,用 1~9 标度法赋值,构造 n×n 正互反矩阵 A,满足 $a_{ij} = 1/a_{ji}$,对角线为 1。 示例:准则层对目标层的判断矩阵 矩阵中每个元素 $a_{ij}$ 表示"行元素相对于列元素的重要程度",互为倒数关系由矩阵自动保证。使用算术平均法(常见的近似方法): ① 对判断矩阵按列求和,得到各列的列和 $S_j$ ② 每个元素除以所在列的列和,对矩阵进行列归一化 ③ 对归一化矩阵按行求平均值,即为权重向量 $\mathbf{W} = [w_1, w_2, \dots, w_n]^\top$ $$ w_i = \frac{1}{n} \sum_{j=1}^{n} \frac{a_{ij}}{\sum_{k=1}^{n} a_{kj}} $$ 沿用上例,得到准则层权重向量(显示六位小数,后续计算使用未舍入值): 判断矩阵是否存在逻辑矛盾(如"A > B > C 但 C > A")。共四个子步骤: $$ \lambda_{max} \approx \frac{1}{n} \sum_{i=1}^{n} \frac{(A\mathbf{W})_i}{w_i} $$ 其中 $(A\mathbf{W})_i$ 为矩阵 $A$ 与权重向量 $\mathbf{W}$ 之积的第 $i$ 个分量。这里 W 来自算术平均法,因此上式是估计式;若 W 为对应的主特征向量,各分量比值才等于最大特征值。 $$ CI = \frac{\lambda_{max} - n}{n - 1} $$ $n$ 为判断矩阵阶数;完全一致时 $\lambda_{max} = n$,$CI = 0$。 $n = 1$ 或 $2$ 的正互反矩阵无需计算 CR,避免除以零。RI 是随机正互反矩阵的一致性指标平均值,不同抽样方案的表值会不同。本文统一采用 Salomon 与 Gomes(2024)表 3 的 Usual 列,本例 n=4 使用 RI=0.89,不与其他版本混用。$$ CR = \frac{CI}{RI} $$ ✅ CR < 0.1:判断的一致性可接受,可继续分析;不等于权重客观正确或决策必然正确 ❌ CR ≥ 0.1:未通过本文采用的一致性阈值,需要重新检查判断。 本例按未舍入的近似权重计算,最大特征值估计为 4.014536,CI ≈ 0.004845,CR ≈ 0.005444,低于 0.1。 对每个方案,在每个准则下分别构造判断矩阵(重复步骤 1~3),得到方案对各准则的局部权重 $w_{ij}$,再按准则权重加权求和得到最终综合得分: $$ \text{综合得分}_{\text…

算法

蓝桥杯 正则问题

考虑一种简单的正则表达式:只由 x ( ) | 组成的正则表达式。求这个正则表达式能接受的最长字符串的长度。 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是 xxxxxx,长度是 6。 输入:一个由 x ( ) | 组成的正则表达式,长度不超过 100,保证合法。 输出:能接受的最长字符串的长度。 核心思路是用栈来模拟正则表达式的求值过程。正则中的 | 表示"或"(取较长的那条路),() 表示分组,x 串联表示连接。 把 x 的连续个数压栈,| 和 ( 也作为标记入栈。遇到 ) 时出栈直到 (,收集所有 | 分隔的数字,取最大值,然后重新压入对应数量的 x。 最后处理栈中残余的 | 分隔,取最大值即为答案。 遍历每个字符,用栈维护状态 x → 栈顶数字 +1(连续 x 计数),或者栈为空 / 栈顶不是数字 → 压入 1 | → 作为分隔标记入栈 ( → 作为标记入栈 ) → 出栈直到 (:收集过程中以 | 分隔的所有数字,取最大值,将对应数量的 x 重新压回栈 扫描结束后,栈中剩下的 | 分隔的各个数字取最大值 栈的优势:用栈天然支持括号嵌套,遇到 ) 时栈顶到 ( 之间的内容就是当前分组 | 的处理:遇到 | 时先把当前累计的 cur 存起来,然后归零继续计数。最后 nums 里存的就是该组内所有 | 分支的 x 数量 合并逻辑:取 max 就是 | 的语义——选最长的那个分支 时间复杂度:O(n²),最坏情况下每个 ) 需要出栈 O(n) 个元素再压回去 空间复杂度:O(n),栈的大小 这道题的关键在于意识到这就是一个"用栈做表达式求值"的问题,把正则的元字符映射为栈操作即可,不需要真的去搞正则引擎。

算法

取球博弈

两个人玩取球游戏。 一共有 N 个球,每人轮流取球,每次可取集合 {n1, n2, n3} 中的任意数目。 如果无法继续取球,则游戏结束。 此时,持有奇数个球的一方获胜。如果两人持有球数同为奇数或同为偶数,则为平局。 双方都采用最优策略,判断先手是否能赢。 博弈 + 记忆化搜索,状态定义很关键。 游戏涉及四个状态分量: 剩余球数 num 先手已取球数的奇偶性 x1 后手已取球数的奇偶性 x2 轮到谁 i(先手/后手) 用 dfs(num, x1, x2, i) 表示当前局面下,先手的胜负情况: 1:先手赢 -1:先手输 0:平局 先手轮次取 max(选对自己最有利的),后手轮次取 min(让对方最不利的)。使用 @lru_cache 记忆化,避免重复计算。 时间复杂度:O(N × 2 × 2 × 2) ≈ O(N),每个状态只计算一次 空间复杂度:O(N),缓存所有状态 状态设计要包含双方的奇偶性,而不是只记自己的 先手取 max,后手取 min,这是博弈树的标准写法 Python 的 @lru_cache 在递归深度很大时记得调高 sys.setrecursionlimit

算法

蓝桥杯 蓝桥国王

蓝桥王国中有 N 个城市,编号从 1 到 N,王国首都是 1 号城市。国王需要知道从首都到每个城市的最短距离。 给定 M 条有向道路,每条道路连接两个城市 u 和 v,长度为 w。如果某个城市从首都不可达,则输出 -1。 标准的单源最短路问题,所有边权非负,直接使用 Dijkstra 堆优化求解。从起点(首都)出发,用优先队列不断松弛邻边,最终得到所有节点的最短距离。 建图:输入编号从 1 开始,转为 0 索引使用。defaultdict(list) 处理稀疏图更高效。 队列初始化:起点距离 0,压入 pq。 结果输出:dist[i] 仍为 inf 表示不可达,替换为 -1。 核心逻辑与标准 Dijkstra 堆优化完全一致。 时间复杂度:O(N + M log(M+2)),N 为城市数,M 为道路数。惰性堆允许同一节点多次入堆,最多保留 O(M) 条记录;简单图下也常写为 O((N+M)log N)。 空间复杂度:O(N+M),邻接表为 O(N+M),dist 数组为 O(N),堆最坏为 O(M)。