算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)

文章目录

  • 前言
  • 一、背包问题溯源(动态规划)
    • 1.1 动态规划的概念
    • 1.2 动态规划的基本步骤
    • 1.3 动态规划的实际应用
  • 二、背包问题
    • 2.1 背包问题衍生
    • 2.2 0-1背包
      • 2.2.1 0-1背包描述
      • 2.2.2 0-1背包图解
      • 2.2.3 0-1背包代码刨析
    • 2.3 完全背包
      • 2.3.1 完全背包描述
      • 2.3.2 完全背包图解
      • 2.3.3 完全背包代码刨析
    • 2.4 0-1背包&完全背包
      • 2.4.1 0-1背包&完全背包表格PK
      • 2.4.2 0-1背包&完全背包使用场景
  • 三、背包问题总结
  • 献给读者


在这里插入图片描述
在这里插入图片描述


福利福利💌💌💌免费的JAVA学习资料网盘地址: 👉👉👉 点我!


前言

背包问题:优化之旅的起点
在计算机科学和运筹学领域,有一个问题如同璀璨的明珠般闪耀,它就是背包问题(Knapsack Problem)。无论你是初入算法世界的探索者,还是经验丰富的技术专家,背包问题都以其独特的魅力和广泛的应用场景,成为了一个不可忽视的研究主题。从资源分配到投资决策,再到货物装载方案设计,背包问题无处不在,它是解决实际问题的一个缩影。

本博客系列将深入探讨背包问题的各种变体,包括但不限于0-1背包、完全背包以及多重背包问题。我们将从基础理论出发,逐步揭开这些问题背后的数学原理,探究其复杂性,并展示如何运用动态规划、贪心算法等经典策略来寻找有效的解决方案。此外,我们还将通过具体的编程实例,使用如Java、Python等语言,帮助你更直观地理解这些算法的工作机制。

在这个过程中,我们不仅会讨论如何解决问题,还会分析不同方法之间的优缺点,以及它们在实际应用中的表现。希望这个系列能够为你提供宝贵的见解,并激发你在自己的项目中创造性地应用所学知识。

让我们一起踏上这段充满挑战与发现的优化之旅,解锁背包问题背后隐藏的无限可能吧!

一、背包问题溯源(动态规划)

背包问题的起源于动态规划,关于动态规划大家都已经不陌生了,利用动态方程状态转移的思想处理问题。下面会从多个方面介绍动态规划,达到’无孔不入’的境界。

1.1 动态规划的概念

动态规划(Dynamic Programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。它在解决优化问题方面非常有效,尤其是在问题具有重叠子问题和最优子结构性质时。以下是动态规划的一些关键概念:

  • 重叠子问题:子问题重复出现多次。为了提高效率,我们可以将每个子问题的答案存储起来,这样每次遇到同样的子问题时可以直接使用之前计算的结果,而不是重新计算。
  • 最优子结构:一个问题的最优解可以从其子问题的最优解构建而来。这意味着我们可以通过解决小规模的问题来构建大规模问题的解决方案。
  • 无后效性:一旦某个子问题的解确定了,就不会受到后续决策的影响。也就是说,某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响。

1.2 动态规划的基本步骤

  • 定义状态:明确问题中的变量以及这些变量之间的关系。
  • 建立状态转移方程:找出状态之间是如何转换的,即如何从一个或多个已知状态推导出未知状态。
  • 设定初始条件和边界条件:考虑最小可能输入的情况,并设置相应的初始值。
  • 选择计算顺序:决定是使用自底向上还是自顶向下的方法进行计算。自底向上通常涉及到填表,而自顶向下则通常是递归加上记忆化搜索。

1.3 动态规划的实际应用

应用实例
动态规划广泛应用于许多领域,如计算机科学、数学、经济学、生物信息学等。常见的应用包括但不限于:

  • 最短路径算法(例如Floyd-Warshall算法)
  • 背包问题
  • 字符串匹配问题
  • 矩阵链乘法

💡贴士:动态规划的关键在于识别出可以被分解成更小问题的模式,并有效地利用已经解决的子问题答案来构造最终解。通过这种方式,即使面对原本看起来很复杂的任务,也能找到高效的解决方案。

二、背包问题

2.1 背包问题衍生

背包问题Knapsack Problem)是组合优化中的一个经典问题,它涉及到在一定的约束条件下选择物品以达到某种最优化目标。这个问题有多种变体,但最常见的形式是如何在限制重量的前提下最大化背包中物品的总价值。
背包问题(Knapsack Problem)是动态规划领域中一个非常经典的问题,它描述了在有限的资源限制下如何最大化收益的情形。根据具体条件的不同,背包问题可以分为多种类型,包括0-1背包问题、完全背包问题、多重背包问题等。以下是几种主要的背包问题及其衍生:

  1. 0-1 背包问题
    这是最基本的形式,每个物品只有一个,并且对于每个物品你只能选择要么放入背包(1),要么不放(0)。目标是在不超过背包容量的前提下,使所选物品的总价值最大。
  • 解决方法:动态规划是一种常用的解决方法,通过构建一个二维数组来记录在不同容量和不同物品数量下能达到的最大价值。
  1. 完全背包问题
    在这种变体中,每种类型的物品都有无限个,即可以选取同一种物品多次。目标同样是在不超过背包容量的情况下最大化背包内物品的总价值。
  • 解决方法:与0-1背包类似,但需要对每种物品进行多次尝试,考虑其重复添加的可能性。
  1. 多重背包问题
    多重背包问题是0-1背包的一个扩展,其中每个物品的数量有限。也就是说,对于每种物品,你可以选择放入背包一定次数(可能是0次、1次或更多,但不是无限次)。
  • 解决方法:可以通过将多重背包转换为0-1背包问题处理,即将每种物品根据其可选次数拆分成多个独立的物品;或者使用更高级的动态规划技巧直接解决。
  1. 分数背包问题
    在分数背包问题中,物品是可以被分割的,这意味着你可以取某个物品的一部分放入背包。这通常使得问题变得相对简单,因为可以通过贪心算法有效地解决——优先选择单位重量价值最高的物品。
  • 解决方法:首先计算每个物品的单位重量价值,然后按照这个值从高到低排序,尽可能多地放入单位重量价值最高的物品直到背包满为止。

💡贴士:这些背包问题及其衍生问题广泛应用于资源分配、投资决策等领域,它们展示了如何在有限资源的情况下做出最优决策。理解和掌握这些问题的解法有助于解决实际生活中的许多优化问题。

2.2 0-1背包

2.2.1 0-1背包描述

💡贴士:因为公式在文章中不好展示,直接文档截图分析。

在这里插入图片描述

2.2.2 0-1背包图解

图解法可以帮助我们更直观地理解0-1背包问题解决过程。

0-1 背包问题
假设我们有3个物品,其重量分别为2, 3, 4,价值分别为3, 4, 5,背包的最大承重为5。我们可以用一个二维表格来表示不同容量下,考虑前i个物品时可以获得的最大价值。
在这里插入图片描述
在这个表中,行代表考虑前i个物品,列代表当前背包的容量。例如,dp[2][3] = 4意味着考虑前2个物品且背包容量为3时,最大可以得到的价值是4。

当考虑是否放入第i个物品时,如果该物品的重量大于当前容量,则不能放入,此时最大价值等于不放入该物品时的最大价值(即dp[i-1][j])。
如果可以放入,则需要比较放入与不放入两种情况下的最大价值,并选择较大的那个。

💡贴士:通过二维表,每一格表示在特定背包容量下考虑一定数量的物品所能达到的最大价值。关键在于决定是否将当前物品加入背包,这取决于加入后的总价值是否超过不加入的情况。

2.2.3 0-1背包代码刨析

在这里插入图片描述

public class ZeroOneKnapsack {// 主函数,计算给定物品重量、价值以及背包容量下的最大价值public static int knapsack(int[] weights, int[] values, int capacity) {int n = weights.length; // 获取物品数量// 创建二维数组dp,其中dp[i][j]表示前i个物品在容量为j时的最大价值int[][] dp = new int[n + 1][capacity + 1];// 遍历每一个物品for (int i = 1; i <= n; i++) {// 对于每一个可能的背包容量for (int w = 1; w <= capacity; w++) {// 如果当前物品可以放入背包(即当前物品重量小于等于当前背包容量)if (weights[i - 1] <= w) {// 计算是否放入该物品的价值,并取两者中的较大值dp[i][w] = Math.max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1]);} else {// 如果当前物品无法放入,则不改变最大价值dp[i][w] = dp[i - 1][w];}}}// 返回考虑所有物品且背包容量为capacity时的最大价值return dp[n][capacity];}public static void main(String[] args) {// 物品的重量数组int[] weights = {2, 3, 4, 5};// 物品的价值数组int[] values = {3, 4, 5, 6};// 背包的最大承重能力int capacity = 5;System.out.println("Maximum value in Knapsack = " + knapsack(weights, values, capacity));}
}

2.3 完全背包

2.3.1 完全背包描述

💡贴士:因为公式在文章中不好展示,直接文档截图分析。

在这里插入图片描述

2.3.2 完全背包图解

对于完全背包问题,我们依然使用上述的例子,但这次每种物品可以选择多次。同样,我们可以用一个表格来展示这个过程,但由于每个物品可以选择多次,因此状态转移方式有所不同。

在这里插入图片描述

在完全背包问题中,当我们考虑某个物品时,我们需要从小到大遍历背包容量,这样就可以确保同一个物品被多次考虑。例如,在处理第一个物品时,当背包容量为4时,我们可以选择放入两个重量为2的物品,从而获得价值为6的结果。

💡贴士:完全背包问题:虽然也可以用类似的表格表示,但处理方式上有所区别,主要是因为允许重复选择物品。遍历时从当前物品的重量开始,逐步增加背包容量,以便能够多次选择同一个物品。

2.3.3 完全背包代码刨析

在这里插入图片描述

public class CompleteKnapsack {// 主函数,计算给定物品重量、价值以及背包容量下的最大价值(允许重复选择物品)public static int knapsack(int[] weights, int[] values, int capacity) {int n = weights.length; // 获取物品数量// 使用一维数组来保存状态,优化空间复杂度int[] dp = new int[capacity + 1];// 遍历每一个物品for (int i = 0; i < n; i++) {// 对于每一个可能的背包容量(从当前物品重量开始遍历)for (int w = weights[i]; w <= capacity; w++) {// 更新当前容量下能获得的最大价值dp[w] = Math.max(dp[w], dp[w - weights[i]] + values[i]);}}// 返回背包容量为capacity时的最大价值return dp[capacity];}public static void main(String[] args) {// 物品的重量数组int[] weights = {2, 3, 4, 5};// 物品的价值数组int[] values = {3, 4, 5, 6};// 背包的最大承重能力int capacity = 5;System.out.println("Maximum value in Knapsack = " + knapsack(weights, values, capacity));}
}

2.4 0-1背包&完全背包

2.4.1 0-1背包&完全背包表格PK

特性/维度0-1 背包问题完全背包问题
物品选择次数每种物品最多只能选择一次(拿或不拿)每种物品可以选择无限次(只要不超过背包容量)
状态转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) 对于所有 j >= w[i]dp[j] = max(dp[j], dp[j-w[i]] + v[i]) 需要从小到大遍历背包容量
空间优化可以使用二维数组,也可以通过滚动数组优化为一维数组通常直接采用一维数组进行优化,简化空间复杂度
遍历顺序对于每个物品,从后向前遍历背包容量,避免覆盖尚未使用的旧值对于每个物品,从前向后遍历背包容量,确保可以多次选择同一个物品
适用场景示例如有限数量的资源分配、投资组合优化等如生产计划安排、资源无限供应下的最佳分配方案等
算法实现复杂度时间复杂度:O(nW),空间复杂度:可优化至O(W)时间复杂度:O(nW),空间复杂度:同样可优化至O(W)

2.4.2 0-1背包&完全背包使用场景

0-1背包问题完全背包问题都是经典的背包问题变种,它们的主要区别在于每种物品可以被选择的次数以及如何处理这种选择。以下是这两种问题的具体区别:


0-1背包问题
定义:
在0-1背包问题中,对于每个物品,你只能选择要么拿(1),要么不拿(0)。换句话说,每种物品你只能选择一次或完全不选择。

解决思路:
使用动态规划的方法来解决问题。
创建一个二维数组dp[i][j],其中i表示考虑前i个物品,j表示当前背包的承重能力。
状态转移方程为:如果第i个物品不放入背包,则dp[i][j] = dp[i-1][j];如果放入,则dp[i][j] = dp[i-1][j-w[i]] + v[i](前提是j >= w[i])。
最终答案是dp[n][W],其中n是物品总数,W是背包的最大承重能力。

特点:
每个物品最多只能选择一次。
需要仔细考虑是否将某个特定物品放入背包以达到最优解。


完全背包问题
定义:
在完全背包问题中,与0-1背包不同的是,这里的每种物品都有无限件可用。也就是说,同一个物品可以选择多次放入背包。

解决思路:
同样使用动态规划方法,但状态转移的方式略有不同。
对于每个物品,不是简单地决定放还是不放,而是需要考虑放多少个该物品能带来最大的价值。
可以通过调整遍历顺序(从小到大遍历背包容量)来实现对同一物品的重复选择。
状态转移方程简化为一维数组形式:dp[j] = max(dp[j], dp[j-w[i]] + v[i]),这里遍历背包容量j时应从小到大遍历,以确保每种物品可以被多次选择。

特点:
每个物品可以选择任意次(只要不超过背包的承重限制)。
由于物品可以重复选择,因此算法需要特别注意如何有效地处理这种重复选择的可能性,通常通过改变遍历顺序来实现。


💡贴士:两者主要的区别在于物品的选择次数上:0-1背包问题限制每种物品只能选择一次,而完全背包问题允许每种物品选择无数次。此外,在具体实现上,0-1背包问题通常从后向前遍历容量以避免覆盖尚未使用的旧值,而完全背包问题则从前向后遍历,以便充分利用已更新的数据。

三、背包问题总结

特性/维度0-1 背包问题完全背包问题多重背包问题
物品选择次数每种物品最多只能选择一次每种物品可以选择无限次每种物品可以选择有限次(给定具体数量)
状态转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])dp[j] = max(dp[j], dp[j-w[i]] + v[i]) 遍历顺序从前向后使用二进制优化或直接扩展为多个相同物品处理
空间优化可以使用二维数组,也可以通过滚动数组优化为一维数组通常采用一维数组进行优化同样可以采用一维数组进行优化
遍历顺序对于每个物品,从后向前遍历背包容量对于每个物品,从前向后遍历背包容量依据具体实现,可能需要结合0-1背包或完全背包的遍历策略
适用场景示例如有限数量的资源分配、投资组合优化等如生产计划安排、资源无限供应下的最佳分配方案当物品的数量有限且各不相同时的应用场景
算法实现复杂度时间复杂度:O(nW),空间复杂度:可优化至O(W)时间复杂度:O(nW),空间复杂度:同样可优化至O(W)时间复杂度取决于具体实现,最坏情况下为O(nWm),其中m是物品的最大重复数
解决方法动态规划动态规划动态规划,但需要额外处理物品数量限制
特殊技巧-利用遍历顺序从小到大来允许同一物品被多次选择使用二进制拆分法将物品数量转化为多个0-1背包问题
示例输入物品数量n=3, 重量=[2, 3, 4], 价值=[3, 4, 5], 背包容量W=5同上物品数量n=3, 重量=[2, 3, 4], 价值=[3, 4, 5], 数量=[1, 2, 1], 背包容量W=5
输出解释最大价值最大价值最大价值
实际应用投资决策、资源分配生产计划、库存管理库存管理、采购决策

解释:

  • 👉物品选择次数:指每种物品在背包中能被选择的次数。
  • 👉状态转移方程:描述了如何根据之前的状态计算当前状态的最大价值。
  • 👉空间优化:展示了如何减少算法所需的空间复杂度。
  • 👉遍历顺序:说明了在动态规划过程中如何遍历物品和背包容量以达到正确的结果。
  • 👉适用场景示例:提供了几种典型的应用场景,帮助理解不同类型背包问题的实际用途。
  • 👉算法实现复杂度:列出了时间复杂度和空间复杂度,这对于评估算法效率至关重要。
  • 👉解决方法:简要介绍了每种背包问题的基本解决策略。
  • 👉特殊技巧:列举了一些特定于该类型背包问题的技巧或注意事项。
  • 👉示例输入:提供了一个具体的例子作为参考。
  • 👉输出解释:解释了算法最终输出的结果代表的意义。
  • 👉实际应用:进一步拓展了理论知识到现实世界中的应用场景。

在这里插入图片描述


献给读者


💯 计算机技术的世界浩瀚无垠,充满了无限的可能性和挑战,它不仅是代码与算法的交织,更是梦想与现实的桥梁。无论前方的道路多么崎岖不平,希望你始终能保持那份初心,专注于技术的探索与创新,用每一次的努力和进步书写属于自己的辉煌篇章。

🏰在这个快速发展的数字时代,愿我们都能成为推动科技前行的中坚力量,不忘为何出发,牢记心中那份对技术执着追求的热情。继续前行吧,未来属于那些为之努力奋斗的人们。


亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现爬虫:天气数据抓取(+折线图)

一、基本架构 1、URL管理器&#xff1a;爬虫的调度中枢 核心职责 功能说明URL去重防止重复抓取URL优先级管理控制抓取顺序&#xff08;广度优先/深度优先&#xff09;断点续爬支持持久化存储抓取状态分布式协同多节点共享URL队列 2、网页下载器&#xff1a;数据获取的引擎 功…

DFS刷题

洛谷P2089烤鸡 #include<iostream> using namespace std; const int N 20, M 1000010; int ans[N]; int dp[M][N]; int n, count; void dfs(int x, int sum){if(sum > n)return;if(x > 10){if(sum n){count;for(int i 1; i < n; i)dp[count][i] ans[i];}r…

《Operating System Concepts》阅读笔记:p460-p4470

《Operating System Concepts》学习第 36 天&#xff0c;p460-p4470 总结&#xff0c;总计 11 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;3) 1.lifespan (1)lifespan: life span(“the period of time that sth exists or happens”) c. 也写作 life-span, …

stratis,容器podman

一、stratis 1.stratis可以实现动态的在线扩容&#xff0c;lvm虽然也可以实现在线扩容&#xff0c;但是是需要人为的手动扩容。 2.stratis不需要手动格式化&#xff0c;自动会创建文件系统&#xff08;默认是xfs&#xff09; 1. 安装stratis软件包 yum list | grep stratis…

音频焦点 Android Audio Focus

Android 音频焦点详解 音频焦点&#xff08;Audio Focus&#xff09;是 Android 系统用于协调多个应用同时访问音频输出的机制。当多个应用需要播放音频时&#xff0c;音频焦点确保用户听到的内容不会混乱&#xff08;如多个音乐应用同时播放&#xff09;。以下从核心概念、使…

【用 Trace读源码】PlanAgent 执行流程

前提条件 在 Trae 中打开 OpenManus 工程&#xff0c;使用 build 模式&#xff0c;模型选择 claude-sonnet-3.7 提示词 分析 agent/planning.py 中 main 方法及相关类的执行流程&#xff0c;以流程图的方式展示PlanningAgent 执行流程图 以下流程图展示了 PlanningAgent 类…

1、双指针法

关于每个知识点的例题 可以自己看力扣标准题解。也可以在哔哩哔哩上看。想看我的&#xff0c;就到github 看 - 库 &#xff0c;介绍里写的算法讲解那些&#xff0c;里面有知识点&#xff0c;有题库。题库&#xff0c;每天都发题&#xff0c;可能跟博客的进度不一样。因为我上传…

LangChain 基础

一、LangChain 模块和体系 LangChain 是一个用于开发由大型语言模型&#xff08;LLMs&#xff09;驱动的应用程序的框架。 官方文档&#xff1a;https://python.langchain.com/docs/introduction/ LangChain 简化了LLM应用程序生命周期的每个阶段&#xff1a; 开发&#xf…

#echarts#折线图#饼图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>折线图</title> </head> <body><div id"app" style"width:100%;height:100%;"><div id"chart-c…

Parsing error: Unexpected token, expected “,“

今天在使用Trae AI 编程工具开发大文件切片上传功能&#xff0c;使用的是VUE3,TS技术栈&#xff0c;开发完成运行时&#xff0c;编译报错&#xff08;Parsing error: Unexpected token, expected ","&#xff09;&#xff0c;让AI自行修复此问题多次后还是没有解决&a…

NLP高频面试题(九)——大模型常见的几种解码方案

大模型常见的几种解码方案 在自然语言生成任务中&#xff0c;如何从模型生成的概率分布中选择合适的词汇&#xff0c;是影响文本质量的关键问题。常见的解码方法包括贪心搜索&#xff08;Greedy Search&#xff09;、束搜索&#xff08;Beam Search&#xff09;、随机采样&…

农用车一键启动工作原理

移动管家农用车一键启动的工作原理与普通汽车类似&#xff0c;主要依赖于无线射频识别技术&#xff08;RFID&#xff09;。以下是具体的工作步骤和原理&#xff1a; 智能钥匙识别&#xff1a; 车主携带智能钥匙靠近车辆时&#xff0c;钥匙通过发射射频信号与车辆进行交互。车辆…

Cursor从小白到专家

文章目录 1&#xff1a;简单开发一个贪吃蛇游戏规则设置提示词 cursor开发小工具开发整体步骤创建.cursorrules输入提示词composer模式chat模式 执行cursor accept all发布到线上进行分享 cursor开发一个浏览器插件创建.cursorrulescursor rules范例集工具 输入提示词执行curso…

MAC+PHY 的硬件连接

文章目录 以太网的 MAC 与 PHY简介硬件拓扑CPU集成MAC与PHYCPU集成MAC&#xff0c;PHY采用独立芯片CPU不集成MAC与PHY&#xff0c;MAC与PHY采用集成芯片 在 OSI 分层中的位置MACPHYMAC 与 PHY 数据交互参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均…

仿函数 VS 函数指针实现回调

前提&#xff1a; 本博客对比 函数指针实现回调 和 仿函数 &#xff0c;突出仿函数的优势。 目的&#xff1a; 一个类要能够灵活的调用两个函数&#xff0c;essfc 和 greaterfc&#xff0c;分别用于比较两个整数的大小&#xff1a; ①&#xff1a;lessfc&#xff1a;判断 x …

CH32V208蓝牙内部带运放32位RISC-V工业级微控制器

开发板 CH32V208CBU6立创格式的开发板上述链接可下载&#xff0c;官方文件进行了转换&#xff0c;使用前请仔细核对。 CH32V208CBU6原理图&#xff0c;上述图片为芯片部分。已进行DRC。 CH32V208CBU6 PCB三维图&#xff0c;上述图片为芯片部分。已进行DRC。 概述 CH32V208C…

整理和总结微信小程序的高频知识点

前言 近期萌生了一些想法&#xff0c;感觉可以做一个小程序作为产出。 但小程序做得比较少&#xff0c;因此边做边复习。整理和总结了一些高频知识点和大家一起分享。 一、模板和组件 1.1模板&#xff08;Template&#xff09; 优势 简单灵活&#xff1a;模板定义和使用都较…

1996-2023年各省公路里程数据(无缺失)

1996-2023年各省公路里程数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;公路里程&#xff08;万公里&#xff09; 4、范围&#xff1a;31省 5、指标解释&#xff1a;公路里程指报告期末…

SEARCH-R1:大型语言模型的多轮搜索推理革命

当AI学会"边搜索边思考" 2025年&#xff0c;语言模型领域迎来重大突破——SEARCH-R1框架通过强化学习&#xff08;RL&#xff09;让大模型实现"动态搜索自主推理"的协同进化。这项技术不仅让模型在回答"泰坦尼克号沉没时的船长是谁"时能自动检索…

Wi-Fi NAN 架构(Wi-Fi Aware Specification v4.0,第2章:2.7~2.9)

1. NAN 介质访问控制层&#xff08;MAC&#xff09; NAN MAC负责通过参与 NAN同步信标帧&#xff08;NAN Synchronization Beacon frame&#xff09;的传输&#xff0c;获取并维护设备所在的NAN集群的同步。作为同步功能的一部分&#xff0c;NAN MAC运行 TSF 定时器。NAN MAC还…