我一直在编写一些代码来自动将我的光纤(其 X、Y、Z 位置由电机控制)与光源对齐。为此,我编写了axis.move_to(pos)
将轴移动到某个位置的pm.meas_power()
方法,以及从功率计测量光功率的方法。
我的目标是找到最佳 (Y, Z) 位置(此阶段不需要 X)以最大化光功率。现在,搜索区域与光点大小相比相当大,所以如果我从只发现噪声的区域开始,简单的梯度搜索将无济于事,所以我所做的是随机移动穿过搜索区域,然后移动到一旦我发现一个高于某个阈值的功率,爬山算法。
问题在于,它的效率很低。优化的第一种方法是在螺旋中而不是随机地搜索第一道光,但从计算上讲,它并没有真正提高步数。
相反,我遇到了单纯形算法,据说它产生的结果比爬山好得多。我发现 scipy 有一种optimize.linprog()
具有单纯形算法的方法,但在我看来,这仅适用于一维问题。
我尝试阅读文档并编写自己的代码,但我对优化知之甚少,所以我很难真正理解它是如何工作的。
我想知道你是否可以帮我写一个给定的算法[ystart, zstart, yend, zend]
,即搜索区域限制,以及我的两种方法axis.move_to(pos)
和pm.meas_power()
:
from labFunctions import PowerMeter, MotorAxis
pm = PowerMeter('pm_address')
yaxis = MotorAxis('y_address')
zaxis = MotorAxis('z_address')
limits = [ystart, zstart, yend, zend] # These can be formatted differently if needed