随机算法
模拟退火
听说是模拟了物理中的降温过程来寻找全局最优解的过程?
众所周知物理中的降温过程是\(T=T_{ed}+a^t\),所以我们仿照这个过程定义温度\(T\),降温系数\(a\)。
每次我们有一个当前的解\(A\),历史最优解\(B\)。假设我们求最小值。我们做这样的事情:
扰动\(A\),扰动幅度相关于\(T\)(一般正比),设扰动结果为\(C\),并更新\(B\)。
计算当前答案与扰动前答案的差值,记为\(\Delta\)。
如果\(\Delta<0\),则接受这个解,否则计算\(e^{\frac{\Delta}{T}}\),并随机某个\((0,1)\)范围内的实数,如果大于则接受这个解。
\(t\)加一。
可以发现,在这个过程中,刚开始的时候先跳比较快找到一个比较高的范围,然后再精细下去找最值。这个东西在连续一元函数上显然更具有优势。
RabbitWorking
首先枚举选的个数,然后退火的时候每次选一个换掉。
枚举个数的具体原因大概就是如果不定个数除的那个数会影响退火的单调性。
DIY Tree
每次选择一条边,然后尝试换成另一条边。退多次。
随机估算
也就是通俗地说:用频率估算概率。
定理:设初始方差是\(D\),随机\(T\)次期望方差是\(\frac{D}{T}\)。
看上去很对,所以不用证了(
定理:若当前标准差为\(D\),则与答案误差超过\(nD\)的概率是\(\frac{1}{n^2}\)。
展开式子即可。
匹配难题
随机每条边出现次数,跑匈牙利算匹配个数。
最后的点大概能跑\(10^4\)次,标准差大概\(10^{-2}\),多交几遍就能过(雾
随机化贪心/调整
感受那股劲!
主要就是先把比较难满足的限制满足了,然后让随机化来干那些比较松,又不好算的限制。
线段
先随一个初始局面,然后扫,找到一条矛盾的边。
随便选一个端点换颜色,考虑这个端点周围的点的颜色,注意到有\(8\)的度和\(3\)种颜色,因此可以根据每个点出现次数设幂函数随,幂函数的底数应该小一点更好。
实测扫\(O(\log n)\)次就能过。
挑战哈密顿
把曼哈顿链考虑成一堆边,满足无环,出入度都不超过\(1\)。
无环不太能考虑,于是限定一直不能有环。每次随一条边,如果可以加入就加入,否则如果只有一个端点不满足,则以某个概率替换。
还有为啥我要跑两个小时/dk