#四种优化算法#接受一个变量定义域的列表和针对每一组变量的成本函数#返回最低成本以及该成本对应的变量组(最优解)#随机搜索算法#随机产生若干个变量组,找到最小的成本defrandomoptimization(domain,costf):
best=999999999
bestr=Nonefor i in range(1000):
r=[random.randint(domain[i][0],domain[i][1]) for i in range(len(domain))]
cost=costf(r)
if cost<best:
best=cost
bestr=r
return (best,bestr)
#爬山法#根据一组随机解在附近找到最优解,可以确保局部最优,但不能保证全局最优#理论上比随机算法复杂,效果应该好,但实际上不如随机算法,单纯的爬山法应用很少defhillclimb(domain,costf):
sol=[random.randint(domain[i][0],domain[i][1]) for i in range(len(domain))]#产生随机解while1:
neighbors=[]
#产生若干附近的解for j in range(len(domain)):
if sol[j]>domain[j][0]:
neighbors.append(sol[0:j]+[sol[j]-1]+sol[j+1:])
if sol[j]<domain[j][1]:
neighbors.append(sol[0:j]+[sol[j]+1]+sol[j+1:])
current=costf(sol)
best=current
#从附近的解中找到成本最小的解for j in range(len(neighbors)):
cost=costf(neighbors[j])
if best>cost:
best=cost
sol=neighbors[j]
#如果附近的解中成本最小的和原来的成本相同,说明到达局部最优,算法终止if best==current:
breakreturn best,sol
#模拟退火算法#爬山法的推广,爬山法只选择更优的解,而退火算法不总是会接受一个更优的解,而且还会在退火的开始阶段表现接受较差的解#随着退火过程的不断进行,算法越来越不可能接受较差的解,直到最后它将只接受更优的解#效果比爬山算法好,但比随机算法没好太多,并且偶尔表现比随机算法还差defannealingoptimize(domain,costf,T=10000.0,cool=0.95,step=1):
vec=[random.randint(domain[i][0],domain[i][1]) for i in range(len(domain))]
while T>0.1:#只要温度大于0.1度,就继续退火
i=random.randint(0,len(domain)-1)
dir=random.randint(-step,step)
vecb=vec[:]
vecb[i]+=dir#随机邻近的解if vecb[i]<domain[i][0]:
vecb[i]=domain[i][0]
elif vecb[i]>domain[i][1]:
vecb[i]=domain[i][1]
ea=costf(vec)
eb=costf(vecb)
#开始阶段表现有可能接受较差的解,但可能性逐渐降低,直到最后只接受更优的解if (eb<ea or random.random()<pow(math.e,-(eb-ea)/T)):
vec=vecb
T=T*cool#温度降低return costf(vec),vec
#遗传算法#在随机的一群解中找到最优的一部分解,淘汰其他解,然后在最优的部分解中进行杂交和变异,产生更优的解,多次迭代,最后返回最优解#结合了上述算法的优点和改进了它们的缺点#随机种群的选择结合了随机搜索算法的广泛性和随机性,克服了爬山和退火的初始随机解选择的局限性和片面性#杂交变异和优胜劣汰结合了爬山和退火的选择更优和优秀算法总是局部相邻,克服了随机算法的完全随机#整体表现不俗,缺点是执行时间较长defgeneticoptimize(domain,costf,popsize=50,step=1,mutprob=0.2,elite=0.2,maxiter=
一、四种优化算法#四种优化算法#接受一个变量定义域的列表和针对每一组变量的成本函数#返回最低成本以及该成本对应的变量组(最优解)#随机搜索算法#随机产生若干个变量组,找到最小的成本def randomoptimization(domain,costf): best=999999999 bestr=None for i in range(1000): r