GAMS建模语言:从复杂优化问题描述到高效求解的桥梁
1. 从“算盘”到“超算”为什么我们需要GAMS这样的建模语言如果你曾经尝试过用Excel求解器去优化一个稍微复杂点的生产排程或者用Python的SciPy库去拟合一个非线性回归模型最终却因为变量太多、约束太杂而卡住那你大概能理解那种“想法很丰满工具很骨感”的无力感。我们的大脑擅长构建逻辑和关系但把这种关系翻译成计算机能理解并高效求解的“语言”中间隔着一道巨大的鸿沟。GAMSGeneral Algebraic Modeling System通用代数建模系统就是专门为填平这道鸿沟而生的。简单来说GAMS是一个高级的建模语言和集成环境它的核心任务不是直接去“算”而是让你能以一种近乎自然数学表达的方式把复杂的优化问题“描述”出来。你只需要告诉它“这是我的决策变量这是我要最大化或最小化的目标函数这是所有必须遵守的规则约束条件。” 至于如何把这个问题转换成求解器能吃的“格式”调用哪个求解器线性、非线性、整数规划等以及处理求解过程中的数值稳定性和报告生成GAMS都帮你包办了。这就像是你作为总设计师用专业的工程图纸GAMS模型清晰地表达了建筑构想而GAMS则扮演了项目经理和施工队的角色负责协调混凝土、钢筋不同的求解器并把大楼盖起来。我第一次接触GAMS是在处理一个能源系统的投资规划问题。当时需要决定未来二十年在哪些地方建电厂、建什么类型的电厂煤电、气电、风电、光伏以及它们每年如何运行才能满足不断增长的电力需求同时使总成本投资运行最低还要满足碳排放上限。变量有上万个约束条件错综复杂时间跨度长达20年。用电子表格根本不可能管理。手写算法那得是一个博士团队几年的工作量。而用GAMS我花了大约一周时间学习语法和构建模型框架又花了一周调试数据和验证结果一个可运行、可扩展的优化模型就搭建起来了。这种从“无从下手”到“清晰可控”的转变让我深刻体会到专用建模工具的价值。2. GAMS的核心哲学分离“问题描述”与“求解算法”很多人在入门优化时容易陷入一个误区把大量的精力花在研究算法本身上比如单纯形法、内点法、分支定界法的具体实现。这当然很重要但对于大多数应用科学家、工程师和经济学家来说核心诉求是解决问题而不是发明算法。GAMS的设计哲学正是基于这种“分离关注点”的思想。2.1 声明式 vs. 命令式编程你可以把常见的编程语言如Python、C理解为“命令式”语言。你需要详细地告诉计算机每一步该怎么做“初始化变量A进入循环判断条件B如果成立则计算C否则跳转到D……” 求解一个优化问题你需要自己组织数据、编写算法迭代步骤、处理边界情况。而GAMS是一种“声明式”建模语言。你的代码主要是在声明有哪些集合Sets比如工厂的集合、产品的集合、时间周期的集合。这定义了问题的维度。有哪些参数Parameters已知的数据比如生产成本、需求预测、资源上限。这些是你的输入数据。有哪些变量Variables你需要做出的决策比如每种产品的产量、是否投资某个项目。这些是未知数等待求解。目标是什么Equation用一个数学式子定义你要最大化如利润或最小化如成本的东西。限制条件是什么Equations用一系列等式或不等式方程定义所有变量必须遵守的规则。你不需要写循环去遍历所有工厂和产品来组装约束GAMS的索引和求和功能会自动处理这些。你也不需要指定用哪种算法只需要告诉GAMS这个问题是线性的LP、非线性的NLP还是包含整数变量MIP它会自动为你匹配和调用内置的相应求解器如CPLEX, Gurobi, CONOPT, BARON等。这种方式的巨大优势在于模型逻辑和数据是分离的。你可以用同一套模型逻辑轻松更换不同的数据集进行情景分析。模型本身也更容易阅读、验证和维护因为它更贴近于我们写在纸上的数学公式。2.2 一个简单的例子看清GAMS的样貌理论可能有点抽象我们来看一个经典的“运输问题”例子。假设有3个工厂向4个市场供货已知每个工厂的产能、每个市场的需求以及从每个工厂到每个市场的单位运输成本。问题是如何安排运输量使得总运输成本最低。用数学公式表示很简单目标最小化总成本 Σ从工厂i到市场j的运输量 * 单位成本约束1从每个工厂运出的总量 ≤ 该工厂产能。约束2运到每个市场的总量 ≥ 该市场需求。现在看GAMS代码如何“声明”这个问题Sets i 工厂 / 工厂1, 工厂2, 工厂3 / j 市场 / 市场A, 市场B, 市场C, 市场D /; Parameters a(i) 工厂产能 / 工厂1 350, 工厂2 200, 工厂3 300 / b(j) 市场需求 / 市场A 200, 市场B 150, 市场C 250, 市场D 100 / c(i,j) 从工厂i到市场j的单位运输成本 / 工厂1.市场A 10, 工厂1.市场B 12, 工厂1.市场C 8, 工厂1.市场D 9 工厂2.市场A 8, 工厂2.市场B 10, 工厂2.市场C 9, 工厂2.市场D 11 工厂3.市场A 9, 工厂3.市场B 11, 工厂3.市场C 10, 工厂3.市场D 12 /; Variables x(i,j) 从工厂i到市场j的运输量 z 总运输成本; Positive Variable x; // 运输量不能为负 Equations cost 定义总成本 supply(i) 每个工厂的供应约束 demand(j) 每个市场的需求约束; cost.. z e sum((i,j), c(i,j) * x(i,j)); supply(i).. sum(j, x(i,j)) l a(i); demand(j).. sum(i, x(i,j)) g b(j); Model transport /all/; Solve transport using lp minimizing z; Display x.l, z.l; // 显示最优解和最优目标值即使你第一次看也能大致猜出每部分在做什么。Sets定义了索引Parameters是输入数据Variables是待求的决策变量Equations部分则几乎就是数学公式的直译。最后的Solve语句告诉GAMS“这是一个线性规划LP问题请调用LP求解器最小化目标z。” 整个模型清晰、紧凑且与数学原型高度一致。注意这里的数据是“硬编码”在模型文件里的。在实际项目中更专业的做法是将模型.gms文件和数据例如来自Excel、CSV或数据库通过GDX或GDXXRW工具交换分离这极大地提升了模型的灵活性和可重用性。3. 超越教科书GAMS在复杂现实问题中的建模技巧教科书例子总是完美的正方形但现实问题往往是扭曲的多边形。GAMS的强大之处在于它能优雅地处理这些“不规则”的复杂性。下面分享几个在实际项目中至关重要的高级建模技巧和心得。3.1 处理时间维度与动态关系大多数实际的规划问题都是多期动态的比如能源规划、库存管理、投资计划。这不仅仅是增加一个时间集合t那么简单关键在于如何建模期与期之间的耦合关系。例如在电力系统扩展规划中不仅要知道每年建多少电厂还要考虑电厂的建设周期今年决定建可能三年后才投产、服役寿命、以及像水库蓄水量、设备老化状态等“状态变量”如何随时间传递。在GAMS中这通常通过精心定义变量的索引和约束方程来实现。Sets t 年份 / 2025, 2026, 2027, 2028, 2029 / tech 技术类型 / 煤电, 气电, 风电, 光伏 /; Variables Invest(tech, t) 在年份t对技术tech的新增投资容量决策 Capacity(tech, t) 在年份t技术tech的可用总容量 StateOfCharge(t) 第t年年初水库蓄水量状态变量; Equations capacityBalance(tech, t) 容量平衡方程 stateTransition(t) 状态转移方程; * 容量平衡今年的总容量 去年的总容量 今年新增的投资考虑建设延迟 - 今年退役的容量 capacityBalance(tech, t)$(ord(t)1).. Capacity(tech, t) e Capacity(tech, t-1) Invest(tech, t - lead_time(tech)) - Retire(tech, t); * 状态转移今年年初的蓄水量 去年年初的蓄水量 去年的入库量 - 去年的发电用水量 stateTransition(t)$(ord(t)1).. StateOfCharge(t) e StateOfCharge(t-1) Inflow(t-1) - Generation(t-1) * water_rate;这里用到的$(ord(t)1)是一个条件编译语句表示对第一个时间周期ord(t)1不生成此方程因为对于初始年我们需要单独用Parameter来初始化Capacity和StateOfCharge。lead_time(tech)是一个参数表示每种技术从投资到投产需要的年数。这种表达方式非常直观地刻画了时间的动态性。实操心得处理多期模型时务必画一个时间轴示意图明确每个变量和参数的时间点是期初值、期末值还是期内平均值。定义清楚初始条件和终止条件如规划期末对剩余资产的处理这是模型能否正确模拟动态过程的关键。3.2 混合整数规划MIP与逻辑约束当你的决策中包含了“是否”的选择时比如“是否在这个地点建工厂”、“是否启动这台设备”就需要引入0-1整数变量。GAMS处理这类混合整数规划MIP问题非常成熟。但更挑战的是如何用线性约束来表达复杂的逻辑关系。例如互斥选择项目A和项目B至多只能选一个。x_A x_B 1x为0-1变量。依赖关系如果项目A被选中x_A1那么项目B也必须被选中x_B1。x_A x_B。固定成本只要生产某种产品无论产量多少都需要支付一笔固定的启动成本。这需要引入一个辅助的0-1变量y来表示是否生产以及一个“大M”约束production M * y其中M是一个足够大的数例如最大可能产量同时目标函数中增加一项fixed_cost * y。分段线性函数有时成本或收益并不是线性的而是分段的。比如电价随着用电量阶梯上升。这可以通过引入多个辅助连续变量和0-1变量将分段函数精确地线性化从而仍然能用高效的MIP求解器处理。踩坑记录“大M”法虽然常用但选择不恰当的M值会严重影响求解性能。M值过大会造成模型松弛质量差求解器需要探索更多分支M值过小可能会错误地割掉最优解。一个最佳实践是根据问题的实际物理或经济意义为每个约束选取尽可能紧的、最小的M值。例如如果production变量实际最大不可能超过1000那么M就取1000而不是随便取个1e6。3.3 非线性模型与初值的重要性当目标函数或约束中包含变量的乘除、指数、对数等运算时问题就变成了非线性规划NLP。GAMS拥有如CONOPT、IPOPT、BARON等强大的NLP求解器。然而非线性世界是“险恶”的。一个模型在数学上成立不代表求解器能轻松找到最优解。最大的敌人是局部最优解和收敛失败。求解器像是一个盲人登山者它只能感知脚下的局部坡度。如果起点初始值在一个小山坡的底部它可能爬到这个山坡顶就停下了却不知道远处还有更高的山峰。因此为非线性变量提供良好的初始值.l后缀至关重要。这通常来自物理或经济常识比如价格初始值设为历史平均值产量设为产能的一半。求解一个简化模型先固定一些复杂变量或松弛一些约束求解一个线性或更简单的模型用它的解作为完整非线性模型的初值。同伦法逐步调整模型参数从一个容易求解的状态连续变化到目标状态用上一步的解作为下一步的初值。在GAMS中你可以这样设置初始值Variable x; x.l 10; // 为变量x设置初始值为10经验之谈如果模型求解失败出现Infeasible或Error不要急于修改模型。首先检查.lst文件中的求解过程报告看看迭代在哪里停止变量的值是否变得异常大1E10或异常小。这常常能提示你哪个约束或方程导致了数值问题。其次尝试用不同的初始值组合或者换一个求解器例如从CONOPT换到IPOPT。有时仅仅是一个好的起点就能让一个“顽劣”的模型顺利收敛。4. 从模型到决策GAMS工作流与结果分析构建一个能求解的模型只是第一步让模型产出支撑决策的洞见才是最终目的。一个完整的GAMS项目工作流通常包含以下几个环节每个环节都有需要注意的细节。4.1 数据管理与预处理“垃圾进垃圾出”在优化领域尤其正确。GAMS本身不擅长复杂的数据清洗和整理因此需要与其他工具配合。数据输入对于中小型项目Excel通过GDXXRW或ODBC是最常用的数据接口。将数据按集合维度整理在Excel表格中然后导入GAMS成为参数。对于大型或需要自动化的工作流则更多使用CSV文件或直接连接数据库如Access, SQLite。数据检查在正式求解前一定要编写检查语句。例如检查供需是否平衡总产能是否大于总需求检查成本矩阵是否有缺失值检查所有参数是否为正数如果物理意义要求如此。这可以避免因数据错误导致的模型无解或得出荒谬结果。scalar check_demand; check_demand sum(j, b(j)) - sum(i, a(i)); if (check_demand 0, abort 错误总需求大于总产能模型必然无解; );生成GDX文件GDX是GAMS的专用二进制数据交换格式读写速度快是保存中间数据或模型结果的最佳选择。你可以将清洗好的数据导出为GDX供模型读取也可以将求解结果保存为GDX供后续分析或报告生成使用。4.2 模型调试与验证新建立的模型几乎不可能一次运行成功。调试是必经之路。从简到繁不要一开始就把所有约束都加上。先构建一个只有核心变量和约束的“骨架模型”确保它能求解并得到合理结果。然后像搭积木一样逐步加入更复杂的约束模块每加一个都测试一次。检查方程列表使用ModelName.命令可以生成模型的方程列表这是一个强大的调试工具。你可以检查某个特定的约束在特定索引下的具体形式看看它是否和你预想的数学公式一致。利用Option在调试阶段可以设置Option limrow10, limcol10;来让GAMS在遇到无解或不可行时列出导致问题的最相关的10行方程和10个变量这能极大缩短定位问题的时间。验证解的正确性对于求得的解不要盲目相信。应该手动选取几个关键约束将解的值代入方程检查是否满足。或者设计一些简单的、已知答案的测试用例来验证模型逻辑。4.3 结果输出与情景分析求解完成后你需要从x.l变量水平值和marginal约束的边际值即影子价格中提取信息。基本输出Display命令是最简单的输出方式。但对于大型模型更常用的方法是将关键结果导出到GDX文件然后用GAMS的IDE工具查看或者用其他工具如Python的pandasgdxpds库或R的gdxrrw包进行进一步分析和可视化。理解影子价格这是优化模型提供的、比最优解本身更宝贵的洞见。一个资源约束的影子价格代表了该资源每增加一个单位目标函数能改善多少。例如在运输问题中一个工厂产能约束的影子价格就代表了在该工厂增加一单位产能所能节省的边际运输成本。这为“在哪里投资扩容最有效”提供了直接的经济信号。情景分析这是模型价值的核心体现。通过改变关键参数如需求预测、燃料价格、政策目标重新求解模型观察最优决策如何变化。GAMS的循环和Solve语句可以很容易地实现自动化情景分析。你需要关注的不仅是最终的最优值更是决策变量的结构性变化。例如当碳价上升到某个阈值时投资组合是否从煤电完全转向了可再生能源这个“拐点”就是非常重要的决策参考。4.4 性能优化让大规模模型跑得更快当模型规模变大变量和约束达到数十万甚至上百万时求解时间可能成为瓶颈。除了升级硬件和购买更快的商业求解器如Gurobi, CPLEX外从建模角度也能做很多优化模型重构有时一个紧凑的模型公式比一个直观但冗长的公式求解更快。例如避免使用大量的是非逻辑$条件尝试用更平滑的数学形式重新表达。提供好的初始解对于MIP和NLP一个好的初始解能显著减少求解时间。可以用启发式方法或简化模型先求一个解。调整求解器选项每个求解器都有大量可调参数。例如对于MIP可以调整“重点”是优先找可行解还是证明最优性、启发式算法的强度、割平面生成的策略等。这需要你对求解器有一定了解并通过反复试验找到适合当前问题的配置。利用并行计算现代求解器如CPLEX, Gurobi都支持多线程并行求解MIP的各个分支。在GAMS中可以通过Option threads4;这样的语句来设置使用的线程数。我个人在处理一个大型供应链网络优化模型时最初版本求解需要数小时。通过分析求解日志发现大部分时间花在了处理大量“小”的固定成本约束上。我重构了模型将这些约束进行了聚合并在保证精度的前提下放松了一些非关键的整数要求最终将求解时间缩短到20分钟以内而最优解的成本差异不到0.1%。这种在模型精度和求解效率之间的权衡是实际应用中必须掌握的技能。GAMS不是一个“一键求解”的黑箱而是一个强大的、需要与之深度对话的伙伴。从最初的模型构思、数据准备到中间的调试打磨再到最后的结果解读与情景推演整个过程既是对问题的深入剖析也是对逻辑思维的严格训练。当你看到自己构建的模型在求解器的驱动下从海量可能性中为你找到那个最优的答案并给出深刻的经济学解释时那种成就感是无可替代的。它让你从数据的被动处理者转变为用数学模型主动探索和塑造未来的决策者。

相关新闻

基于YOLOv11的焊接缺陷检测系统实战:从数据到部署全流程解析

基于YOLOv11的焊接缺陷检测系统实战:从数据到部署全流程解析

简介:焊接质量检测是工业制造中的关键环节,传统人工目检效率低且容易漏检。随着深度学习与机器视觉技术的融合发展,基于目标检测的自动化缺陷识别已逐步成为智能质检的核心方向。YOLOv11作为新一代实时目标检测算法,通过C3k2模块与…

2026/8/27 6:49:32 阅读更多 →
定日镜场优化设计:从太阳位置建模到能流密度计算的数学建模实战

定日镜场优化设计:从太阳位置建模到能流密度计算的数学建模实战

1. 从“晒太阳”到“烧开水”:定日镜场优化设计的核心逻辑如果你关注过新能源,尤其是光热发电,那你一定对“定日镜场”这个词不陌生。简单来说,它就是一个由成千上万面镜子组成的巨大阵列,核心任务就是把太阳光精准地反…

2026/8/27 6:49:32 阅读更多 →
机器人开发项目复盘:从技术选型到联调落地的34周实战经验

机器人开发项目复盘:从技术选型到联调落地的34周实战经验

周报写到第 34 周的时候,我盯着模板里的“本周进展”“下周计划”看了很久。这个项目的机器人不会再有“下周计划”了——项目收尾,联调结束,文档归档,机器人断电停在调试工位上,像一位完成任务后安静退场的队友。回看…

2026/8/27 6:49:32 阅读更多 →

最新新闻

基于MATLAB GUI的AIS船舶数据显示系统开发与实现

基于MATLAB GUI的AIS船舶数据显示系统开发与实现

1. 项目背景与核心价值:为什么我们需要一个AIS船舶显示系统? 如果你曾经关注过港口管理、海事安全或者船舶轨迹分析,那么你一定听说过AIS。AIS,全称自动识别系统,是现代航海领域的一项基础性技术。简单来说&#xff0c…

2026/8/27 7:43:56 阅读更多 →
VR3D:基于3D表示学习的空中-地面行人重识别方法解析

VR3D:基于3D表示学习的空中-地面行人重识别方法解析

在实际安防项目中,空中无人机与地面固定摄像机需要协作锁定同一个目标时,会频繁出现同一个行人在空中视角和地面视角之间切换的情况。Aerial-Ground Person Re-Identification(跨空-地行人重识别)要解决的核心问题是:给…

2026/8/27 7:43:56 阅读更多 →
LLM 辅助技术博客写作:场景拆解、落地工作流与风险规避

LLM 辅助技术博客写作:场景拆解、落地工作流与风险规避

之前帮团队搭建技术博客后台时,我一直在反思一个问题:为什么现在开发者写技术文章越来越离不开 LLM?为了搞清楚这件事,我花了三周时间观察日常写作流程,也翻了不少开源项目和社区讨论,最后整理出这份完整报…

2026/8/27 7:43:56 阅读更多 →
VR3D:空中-地面行人重识别的3D表征学习方案

VR3D:空中-地面行人重识别的3D表征学习方案

无人机与地面摄像头组成的协同监控系统,在智慧城市、安防巡检、搜救测绘等领域已经越来越常见。随之而来的一个核心技术问题是:当空中的无人机视角和地面的固定摄像头视角同时捕捉到同一个人时,如何可靠地判断“这是同一个人”。这个问题在学…

2026/8/27 7:43:56 阅读更多 →
SSI首个模型上线在即:从评测到部署的完整验证指南

SSI首个模型上线在即:从评测到部署的完整验证指南

Ilya Sutskever 创立的 SSI,首个模型被曝本月上线。消息一出,AI 圈讨论度直接拉满。但严格来说,目前关于这个模型的官方技术信息几乎没有:模型叫什么、参数多少、上下文多长、是否开源,都还没有确认。也就是说&#xf…

2026/8/27 7:43:56 阅读更多 →
Kimi-K3大模型:2.8T参数与百万上下文技术解析与实战

Kimi-K3大模型:2.8T参数与百万上下文技术解析与实战

这段时间,国产大模型在“长文本”和“复杂推理”上的竞争明显提速了。很多开发者开始关注的不再是“模型会不会聊天”,而是“能不能把整本技术文档、一整个代码仓库、几十页合同一次性丢给它做理解”。阿里云与月之暗面联合带来的 Kimi-K3,正…

2026/8/27 7:42:56 阅读更多 →

日新闻

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

2026/8/27 0:00:51 阅读更多 →
网盘直链下载助手5分钟解析八大网盘真实地址

网盘直链下载助手5分钟解析八大网盘真实地址

网盘直链下载助手5分钟解析八大网盘真实地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 / 夸…

2026/8/27 1:06:27 阅读更多 →
从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南

从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南

从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 Arduino ESP32 是乐鑫官方的 ESP32 系列 Ardui…

2026/8/27 1:06:27 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →