深度强化学习破解动态柔性作业车间调度难题
简介面向智能制造与生产管理领域的研究者这份资源针对多任务并行、设备负载波动、紧急插单等动态生产场景提供基于深度强化学习的柔性作业车间调度完整实现方案。压缩包共181个文件总大小约2.93MB主要包括93个PyTorch模型权重文件、35个Python源码脚本、15个Excel实验数据表以及README、LICENSE等说明文档权重文件可用于直接加载测试脚本覆盖卷积特征提取、循环时序决策、多目标奖励函数及课程学习训练策略数据表格便于对比分析。已有74人学习下载。资源重点展示了分层决策框架与注意力机制状态编码器并设计了动态动作掩码确保调度可行性可帮助读者快速复现实验深入理解深度强化学习在车间调度中的应用细节适合作为算法研究、课题设计或毕设拓展的参考基线。1. 为什么车间调度要转向深度强化学习柔性作业车间调度FJSP一直是制造系统里的硬骨头每道工序可选机器不止一台加工时间还不一样排产本身已经是 NP-hard。一旦加上“动态”两个字——设备突然故障、急单插入、交期变更——传统数学规划方法和启发式规则就力不从心因为每次异常后都要重排计算时间根本不等人。深度强化学习的思路不是“重算一个最优解”而是训练一个调度智能体让它学会在扰动发生时快速决策先处理哪台机器、先上哪道工序。这样做的好处是决策延迟在毫秒级且策略可以跨场景复用这也正是最近几年“深度强化学习 动态柔性作业车间调度”成为研究热点的原因。这条路适合谁如果你在搞智能制造排产系统、在做 APS 选型或者在研究强化学习落地工业场景那么这个方案值得你投入。接下来我会把它拆成四层讲透问题怎么建模、网络怎么设计、代码怎么跑、坑在哪里。中间会穿插可直接复用的参数和训练技巧尽量让你读完就能搭出一个能动的雏形。2. 先把动态调度写成马尔可夫决策过程状态、动作与奖励怎么定2.1 柔性作业车间和传统车间差在哪传统作业车间调度JSP的约束是“工序必须在指定机器上加工”排序问题退化为纯序列决策。而柔性作业车间把约束放宽了一道工序可以分给多台机器中的任意一台只是不同机器加工时间不同。这个放宽让解空间爆炸了几个数量级也让“先选机器再排顺序”成为一个组合决策问题。动态柔性作业车间再在纵向上加入时间轴设备故障等异常事件可以在任意时刻插入决策要在滚动窗口内反复做出。我在实际项目中一般把动态事件分成三类机器故障损毁、紧急订单加入、交期变更导致置换。每一类事件需要触发一次重调度但在深度强化学习框架下“重调度”不再意味着从头优化而是让智能体根据当前系统状态重新分配概率。它的好处在于——你不会因为一次故障就把整条产线停掉。2.2 状态空间不是所有特征都喂给网络状态特征的设计直接决定强化学习能不能收敛。我不建议把整个排产表扔进网络那是黑匣子做法效果也不稳定。常用方案是提取三类共 31 维特征机器侧特征10 维每台机器的利用率、剩余加工时间、故障标志、平均排队长度。工序侧特征18 维当前待调度的工序数量、各工序可选机器数分布、平均加工时间、剩余工作量。全局特征3 维系统当前时间、总体拖期率、在制品数量。import numpy as np def extract_state(machines, jobs, t_now): machines: 机器对象列表含 idle_time, queued_jobs, broken 属性 jobs: 作业对象列表含 remain_time, current_op, due_date 属性 t_now: 当前仿真时钟 # 机器侧特征取最后10台机器的状态向量 machine_feats [] for m in machines[-10:]: machine_feats.extend([ m.idle_time / 100.0, # 利用率归一化 len(m.queued_jobs) / 20.0, # 排队长度 1.0 if m.broken else 0.0, # 故障标志 ]) # 工序侧特征聚合所有未完成工序 total_ops, avg_remain 0, 0.0 for j in jobs: total_ops len(j.ops_remain) avg_remain j.remain_time avg_remain avg_remain / max(len(jobs), 1) # 全局特征时间 拖期率 n_overdue sum(1 for j in jobs if t_now j.due_date) return np.array(machine_feats [ total_ops / 50.0, avg_remain / 200.0, t_now / 1000.0, n_overdue / len(jobs) ], dtypenp.float32)这段代码的关键在于归一化和固定维度。强化学习网络要求输入维度不变但车间里的机器数量和任务数量是变化的所以不能直接塞原始列表。常见做法是固定最大机器数如上 10 台和聚合统计量。我在调试中发现特征里加不加“拖期率”对后期收敛影响很大——奖励信号稀疏时这个特征能让智能体更关注瓶颈资源。2.3 动作空间选机器、选工序、还是选规则动作空间的设计有三派做法按规则选动作动作代表调度规则如 SPT最短加工时间、EDD最早交期、LPT最长加工时间。优点是动作空间小收敛快缺点是上限被封死再好也只是规则选择器。按工序选动作动作为待调度工序 ID智能体决定哪道工序优先加工。这符合直觉但动作维度随问题规模增长。按“机器-工序”二选动作先由网络输出哪台机器最紧急再由对应机器选择最佳工序。这种方法最适合动态场景因为机器故障时只需禁用故障机的动作即可。我在项目里用的是第三种。具体实现上成对输出一个 actor 网络输出机器概率分布另一个输出可选工序的 Q 值。动作掩码mask直接屏蔽故障机和已完成工序。# actor 输出动作掩码示例 def get_action_mask(machines, job_pool): valid_machines [m.id for m in machines if not m.broken] valid_actions [] for op in job_pool: for mid in op.available_machines: if mid in valid_machines: valid_actions.append((op.id, mid)) return valid_actions掩码的意义在于故障机不应参与调度完成工序不应再次被选中。这个问题初学者最容易忽略——如果不做掩码智能体在前期探索会频繁挑到无效动作导致奖励信号噪声巨大。2.4 奖励函数我踩过最深的坑奖励函数是“玄学”重灾区。我最初的版本只定义单一稀疏奖励所有订单完成后给 1否则每步 0。结果训练到十万步都没有上升趋势。后来改成即时稠密奖励拆成三个分量reward -0.1 * utilization_penalty - 0.5 * overdue_flag - 0.01 * WIP_countutilization_penalty当前利用率低于 0.85 时惩罚避免机器闲置。overdue_flag但凡有任何作业拖期就给一个较大负奖励。WIP_count在制品越多链式拥堵越重负激励。参数调整的次序也很关键。建议先只开拖期惩罚跑通再逐渐加利用率最后加在制品项。一次加太多会让训练曲线振荡得厉害你根本分不清哪个分量出了问题。另外注意奖励的尺度数量级控制在 0~1 的浮点数范围内过大容易让 Q 值爆炸。2.5 为什么非要用深度强化学习而不是遗传算法你可能会问遗传算法GA也能解决 FJSP而且效果稳定可解释为什么还要用深度强化学习关键看你的需求重调度的频率GA 每次扰动后重跑一次快也要 5~10 秒深度强化学习推理一次只需几毫秒。决策一致性GA 每次解都不完全一样产线管理人员很难接受今天排法明天变样训练收敛后的策略是确定性的。泛化能力换车间、变产线GA 要从头调参深度强化学习微调即可迁移。当然深度强化学习也不是万能钥匙。如果你只有小于 10 台机器、每周排一次产用 OR-Tools 或者禁忌搜索绰绰有余。当问题规模到 30 台机器以上、事件频繁到每几分钟就需要一次调度建议时深度强化学习的算力成本才值回票价。3. Dueling DQN 落地的关键代码网络结构、经验回放与训练循环3.1 网络选型为什么 Dueling DQN 比普通 DQN 更容易收敛如果你的任务规模适中机器数小于 50、工序池小于 500Dueling DQN 是性价比最高的选择。它把 Q 值拆成状态价值 V(s) 和动作优势 A(s,a)状态价值告诉你“现在这个车间整体运行好不好”优势函数告诉你“选这台机器比平均好多少”。这样设计的好处是即便某个动作的 Q 值近似相等网络照样能从 V(s) 中学到状态间的差异提高训练稳定性。import torch import torch.nn as nn import torch.nn.functional as F class DuelingDQN(nn.Module): def __init__(self, state_dim, action_dim, hidden256): super().__init__() # 共享特征层 self.fc1 nn.Linear(state_dim, hidden) self.fc2 nn.Linear(hidden, hidden) # 价值分支 self.v_fc nn.Linear(hidden, hidden) self.v_out nn.Linear(hidden, 1) # 优势分支 self.a_fc nn.Linear(hidden, hidden) self.a_out nn.Linear(hidden, action_dim) def forward(self, x, maskNone): x F.relu(self.fc1(x)) x F.relu(self.fc2(x)) v F.relu(self.v_fc(x)) v self.v_out(v) a F.relu(self.a_fc(x)) a self.a_out(a) # 中心化优势让 V 和 A 可区分 a_mean a.mean(dim-1, keepdimTrue) q v (a - a_mean) if mask is not None: q q.masked_fill(mask 0, -1e9) return q这段代码里有几个细节值得说明。中心化优势那一步是 Dueling 结构的精髓如果不减去优势均值V 和 A 有无数种组合能产生同一个 Q 值网络会不唯一训练飘。masked_fill把无效动作的 Q 值压到负极大相当于告诉网络“这些动作选了就出局”。当状态特征维度比较大、并且还需要处理机器间的空间关系例如设备在物理上有上下游关联时可以考虑把fc1换成 GNN 层或者 Transformer 编码器但入门阶段先用全连接把流程跑通。3.2 优先经验回放让智能体记住“考砸的题”动态调度场景里故障和急单是稀缺事件。如果使用均匀采样智能体一万步也难遇一次故障样本奖励里拖期惩罚的教训学不到。优先经验回放PER的思路是样本的 TD 误差越大越值得拿出来重复学习。class PrioritizedReplayBuffer: def __init__(self, capacity200000, alpha0.6, beta0.4): self.buffer deque(maxlencapacity) self.priorities deque(maxlencapacity) self.alpha alpha # 优先级影响强度 self.beta beta # 重要性采样系数随训练线性升到1 def push(self, transition, td_error): priority (abs(td_error) 1e-6) ** self.alpha self.buffer.append(transition) self.priorities.append(priority) def sample(self, batch_size): probs np.array(self.priorities) ** self.alpha probs / probs.sum() indices np.random.choice(len(self.buffer), batch_size, pprobs) batch [self.buffer[i] for i in indices] # 计算重要性权重用于修正采样偏置 total len(self.buffer) weights (total * np.array([probs[i] for i in indices])) ** (-self.beta) weights / weights.max() return batch, indices, weights注意beta是从 0.4 线性增加到 1.0前 10000 步要用较小的 beta否则早期 TD 误差不准确优先级反而引入噪声。alpha设 0.6 是折中太大容易让网络反复咀嚼少数样本过拟合。3.3 训练循环三步走完一次迭代训练循环是整套代码的心脏。用 JSSP 仿真器生成随机实例每回合跑完一组动态事件后把四元组(state, action, reward, next_state)压入回放池。梯度更新时用双网络机制减缓发散——目标网络每 C 步从主网络软拷贝参数。def train_one_batch(agent, replay, gamma0.99, batch_size256): if len(replay.buffer) batch_size: return batch, indices, weights replay.sample(batch_size) states torch.tensor([t[0] for t in batch], dtypetorch.float32) actions torch.tensor([t[1] for t in batch], dtypetorch.long) rewards torch.tensor([t[2] for t in batch], dtypetorch.float32) next_states torch.tensor([t[3] for t in batch], dtypetorch.float32) q_values agent.online(states).gather(1, actions.unsqueeze(1)).squeeze(1) with torch.no_grad(): next_q agent.target(next_states).max(dim1)[0] target rewards gamma * next_q td_error (target - q_values).abs().detach().numpy() loss (weights * (target - q_values) ** 2).mean() agent.optimizer.zero_grad() loss.backward() # 梯度裁剪防止 reward 尖峰炸网络 torch.nn.utils.clip_grad_norm_(agent.online.parameters(), 10.0) agent.optimizer.step() for i, idx in enumerate(indices): replay.priorities[indices[i]] td_error[i] 1e-6逻辑说明分三点target 是用目标网络算的避免追逐自己移动的靶心重要性权重重新标定 loss修正优先级采样带来的分布偏移梯度裁剪是保命操作动态调度里偶尔出现极端状态导致的 Q 值尖峰如果不裁剪一轮更新就能把网络权重打成乱码。3.4 训练收敛的时间预算和硬件参考常见硬件下单张 3090、20 核 CPU 仿真器一个包含 200 台机器、日产量 5000 件的车间调度模型100 万步训练大约需要 8~14 小时。如果只有 CPU建议把回放池容量降到 50000batch_size 降到 128否则训练一晚上基本不动。我个人的判断标准是当连续 20 个评估周期的平均奖励不再上升就收手过早停止验证集上表现不好过晚则过拟合训练时的动态事件分布。4. 动态事件驱动重调度的仿真框架训练环境怎么建、事件怎么注入4.1 仿真器选择自己写还是用现成的训练深度强化学习模型需要环境反馈我建议不要用通用仿真平台。这里有个实操层面的选择自己写一个轻量离散事件仿真器而不是用 Plant Simulation 或 Simio。理由很简单——这些工具与 Python 交互需要中间层调用单次仿真 0.5 秒百万步训练消耗的时间不可接受轻量仿真器可以直接用 Python 写单步推演 1ms训练和评估丝滑很多。企业内部做生产验证时再把策略嵌入商业仿真软件也不迟。我一般会把仿真器拆成四个组成部分:调度引擎负责时间推进、事件触发和状态推进。动作执行模块接收网络的决策并更新机器状态。动态事件生成器按给定分布随机注入故障、新订单、交期变更。指标统计器实时计算利用率、拖期率、吞吐。class DynamicJSPEnv: def __init__(self, n_machines30, n_jobs500, seed0): self.rng np.random.default_rng(seed) self.machines [Machine(i, failure_rate0.05) for i in range(n_machines)] self.jobs [Job(i, due_date_factor2.5) for i in range(n_jobs)] self.t 0.0 self.state_dim 31 self.action_dim 20 def step(self, action): # 执行动作把工序分配到对应机器 self.machines[action].assign_next_job() # 推进时钟到下一事件 self.t self.get_next_event_time() # 注入动态扰动 self.inject_events() # 计算即时奖励 reward self.compute_reward() next_state extract_state(self.machines, self.jobs, self.t) done self.all_jobs_finished() return next_state, reward, done def inject_events(self): if self.rng.random() 0.05: # 5%概率故障 machine self.rng.choice(self.machines) machine.broken True if self.rng.random() 0.03: # 3%概率急单插入 new_job Job(due_date_factor1.2) self.jobs.append(new_job)这段代码是训练环境的核心骨架。故障率 5%是常用基准设置过低智能体学不到故障应对策略过高则产线长期瘫痪奖励曲线一塌糊涂。动作维度固定为 20是我的习惯做法——对 30 台机器而言不需要一次决策选择全部而是先由高层次策略圈定 20 个候选工序再细选机器兼顾效率和收敛速度。4.2 动态事件的时间尺度设计动态事件注入的节奏直接影响训练难度。太密集每 0.5 分钟一次故障会让状态剧烈摆动网络很难学到稳定映射太稀疏则回到静态调度的问题。我的经验是平均故障间隔时间MTBF设为工位加工时间的 20~50 倍这样一次故障的插入足以改变调度路径但不会让系统永远处于恢复期。另外,各故障相互独立不要在同一时刻批量触发——真实车间里设备进出维修也有错峰。4.3 为什么训练环境里的观测噪声不能为零很多初学者把环境搭好后输入状态精度拉满、半点噪声不加训练完拿到真车间里一跑傻了眼。真实数据里的加工时间波动、传感器误差、人为操作延迟都会让状态漂移。所以在环境里加一个轻量高斯噪声到extract_state的返回值里标准差控制在状态量程的 2%~5%早期训练可以让策略更鲁棒。def extract_state(machines, jobs, t_now): state base_extract(machines, jobs, t_now) noise np.random.normal(0, 0.02, sizestate.shape) return state noise有了这个噪声你再换到新的产线部署时就不需要从头重新训练。微调时只更新最后两层权重几千步后就能适应当前车间的统计特性这也是这个方法在生产落地时比较顺畅的原因。5. 训练不收敛、效果拉胯怎么办避坑与排查手册5.1 奖励曲线常年横盘偶尔还往下走现象训练 30 万步平均奖励在 -1.0 和 -1.2 之间反复横跳没有任何上升趋势。原因我遇到最多的原因是奖励函数的尺度不对。三个分量里overdue_flag设为 -0.5但 WIP 一多-0.01 * WIP_count累积成 -5 的巨量拖期信号完全被淹没。其次如果优先经验回放里的 beta 一直不增加后期样本偏置修正不了网络也会原地踏步。解决先把奖励函数拍平到同一数量级。单独打印每个分量的均值哪个均值的绝对值显著大于其他分量就把它除以一个缩放系数。然后检查 PER 的 beta 增长策略确保在训练中期已经升到 0.8 以上。最后再把 batch_size 调大 256降低方差。5.2 动态事件一多决策就开始乱跳现象模型在静态仿真上表现失常但一旦连续注入三次故障动作频繁在机器 3 和机器 17 之间来回切换同一条产线前一步是 SPT 调度后一步变成了 EDD。原因动作空间里缺少不稳定惩罚项。智能体发现切换动作本身没有代价就会频繁变更决策这在动态场景中是致命的。车间工人不希望每十分钟改一次加工计划。解决在奖励函数里加一个switching_penalty -0.2 * changed_flag当相邻两个决策选择的机器不一致时扣除固定惩罚。这个惩罚系数不能太大否则智能体会学成“咬住一台机器不放”全局利用率一塌糊涂。0.1~0.3 之间需要你按具体产线试先大后小。5.3 训练时想到一个好策略验证时却失效现象训练集最后的动态事件总是“机器 7 故障”模型把大量权重调到等待机器 7 复位的策略上。验证阶段换到机器 12 故障模型完全没有响应。原因事件生成器的随机种子固定。固定种子有利于复现实验但在深度强化学习里学到的只是某个特定扰动时间轴的应对方式。另外奖励函数里如果有比较重的“等待特定机器恢复”的正反馈模型会过拟合单个机器状态。解决训练时每 100 回合更换随机种子并且把故障机器的采样分布打乱。验证时我用另一组完全不重叠的种子做 P 值测试如果 30 次验证的奖励均值和训练集差异超过 15%,就要怀疑模型没学到决策逻辑只背下了训练脚本。5.4 使用 GNN 替换全连接层后没有变强反而变慢现象按论文说法把特征提取层换成图神经网络理想是能捕捉机器间关联但实测发现训练步数加倍耗时翻三倍效果持平甚至略差。原因GNN 在车间调度中的优势在于空间拓扑关系但如果你车间的机器间没有明确的物流上下游完全图结构带来的全是噪声。另外 GNN 的消息传递需要叠加多层才能捕捉远距离依赖计算开销非常大中小规模车间完全没必要。解决判断标准是机器数量是否超过 100 台、且产线有明显单向物流方向。不满足的话用普通全连接加 mask 就够了。如果坚持用 GNN就限制聚合半径只连物理相邻的机器不要全连接。5.5 训练曲线很好仿真器跑分很高上线却一直被工人吐槽现象模型在历史数据回测中表现完美利用率从 78% 提到 92%拖期率下降一半。但实际车间用了一周班组长抱怨计划频繁变来变去甚至建议停掉系统。原因模型优化目标和真实生产目标不一致。你优化的是机器利用率、拖期率但一线关心的还有物料搬运距离、换线时间、人员工作负荷均衡度。这些都可以是奖励函数的分量但你需要和现场充分对齐后再定调度策略。我见过不少工厂项目就在这一步翻车——技术指标做得漂亮落地时输给了“软约束”。解决把问题拆成两阶段——第一阶段用深度强化学习生成粗糙计划第二阶段用线性规划做软约束修正。修正幅度控制在 10% 以内既保留策略的全局优势又满足现场工位的个性化诉求。实际跑起来后现场反馈的满意度远比单纯奖励分数重要。6. 从仿真到车间的最后一公里策略迁移、输出解释与持续维护模型在仿真环境里收敛后距离真正上线还差三步策略迁移验证、软约束接口、增量训练机制。我习惯这样做先在仿真器上运行 50 个不同的动态事件剧本把每个剧本下的调度方案全都导出来人工对照查看是否有明显违背常识的决策比如为了省 5 分钟把整条线拉停。这一关过了再接入车间的 MES 系统申请小流量试运行一周。增量训练的机制不可忽视。试运行期间记录真实负载、真实故障数据和工人手动调整的动作把它们追加到回放池。每周末拉取数据做一次轻量微调# 增量微调只更新最后两层 for name, param in model.named_parameters(): if fc1 in name or a_fc in name: param.requires_grad False optimizer torch.optim.Adam( filter(lambda p: p.requires_grad, model.parameters()), lr0.0001 )这里有个经验参数要注意微调的学习率比从头训练低一个数量级设为 1e-4并且固定前几层特征提取的参数只让最后两层适应新分布。这样做的原因是避免灾难性遗忘——模型已经学会的普适调度经验不能被少部分真实数据带跑。源头数据的闭环比网络改进更关键。车间里每天会产生大量的“计划 vs 实际”差异数据这些数据是不断校准奖励函数权重的重要依据。我见过最成功的落地案例是系统上线三个月后维护团队把原始 reward 里的WIP_count权重从 0.01 调到了 0.006只因为现场反馈说在制品数量适中时紧迫感不足以驱动效率提升。这一调整带来的拖期率下降肉眼可见。最后给自己留一个习惯每次训练完保存一个带配置文件的 checkpoint配置文件里写清当次训练的状态维、动作维、奖励权重、事件概率、随机种子。因为你训练的是调度策略但维护时调出来看的往往是三个月前的奖励权重——没有完整的配置文件到时候真的没有后悔药吃。希望这些经验能帮你在做深度强化学习动态柔性车间调度时少走弯路。本文还有配套的精品资源点击获取

相关新闻

Flutter多视频同时播放与缓存优化:播放器池与生命周期管理

Flutter多视频同时播放与缓存优化:播放器池与生命周期管理

1. Flutter 里的“同时播放多个视频”到底难在哪 先说结论: Flutter 的 video_player、chewie 这些插件,默认设计就是“一个播放器实例对应一个视频源”,你如果同时在页面里放三个视频,大概率会看到黑屏、声音重叠、甚至直接 OOM…

2026/10/7 10:34:16 阅读更多 →
Linux高频命令实战:从环境检查到日志排障的运维手册

Linux高频命令实战:从环境检查到日志排障的运维手册

初接手一台不熟悉的服务器,心跳通常会加速半拍。环境变量对不对、服务有没有起来、日志在哪写、磁盘还剩多少,这些问题不摸清楚,后面每一步都像踩在棉花上。Linux的诱惑和门槛恰好都在同一个地方:一切皆文件、一切可脚本化&#x…

2026/10/7 10:34:15 阅读更多 →
TPOT实战指南:用遗传编程自动化机器学习管道与超参数搜索

TPOT实战指南:用遗传编程自动化机器学习管道与超参数搜索

如果你和我一样,每天跟表格数据打交道,肯定经历过这种循环:清洗、编码、试模型、调参、再试模型,小半天就没有了。所谓AutoML,就是把这个循环自动化,而TPOT是其中非常适合“从零上手”的一个库。它能自动搜…

2026/10/7 10:34:13 阅读更多 →

最新新闻

微信小程序毕设实战:智慧党建系统源码解析与二次开发指南

微信小程序毕设实战:智慧党建系统源码解析与二次开发指南

毕设圈子里有个很真实的现状:选题时看啥都想做,真到开工才发现时间根本不够用。小程序方向的题目尤其容易踩坑,因为不是把页面画出来就完事,你需要解决登录、权限、接口联调、真机适配这一连串问题。所以每次有人问我“有没有合适…

2026/10/7 11:51:35 阅读更多 →
分布式对象存储架构设计与实战:从原理到COS应用排查

分布式对象存储架构设计与实战:从原理到COS应用排查

简介:腾讯云分布式对象存储架构设计与实践是一份系统讲解腾讯云对象存储底层架构与产品能力的PDF文档,适合云计算研发、存储架构师及运维人员阅读。内容覆盖从市场背景到核心设计的完整链路:包括高可靠/高安全/高可用/高性能/开放兼容/低成本…

2026/10/7 11:51:35 阅读更多 →
Kolibri MoE模型:1M上下文与Apache 2.0许可的生产级落地实践

Kolibri MoE模型:1M上下文与Apache 2.0许可的生产级落地实践

1. Kolibri 不是又一个“开源大模型”:它重新定义了 MoE 在真实场景中的可用边界 最近在几个技术群里看到有人转发 Aleph Alpha 的新闻稿,标题写着“78B 参数 MoE 开源模型 Kolibri”,底下评论清一色是:“哇,参数量好大…

2026/10/7 11:51:34 阅读更多 →
Janus:基于 Vulkan 的跨平台本地大模型推理运行时

Janus:基于 Vulkan 的跨平台本地大模型推理运行时

1. 项目概述:一个被低估的“全栈本地AI运行时”诞生了 最近在 Hacker News 上刷到一个标题很硬核的项目:“Show HN:Janus——用 Go 单二进制在 AMD/Intel/NVIDIA 上通过 Vulkan 运行 GGUF 模型”。第一眼扫过去,关键词像子弹一样…

2026/10/7 11:51:34 阅读更多 →
Tableau与Superset选型实战:5年踩坑总结与决策矩阵

Tableau与Superset选型实战:5年踩坑总结与决策矩阵

先说结论:Tableau 和 Superset 的对比,根本不是“谁更强”的问题,而是“你的团队和业务长什么样”的问题。5 年下来我在两家公司分别深度用过这两个工具,结论非常明确——Tableau 是那个在你预算充足、需求复杂、团队有人愿意花时…

2026/10/7 11:51:34 阅读更多 →
Agent-Reach 实战:从零搭建 CLI AI Agent 调度框架

Agent-Reach 实战:从零搭建 CLI AI Agent 调度框架

1. 从命令行到智能体:Agent-Reach 到底想解决什么问题第一次看到 Agent-Reach 这个名字,我脑子里蹦出来的画面是“让 Agent 伸手够到真实世界”。后来翻了一圈社区讨论,发现这个理解方向基本对路。它本质上是一个基于 CLI 形态运行的 AI Agen…

2026/10/7 11:50:30 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →