徘徊在WA和tel的模拟退火

模拟退火

模拟降温的过程:温度越高时温度下降越多,温度越低(稳定)时,温度下降越少


首先由爬山算法开始
爬山算法:即完完全全的贪心算法,只找到眼前的山峰最高值。
这里写图片描述但从c点开始时,我们发现找到的A点不是全局最优解,这也是贪心的缺点。


模拟退火是在爬山算法上做的改进

其核心是:即使找到的不是最优解,也有概率选择它
这样就能跳出贪心的局部最优,搜索到全局最优

概率符合退火规律:范围越不确定时,跳出概率越大;随着范围缩小,跳出概率越低

很合理了。
上图山坡的例子,当找到A点后,再找E点,有概率选择到E点。

以下是网上他人的伪代码,我认为很好理解: http://www.cnblogs.com/heaad/

/*
* J(y):在状态y时的评价函数值
* Y(i):表示当前状态
* Y(i+1):表示新的状态
* r: 用于控制降温的快慢
* T: 系统的温度,系统初始应该要处于一个高温的状态
* T_min :温度的下限,若温度T达到T_min,则停止搜索
*/
while( T > T_min )
{
  dE = J( Y(i+1) ) - J( Y(i) ) ; 

  if ( dE >=0 ) //表达移动后得到更优解,则总是接受移动
Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
  else
  {
// 函数exp( dE/T )的取值范围是(0,1) ,dE/T越大,则exp( dE/T )也
if ( exp( dE/T ) > random( 0 , 1 ) )
Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
  }
  T = r * T ; //降温退火 ,0<r<1 。r越大,降温越慢;r越小,降温越快
  /*
  * 若r过大,则搜索到全局最优解的可能会较高,但搜索的过程也就较长。若r过小,则搜索的过程会很快,但最终可能会达到一个局部最优值
  */
  i ++ ;
}

关于火候的把握

理解了上述退火的思想,我们也应该发现:
找到全局最优解只是个概率事件!!!
而决定概率的一共有三个变量:

  1. 温度的初始值
  2. 退火速度
  3. 模拟次数(温度管理)

聪明的你也应该会发现:

  • 如果退火速度太慢\次数太高\范围太大 会导致tle
  • 如果退火速度太快\次数太低\范围太小 会导致wa
  • 使用的rand函数若取的运气不好,会出现一样的代码一次wa,一次ac的神奇现象

一般的做题步骤:

求到n个点最短距离的点坐标

  1. 随机生成几个点(看题目给的点个数差不多一样就行)rand函数
    对每个点模拟30~50次不等rand函数(具体模拟就是从该点走随机个步数到一个新点,比较一下最近的距离是不是最优,若是,更新)
    输出最后更新的那个点就是解。
    退火思想:每个点模拟时,范围越大,rand函数走出的步长越长,范围越小时,rand越小,结果越接近。

  2. 找一个起始点(零点吧);在给定点中找出最近的点和其距离;更新起始点,向最近点靠近

s.x+=(P[k].x-s.x)/d*T;
s.y+=(P[k].y-s.y)/d*T;

退火思想:范围越大靠近的距离越多,范围越小时,靠近的距离越小

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
WA51是一种电压调节器,可以通过调节输出电压来控制步进电机的转速和方向。以下是一个简单的模拟电压调节器控制步进电机的示例: 1. 准备工作 首先,需要准备一个步进电机,以及一个WA51电压调节器。此外,还需要一个电源和一些导线。 2. 连接电路 将电源连接到WA51电压调节器的输入端口,并将步进电机连接到输出端口。在连接导线时,请确保正确连接步进电机的A+、A-、B+和B-引脚到WA51电压调节器的相应引脚。 3. 编写程序 下面是一个简单的模拟电压调节器控制步进电机的程序示例: ``` // 定义步进电机控制引脚 int stepPin = 9; int dirPin = 8; // 定义WA51电压调节器输出引脚 int outPin = 6; void setup() { // 初始化引脚为输出模式 pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(outPin, OUTPUT); } void loop() { // 设置WA51输出电压为3V analogWrite(outPin, 123); // 步进电机正转 digitalWrite(dirPin, HIGH); for (int i = 0; i < 200; i++) { digitalWrite(stepPin, HIGH); delayMicroseconds(500); digitalWrite(stepPin, LOW); delayMicroseconds(500); } // 等待1秒 delay(1000); // 设置WA51输出电压为5V analogWrite(outPin, 200); // 步进电机反转 digitalWrite(dirPin, LOW); for (int i = 0; i < 200; i++) { digitalWrite(stepPin, HIGH); delayMicroseconds(500); digitalWrite(stepPin, LOW); delayMicroseconds(500); } // 等待1秒 delay(1000); } ``` 在 `setup()` 函数中,初始化步进电机和WA51电压调节器的输出引脚。在 `loop()` 函数中,使用 `analogWrite()` 函数控制WA51电压调节器的输出电压,并使用 `digitalWrite()` 函数控制步进电机的正转和反转。在每次完成一次正转或反转后,程序都会等待1秒钟。 注意:在使用模拟电压调节器控制步进电机时,需要注意输出电压是否在步进电机的工作范围内。过高或过低的输出电压都可能会导致步进电机无法正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值