RTC的Google拥塞控制算法 rmcat-gcc-02

news2024/11/25 13:32:34

摘要

本文档描述了使用时的两种拥塞控制方法万维网(RTCWEB)上的实时通信;一种算法是基于延迟策略,一种算法是基于丢包策略

1.简介

拥塞控制是所有共享网络的应用程序的要求互联网资源 [RFC2914]。

实时媒体的拥塞控制对于许多企业来说都是一个挑战原因

o 媒体通常以无法快速编码的形式进行编码更改以适应不同的带宽和带宽需求通常只能在离散的、相当大的范围内改变脚步

o 参与者可能对如何响应 - 这可能不会减少所需的带宽发现拥塞的流

o 编码通常对丢包敏感,而实时要求排除了通过以下方式修复数据包丢失的可能性重传

描述了两种拥塞控制算法

能够提供良好的性能和合理的带宽共享

与使用相同拥塞控制的其他视频流以及 TCP共享相同链接的流。

使用的信令包括实验性 RTP 标头扩展和RTCP 消息 RFC 3550 [RFC3550],如 [abs-send-time] 中定义,[ID.alvestrand-rmcat-remb] 和 [ID.holmer-rmcat-transport-wide-cc-extensions]。

1.1. 数学符号约定

本文档的数学内容是从更多内容转录而来的公式友好的格式。

使用以下符号约定:

X_hat 变量 X 真实值的估计 - 按照惯例在变量名称顶部用抑扬音符号标记。

X(i) 向量 X 的第“i”个值 - 通常用 a 标记下标岛

E{X} 随机变量 X 的期望值

2. 系统模型

系统中包含以下元素:

o RTP 数据包 - 包含媒体数据的RTP数据包。

o数据包组 - 从网络传输的一组RTP数据包由组出发和组唯一标识的发件人到达时间(绝对发送时间)[abs-send-time]。这些可能是视频数据包、音频数据包或音频和视频数据包的混合。

o传入媒体流 - 由RTP组成的帧流数据包。

o RTP发送器 - 通过网络将RTP流发送到RTP接收者。它生成 RTP 时间戳和绝对发送时间标头扩展

o RTP 接收器 - 接收 RTP 流,标记到达时间。

o RTP 接收器处的 RTCP 发送器 - 发送接收器报告、REMB消息和传输范围的 RTCP 反馈消息。

o RTP 发送器处的 RTCP 接收器 - 接收接收器报告和 REMB消息和传输范围的 RTCP 反馈消息,报告这些到发送方控制器。

o RTCP 接收器在 RTP 接收器处,接收来自发送器的报告发件人。

o基于损耗的控制器 - 进行往返损耗率测量时间测量和 REMB 消息,并计算目标发送比特率。

o基于延迟的控制器 - 获取数据包到达信息,无论是在RTP接收器,或来自RTP发送器收到的反馈,并计算最大比特率,并将其传递给基于损失的控制器。

基于损耗的控制器和基于延迟的控制器一起实现拥塞控制算法。

3.反馈和扩展

有两种方法可以实现所提出的算法。一处两个控制器都在发送端运行,其中一个控制器在发送端运行基于延迟的控制器在接收端运行,基于损耗的控制器在接收端运行控制器在发送端运行

第一个版本可以通过使用每包反馈来实现协议通过描述[ID.holmer-rmcat-transport-wide-cc-extensions]。

这里,RTP接收器将记录到达时间和运输范围内的顺序每个收到的数据包的编号,该编号将被发送回发送方定期使用传输范围的反馈消息。这建议的反馈间隔是每个接收到的视频帧一次或如果是纯音频或多流,则至少每30毫秒一次。如果需要限制反馈开销,可以增加此间隔至100毫秒。

发送者将收到的{序列号,到达时间}进行映射与反馈报告涵盖的每个数据包的发送时间配对,并将这些时间戳提供给基于延迟的控制器。它会还根据中的序列号计算丢失率反馈消息。

第二个版本可以通过基于延迟的控制器来实现在接收端,监控并处理到达时间和传入数据包的大小。发送者应该使用abs-send-time RTP 标头扩展 [abs-send-time] 使接收方能够计算组间延迟变化。延迟的输出基于控制器将是一个比特率,它将被发送回发送方使用 REMB 反馈消息[ID.alvestrand-rmcat-remb]。

丢包率通过RTCP 接收器报告发回。

发送方 REMB 消息中的比特率和数据包的比例损失被馈送到基于损失的控制器,该控制器输出最终的目标比特率。建议尽快发送 REMB 消息当检测到拥塞时,否则至少每秒一次。

4. 发送引擎

起搏用于驱动由计算得出的目标比特率控制器。

当媒体编码器生成数据时,数据会被送入 Pacer 队列。

Pacer每隔burst_time向网络发送一组数据包间隔。burst_time的推荐值为5毫秒数据包组的大小计算为目标之间比特率和burst_time的乘积。

5. 基于延迟的控制

基于延迟的控制算法可以进一步分解为四种部件:预过滤器、到达时间过滤器、过度使用检测器、和速率控制器

5.1. 到达时间模型

本节介绍一个不断更新的自适应滤波器根据接收到的时间估计网络参数数据包组。

我们将到达间隔时间 t(i) - t(i-1) 定义为两组数据包的到达时间。相应地,出发时间 T(i) - T(i-1) 定义为两组数据包的出发时间。最后,组间延迟变化 d(i) 定义为到达间隔时间和出发间隔时间。或解释为不同的是,第i组和第i组的延迟之间的差异i-1

d(i) = t(i) - t(i-1) - (T(i) - T(i-1))

连续组之间的出发时间计算如下:

T(i) - T(i-1),其中 T(i) 是最后一趟航班的出发时间戳当前正在处理的数据包组中的数据包。任何数据包到达时间模型会忽略按顺序接收的数据。

每个组被分配一个接收时间 t(i),它对应于收到该组的最后一个数据包的时间。一组是如果 t(i) - t(i-1) > T(i) - T(i-1),则相对于其前一个延迟,即,如果到达间隔时间大于出发间隔时间时间。

我们可以将组间延迟变化建模为:

d(i) = w(i)

这里,w(i) 是随机过程 W 的样本,它是链路容量、当前交叉流量和当前发送比特率。我们将 W 建模为白高斯过程。要是我们过度使用我们期望 w(i) 平均值增加的通道,如果网络路径上的队列被清空,则 w(i) 的平均值会减少;否则 w(i) 的平均值将为零。

从 w(i) 中分离出平均值 m(i) 以使过程为零均值,我们得到公式1

d(i) = m(i) + v(i)

噪声项 v(i) 表示网络抖动和其他延迟影响没有被模型捕获

5.2. 预过滤

预滤波旨在处理由通道中断引起的延迟瞬变。在中断期间,数据包在网络缓冲区中排队,由于与拥塞无关的原因,在以下情况下会突发传送:

停电结束。

预过滤将到达的数据包组合并在一起爆裂。如果这两个数据包之一被合并到同一组中条件成立:

o 在burst_time间隔内发送的一系列数据包构成一个群体。

o 到达间隔时间小于burst_time 的数据包,并且考虑组间延迟变化 d(i) 小于0是当前数据包组的一部分。

5.3. 到达时间过滤器

参数 d(i) 对于每组数据包都很容易获得,i > 1. 我们想要估计 m(i) 并使用这个估计来检测瓶颈链路是否被过度使用。参数可以由任何自适应滤波器估计 - 我们使用卡尔曼滤波器。

令 m(i) 为时间 i 的估计值

我们将从时间 i 到时间 i+1 的状态演化建模为

m(i+1) = m(i) + u(i)

其中 u(i) 是我们建模为平稳过程的状态噪声具有零均值和方差的高斯统计量

q(i) = E{u(i)^2}

q(i) 建议等于 10^-3

给定方程 1,我们得到

d(i) = m(i) + v(i)

其中 v(i) 是零均值高斯白测量噪声方差 var_v = E{v(i)^2}

卡尔曼滤波器递归地将我们的估计 m_hat(i) 更新为

方差 var_v(i) = E{v(i)^2} 使用指数估计平均滤波器,针对可变采样率进行修改

var_v_hat(i) = max(alpha * var_v_hat(i-1) + (1-alpha) * z(i)^2, 1)

alpha = (1-chi)^(30/(1000 * f_max))

其中 f_max = max {1/(T(j) - T(j-1))} for j in i-K+1,...,i 是接收最后 K 个数据包组的最高速率以及chi 是滤波器系数,通常选择为中的数字区间 [0.1, 0.001]。由于我们假设 v(i) 应该为零平均 WGN 在某些情况下不太准确,我们引入了一个围绕 var_v_hat 更新的附加异常值过滤器。如果 z(i) >3*sqrt(var_v_hat) 过滤器更新为 3*sqrt(var_v_hat)比z(i) 。例如,在以下情况下 v(i) 不会是白色的:

数据包以高于信道容量的速率发送,其中情况下,他们将排在彼此后面。

5.4. 过度使用探测器

组间延迟变化估计 m(i),作为输出获得到达时间滤波器的值与阈值进行比较del_var_th(i)。高于阈值的估计被视为过度使用的迹象。这样的指示还不足以检测器向速率控制子系统发出过度使用信号。A仅当过度使用已被确定时才会发出明确的过度使用信号检测到至少 overuse_time_th 毫秒。然而,如果 m(i)< m(i-1),即使以上所有情况也不会发出过度使用信号条件满足。同样,相反的状态,即未使用状态,是当 m(i) < -del_var_th(i) 时检测到。如果既不过度使用也不使用不足使用检测后,检测器将处于正常状态。

del_var_th 阈值对整体影响显着算法的动力学和性能。特别是,它有已经表明,使用静态阈值 del_var_th,流由所提出的算法控制可以被并发饥饿TCP 流 [Pv13]。这种饥饿可以通过增加将 del_var_th 阈值设置为足够大的值

原因是,通过使用较大的 del_var_th 值,排队延迟是可以容忍的,而 del_var_th 较小时,过度使用检测器会对偏移的小幅增加做出快速反应通过生成过度使用信号来估计 m(i),该信号会减少基于延迟的可用带宽 A_hat 估计(参见第 4.4 节)。因此,需要动态调整阈值 del_var_th 在最常见的情况下获得良好的性能场景,例如与基于损失的流量竞争时。

因此,我们建议改变阈值 del_var_th(i)

根据以下动力学方程:

del_var_th(i) =del_var_th(i-1) + (t(i)-t(i-1)) * K(i) * (|m(i)|-del_var_th(i-1))

其中 K(i)=K_d if |m(i)| < del_var_th(i-1) 或 K(i)=K_u 否则。这基本原理是当 m(i) 超出范围时增加 del_var_th(i) 范围 [-del_var_th(i-1),del_var_th(i-1)],而当偏移量估计 m(i) 回落到范围内,del_var_th 减小。在这样,当 m(i) 增加时,例如由于 TCP 流进入同样的瓶颈,del_var_th(i) 增加并避免了过度使用信号的不受控制的生成可能会导致由所提出的算法控制的流量饥饿[Pv13]。

此外,如果出现这种情况,则不应更新 del_var_th(i)

持有:

|m(i)| - del_var_th(i) > 15

还建议将 del_var_th(i) 限制在 [6, 600] 范围内,因为太小的 del_var_th(i) 会导致检测器变得过度敏感。

另一方面,当 m(i) 回落到范围内时[-del_var_th(i-1),del_var_th(i-1)] 阈值 del_var_th(i) 为减少,从而可以实现较低的排队延迟。

建议选择 K_u > K_d,以便速率del_var_th 增加的速率高于其增加的速率减少了。通过此设置,可以增加并发 TCP 流情况下的阈值并防止饥饿以及执行协议内的公平性。推荐值del_var_th(0)、overuse_time_th、K_u 和 K_d 分别为 12.5 ms,10 毫秒、0.01 和 0.00018。

5.5. 速率控制

速率控制分为两部分,一部分控制带宽基于延迟的估计,以及控制带宽估计基于损失。两者的目的都是为了增加估计只要没有检测到拥塞,可用带宽 A_hat并确保我们最终能够匹配可用带宽通道并检测过度使用。

一旦检测到过度使用,可用带宽基于延迟的控制器估计的值会减少。这样我们获得可用带宽的递归和自适应估计。

在本文档中,我们假设速率控制子系统定期执行,并且该周期是恒定的。

速率控制子系统有 3 种状态:增加、减少和保持。

“Increase”是没有检测到拥塞时的状态;“减少”是检测到拥塞的状态,“Hold”是这样的状态:

等到已建立的队列耗尽后再“增加”状态。

状态转换(空白字段表示“保持状态”)

是:

子系统以增加状态启动,并一直保持该状态直到检测器子系统已检测到过度使用或使用不足。

每次更新时,基于延迟的可用带宽估计乘法或加法增加,具体取决于其当前状态。

如果当前带宽,系统会成倍增加估计似乎远未达到收敛,但它确实如果看起来更接近收敛,则加性增加。我们假设我们已经接近收敛,如果当前传入的比特率 R_hat(i) 接近输入比特率的平均值

我们之前处于 Decrease 状态的时间。“关闭”定义为围绕该平均值的三个标准差。这是建议使用以下方法测量平均值和标准差平滑因子为 0.95 的指数移动平均线预计这个平均值涵盖了我们所处的多个场合处于减少状态。每当这些统计数据的有效估计不可用,我们假设我们还没有接近收敛,因此保持乘法增长状态。

如果 R_hat(i) 增加到平均值的三个标准差以上最大比特率,我们假设当前拥塞程度已经改变,此时我们重置平均最大比特率并返回到乘法增加状态。

R_hat(i) 是基于延迟的测量的输入比特率T 秒窗口上的控制器:

R_hat(i) = 1/T * sum(L(j)) 对于 j 从 1 到 N(i)

N(i) 是过去 T 秒内收到的数据包数量,L(j) 是数据包 j 的有效负载大小。0.5 到 1 秒之间的窗口是

受到推崇的。

在乘法增加期间,估计值最多增加每秒 8%。

eta = 1.08^min(time_since_last_update_ms / 1000, 1.0)

A_hat(i) = eta * A_hat(i-1)

在附加增加期间,估计值最多增加每个response_time 间隔半个数据包。响应时间间隔估计为往返时间加上 100 ms 的估计值过度使用估计器和检测器反应时间。

响应时间毫秒 = 100 + rtt_ms

阿尔法 = 0.5 * 分钟(time_since_last_update_ms / response_time_ms, 1.0)

A_hat(i) = A_hat(i-1) + max(1000, alpha * Expected_pa​​cket_size_bits)

Expected_pa​​cket_size_bits 用于获得稍慢的斜率

较低比特率下的附加值会增加。例如它可以是假设帧速率为 30,根据当前比特率计算每秒帧数:

每帧位数 = A_hat(i-1) / 30

每帧数据包 = ceil(每帧位数 / (1200 * 8))

avg_packet_size_bits = 每帧位数 / 每帧数据包数

由于系统依赖于过度使用通道来验证当前可用带宽估计,我们必须确保我们的估计值与发送者的速率没有偏差实际上发送。因此,如果发送者无法产生比特具有拥塞控制器要求的比特率的流,可用带宽估计应保持在给定范围内。

因此我们引入一个阈值A_hat(i) < 1.5 * R_hat(i)

当检测到过度使用时,系统会转为减少使用状态,其中基于延迟的可用带宽估计为减少到当前输入比特率的倍数。

A_hat(i) = beta * R_hat(i)

beta 通常选择在区间 [0.8, 0.95] 内,0.85 是推荐值。

当检测器向速率控制子系统发出未充分使用的信号时,我们知道网络路径中的队列正在被清空,表明

我们的可用带宽估计 A_hat 低于实际可用带宽。根据该信号,速率控制子系统将进入保持状态,此时接收端可用带宽在等待队列时估计值将保持不变稳定在较低水平 - 一种将延迟保持在较低水平的方法可能的。这种延迟的减少是我们所希望的,也是预期的,由于过度使用而减少估计值后立即,但是如果某些链路上的交叉流量减少,也会发生这种情况。

建议至少运行更新 A_hat(i) 的例程每个response_time间隔一次。

5.6. 参数设置

表 1:基于延迟的控制器的推荐值

6. 基于损失的控制

拥塞控制器的第二部分基于往返时间、数据包丢失和可用带宽估计 A_hat从基于延迟的控制器接收。可用带宽基于损失的控制器计算的估计值表示为正如那样。

基于延迟的网络产生的可用带宽估计 A_hat仅当队列的大小符合要求时,控制器才可靠路径足够大。如果队列很短,就会过度使用仅通过数据包丢失可见,而数据包未使用基于延迟的控制器。

基于损耗的控制器应该在每次反馈时运行接收器已收到。

o 如果自上次报告以来有 2-10% 的数据包丢失从接收器、发送器可用带宽估计As_hat(i) 将保持不变。

o 如果超过 10% 的数据包丢失,则新的估计值是计算公式为 As_hat(i) = As_hat(i-1)(1-0.5p),其中 p 是损失比率。

o 只要丢失的数据包少于 2% As_hat(i) 将增加为 As_hat(i) = 1.05(As_hat(i-1))

基于损失的估计 As_hat 与基于延迟的估计进行比较估计A_hat。实际发送速率设置为最小值介于 As_hat 和 A_hat 之间。

我们通过注意到如果传输通道由于过大而有少量丢包使用,如果发件人不调整他的金额,该金额很快就会增加比特率。因此我们很快就会达到 10% 的门槛以上并调整As_hat(i)。但如果丢包率不增加,损失可能与自己造成的无关拥塞,因此我们不应对它们做出反应。

7. 互操作性注意事项

如果实现这些算法的发送者与接收者对话不实现任何建议的 RTCP 消息和 RTP头扩展,建议发送方监听RTCP接收器报告并使用丢失数据包的比例和轮次跳闸时间作为基于损耗的控制器的输入。基于延迟的控制器应保持禁用状态。

八、实施经验

该算法已在开源WebRTC中实现

项目,自 M23 以来一直在 Chrome 中使用,并且正在使用谷歌环聊。

该算法的部署揭示了与以下相关的问题:

WiFi 网络拥塞或存在其他问题,导致算法改进。该算法还经过了测试多方会议场景,会议服务器终止端点之间的拥塞控制。这确保了拥塞控制没有做出任何假设最大发送和接收比特率等,通常超出会议服务器的控制。

9. 进一步的工作

该草案将作为拥塞控制讨论的输入。

在此基础上可以做的工作包括:

o 综合损失控制的考虑因素:损失和延误如何发生控制可以更好地集成,损失控制得到改善。

o 控制点考虑因素:评估绩效相比之下,所有拥塞控制逻辑都位于发送方发送者和接收者之间的逻辑分离。

o 使用 ECN 作为拥塞信号的考虑估计和链接过度使用检测。

10. IANA 考虑因素

本文件没有向 IANA 提出任何要求。

RFC 编辑注意:本节可能会在发布时作为RFC。

11. 安全考虑

攻击者能够在网络上插入或删除消息连接将有能力破坏速率控制。这可以使算法产生低于发送速率

利用瓶颈链路容量或发送速率过高造成网络拥塞。

在这种情况下,控制信息是在RTP内部携带的,并且可以使用 SRTP 防止修改或消息插入,就像媒体一样。鉴于RTP中携带时间戳标头未加密,因此不受保护披露,但似乎很难根据时机发起攻击仅供参考。

12. 致谢

感谢兰德尔·杰瑟普、马格努斯·韦斯特伦德、瓦伦·辛格、蒂姆·潘顿,周秀贤、吉姆·盖蒂斯、英格玛·约翰逊、迈克尔·韦尔茨尔和其他人对此早期版本提供了宝贵的反馈草稿。

13. 关于转载

转载此文请注明“引用于新睿云.弘电脑”,否则请回避。

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

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

相关文章

【Java设计模式】二十五、自定义Spring IoC

文章目录 1、IoC类的定义1.1 定义bean相关的pojo类PropertyValue1.2 定义MutablePropertyValues类1.3 定义BeanDefinition类 2、定义注册表相关类2.1 BeanDefinitionRegistry接口2.2 SimpleBeanDefinitionRegistry类 3、定义解析器相关类3.1 BeanDefinitionReader接口3.2 XmlBe…

【JavaScript】JavaScript 运算符 ④ ( 逻辑运算符 | 逻辑与运算符 | 逻辑或运算符 || | 逻辑非运算符 ! )

文章目录 一、JavaScript 逻辑运算符1、逻辑运算符 概念2、逻辑与运算符 &&3、逻辑或运算符 ||4、逻辑非运算符 !5、完整代码示例 一、JavaScript 逻辑运算符 1、逻辑运算符 概念 JavaScript 中的 逻辑运算符 的作用是 对 布尔值 进行运算 , 运算完成 后 的 返回值 也是…

10倍提效,每天100篇,如何使用AI提取arXiv论文知识?

arXiv arXiv是国际上最有影响力的论文预发平台&#xff0c;在arXiv发表论文&#xff0c;已经成为科研圈的“潜规则”。arXiv创建于1991年&#xff0c;论文主要是理工科论文&#xff0c;包括数学、物理、计算机、统计、金融等领域。 目前收录论文数量已达200万篇。研究人员每个月…

springboot 简易文件共享工具

文章目录 一、运行界面1、登录2、展示 二、源码传送1、使用技术2、代码结构3、源码 三、运行部署1、jar方式2、docker方式3、docker-compose方式 四、优化方向 一、运行界面 1、登录 后台查看日志&#xff0c;获取token值 2、展示 批量上传文件或者点击链接下载 二、源码传…

Vulnhub - Symfonos

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Symfonos 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/symfonos-1,322/ 0x01 信息收集 …

在pzp203上运行ad9361 no-os工程

0. 环境 - pzp203 - ubuntu18 vivado2018 pzp203是一款plutosdr的国产兼容版。出厂默认是基于linux系统的&#xff0c;用libiio调用。软硬件兼容adalm-pluto。开发板提供网盘资料&#xff0c;是添加了板卡适配的。 1. hdl 1.1 准备源码 hdl https://github.com/analogdevi…

力扣162-寻找峰值, test ok

题目 代码实现 #include<iostream> #include<vector> using namespace std;class Solution { public:int findPeakElement(vector<int>& nums) {int len nums.size();int left 0, right len - 1, mid;while (left < right) {mid left (right -…

基于Java的大学计算机课程管理平台(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

修改NLog配置文件参数的方法

目录 一、背景 二、NLog配置文件 三、C#代码 四、验证结果 ​ 五、总结 一、背景 最近项目中要用到NLog记录日志&#xff0c;有一个要求是可以灵活地修改日志文件的存放位置&#xff0c;琢磨了一小会&#xff0c;发现可以使用XML文件的形式修改文件的参数&#xff0c;现将…

实现兼容性良好的前端页面开发

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【LLM加速】注意力优化(基于位置/内容的稀疏注意力 | flashattention)

note &#xff08;1&#xff09;近似注意力&#xff1a; Routing Transformer采用K-means 聚类方法&#xff0c;针对Query和Key进行聚类&#xff0c;类中心向量集合为 { μ i } i 1 k \left\{\boldsymbol{\mu}_i\right\}_{i1}^k {μi​}i1k​ &#xff0c;其中k 是类中心的…

源于一区| 改善性能的5种高效而小众的变异策略,一键调用 (Matlab)

基于群体的优化算法在达到迭代后期时种群多样性往往会速降&#xff0c;进化将陷入停滞&#xff0c;而许多算法本身并没有突变机制&#xff0c;一旦受到局部最优值的约束&#xff0c;就很难摆脱这些约束。它还将减少种群多样性&#xff0c;减缓收敛速度。 变异策略可以增加种群…

2025武忠祥考研数学,视频百度网盘+基础全程课程PDF

“得数学者的天下”&#xff0c;25考研首先要开始的就是数学复习&#xff0c;而数学复习首先要开始的必然是高数&#xff01; 很多同学选择了跟着武忠祥老师学习高数&#xff0c;但是具体要怎么学&#xff1f;用什么书&#xff1f;怎么刷题&#xff1f;快来看看以 下的武忠祥…

GenAI开源公司汇总

主要分类如下&#xff1a; 1. 基础模型&#xff1a;这些是机器学习和AI的核心模型提供商&#xff0c;它们提供基础的算法和技术支持。 2. 模型部署与推断&#xff1a;提供云服务和计算资源&#xff0c;帮助用户部署和运行AI模型。 3. 开发者工具&#xff1a;支持AI/ML的开发…

【01】htmlcssgit

01-前端干货-html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全…

开发指南013-国际化-后台部分

平台底层做了国际化处理。开发时候根据项目性质&#xff0c;决定是否采用国际化&#xff0c;但是底层所需资源必须包含&#xff08;一些底层例如登录校验都做了对应处理&#xff09;。平台先支持中文简体、中文繁体、英文、日文&#xff0c;必要时可以随时扩展其他语言。 国际化…

单片机FLASH深度解析和编程实践(上)

本篇文章主要针对单片机FLASH编程和FLASH基本原理进行学习分享。以STM32单片机作为实例进行编程实训。 关于FLASH操作的相关寄存器及编程&#xff0c;大家可以参考下一篇文章: 单片机FLASH深度解析和编程实践&#xff08;下&#xff09;-CSDN博客 目录 一、STM32编程方式 二、…

Linux批量注释

1.注释行 1.按ctrlv进入块选择模式 &#xff0c;然后上下键选中需要注释的行 2.按shifti(也就是大写I) 然后输入// 或 # 3.按ESC键 2.取消注释行 1.按ctrlv进入块选择模式&#xff0c; 然后上下键选中需要取消注释的行 2.然后按d

QT C++ QButtonGroup应用

//QT 中&#xff0c;按钮数量比较少&#xff0c;可以分别用各按钮的信号和槽处理。 //当按钮数量较多时&#xff0c;用QButtonGroup可以实现共用一个槽函数&#xff0c;批量处理&#xff0c;减少垃圾代码&#xff0c; //减少出错。 //开发平台&#xff1a;win10QT6.2.4 MSVC…

面向控制台编程?Java的GUI开发

记得之前刚开始学习Java&#xff0c;按部就班去阅读《Java核心技术》这本书的时候&#xff0c;总是听别人提起&#xff0c;java swing那一章不用看了。然后直到对着控制台编程了半年&#xff0c;回来捡起了Swing图形界面&#xff0c;跟着网上搞了坦克大战的游戏&#xff0c;总觉…