优化算法

一、四种优化算法
#四种优化算法
#接受一个变量定义域的列表和针对每一组变量的成本函数
#返回最低成本以及该成本对应的变量组(最优解)

#随机搜索算法
#随机产生若干个变量组,找到最小的成本
def randomoptimization(domain,costf):
    best=999999999
    bestr=None
    for 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)

#爬山法
#根据一组随机解在附近找到最优解,可以确保局部最优,但不能保证全局最优
#理论上比随机算法复杂,效果应该好,但实际上不如随机算法,单纯的爬山法应用很少
def hillclimb(domain,costf):
    sol=[random.randint(domain[i][0],domain[i][1]) for i in range(len(domain))]#产生随机解

    while 1:
        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:
            break
        return best,sol

#模拟退火算法
#爬山法的推广,爬山法只选择更优的解,而退火算法不总是会接受一个更优的解,而且还会在退火的开始阶段表现接受较差的解
#随着退火过程的不断进行,算法越来越不可能接受较差的解,直到最后它将只接受更优的解
#效果比爬山算法好,但比随机算法没好太多,并且偶尔表现比随机算法还差
def annealingoptimize(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

#遗传算法
#在随机的一群解中找到最优的一部分解,淘汰其他解,然后在最优的部分解中进行杂交和变异,产生更优的解,多次迭代,最后返回最优解
#结合了上述算法的优点和改进了它们的缺点
#随机种群的选择结合了随机搜索算法的广泛性和随机性,克服了爬山和退火的初始随机解选择的局限性和片面性
#杂交变异和优胜劣汰结合了爬山和退火的选择更优和优秀算法总是局部相邻,克服了随机算法的完全随机
#整体表现不俗,缺点是执行时间较长
def geneticoptimize(domain,costf,popsize=50,step=1,mutprob=0.2,elite=0.2,maxiter=
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值