I'm attempting to make an optimization algorithm for machine alignment that uses piezoelectric motors to work. Essentially, I gather the net movement of my motors on two axes and the resulting efficiency of the alignment. These motors move in "steps", and I can actively track how well optimized my alignment is as well as the number of steps taken in a given direction, but the distance moved by a single step is imprecise. A step forwards and a step back do not bring me back to the same location due to the inner workings of the motor, so I can have two different efficiencies corresponding to the same coordinates, and the impact of the motors imprecision becomes more severe with time. In effect, this means that I can only really use the last three or four readings at maximum to try to find my next movement -- anything beyond that is too unreliable.
Thus far I've been using a "dumb" algorithm that simply moves in one direction, measures if the efficiency has gone up, and either takes another step forward or two steps back depending on if it did or not. It repeats this until I'm happy. It works decently, but is not anywhere near as dynamic or resistant to local maxima as I'd like it to be.
Any suggestions for algorithms that use minimal, somewhat unreliable data to optimize? I've also attempted some forms of gradient ascent, but they all inevitably require too many steps for the end-calculation to be reliable.