问题: 受多种变量影响, 希望成本函数最小
1 随机搜索
每次随机为每种变量设值, 计算成本函数; 取其中成本最小的赋值作为结果
缺点: 效果不太好
2 爬山法
以一个随机解开始, 然后在该随机解临近的解中选择一个最优解; 迭代直至不能找到更更优的
缺点: 容易陷入局部最优解
-----: 可以随机选定不同的点进行爬山,得到更优解
3 模拟退火
初始阶段会接受更优的解或者以较大的概率接受较差的解; 随着退火过程的进行, 后续接受的解将只会是更优的。
指定温度T, 退火系数cool, step是变量步长
vec是初始随机选定的解, vecb是在vec的基础上随机选择一个变量随机变化[-step, step]
计算vec, vecb的cost分别为 ea, eb
如果eb < ea,将使用更优解; 或者以pow(math.e, -(eb-ea)/T)的概率接受差解
降低温度T = T * cool 直至T <= 0.1 时结束
开始阶段T大, pow值将接近于1, 将有较大的意愿接受较差的解; 后续这种意愿越来越小, 将会趋向于更优解。
缺点: 仍然可能不是最优解
-----: 随机选定不同的初始点、不同的step来进行模拟退火
4 遗传算法
a) 随机生成一组解, 这一过程称之为种群
b) 从种群中选择(多个)最优解, 加入到新的种群中, 这一过程称之为精英选拔法; 新种群中余下的部分是由修改最优解后形成的全新解组成的。 有两种修改方法:变异(mutation) , 交叉(crossover)/配对(breeding)
b.1) 变异:通常做法是对一个既有解进行微小的、简单的、随机的改变。 如,随机选择一个解得一个变量进行随机的递增或递减
b.2) 交叉:选取最优解中的两个解,然后将它们按某种方式进行结合。 实现交叉的一种简单方式是: 选择两个解,各取前一半与后一半合并成一个新解
c) 通过b步骤构造得到新种群; 新种群与旧种群通常大小相同; 回到步骤b重复迭代, 直到达到指定的迭代次数或经过数代后解都没有得到改善,过程就over
其中, mutprob是变异的概率(变异或者交叉); elite旧种群中有多少最优解可以传入下一代; maxiter最多迭代多少代