同时运行多个算法取最优值是否常见？
符合这些条件的，最接近的是sat solver中的portfolio solvers。 简单的说，当你有一个sat问题的时候，由于sat不好并行，solver之间性能差异也巨大，你可以开多个solver，每个擅长不同的东西，同时算。 sat solver的一个问题是，性能极其不稳定。很多问题，Solver A可以秒解，但是不同的Solver，或者Solver A的不同版本，就会需要小时或以上才能解，而在另一些问题上又相反。 在<A billion SMT queries a day>里面，AWS Automated Reasoning Group发现，当他们更新他们的sat solver以后，以前有一些可以解出来的问题就会timeout。他们的解法，正是把solver的不同版本放进一个portfolio里面。 当然，符合这些条件的现实里用到的算法实在太小了，但是如果我们放松一下条件，就有些其他的算法。 如果不要求同时跑，只是跑一会换一换，那就是introsort - 一般来说，这会采用quicksort进行排序。但是如果输入状态不对导致跑下去要O(n^2)时间，会转成heapsort等worst case O(n log n)的算法。同时，introsort在数组大小足够小的时候，会转为O(n^2)平均时间的selection sort等。 与之接近的，ref counting会有‘找不到cycle’等问题。很多装备ref counting的语言，也会因此装备一个tracing garbage collector，当合理的时候，跑一跑来清除cycle。 如果我们不要求‘保留最快的那个’，那有speculation。在lexing等里面，中间状态数量有限。假设有n个，我们可以在字符串的中间并行的跑n个lexer，每个都猜一个不同的中间状态，最后再拼起来。 如果我们只要求‘在不同的参数下，会退化成不同的算法’，那train algorithm在train size为heap size的时候，会退化成tracing garbage collector，而当train size为object size的时候，会退化成ref counting。 adapton或者接近的incremental computing engine则可以‘在不同的用法下，退化成不同的算法’。当你有很多write的时候，adapton会退化成pull based model，而当你有很多read的时候，adapton更像push based model。 adaptive algorithm则可以根据资源或任务的多寡，自动选择更合适的算法。比如Dynamic Tensor Rematerialization，尽管背后只有一个算法，但是在内存有足够内存的时候，用这方法训练神经网络跟常规方法别无二致。当内存不足的时候，会采取一个O(n) time O(n^0.5) space的算法，而在内存严重不足的时候，会采用O(n log n) time O(log n) space的算法。根据内存的数量，这些算法之间会有一个平稳过渡。