现代优化算法代码实现

原问题来自包括遗传算法在内的现代优化算法简介http://t.csdn.cn/vbaWx下面是各种现代优化算法详细代码:

模拟退火算法

#模拟退火算法
from numpy import loadtxt,radians,sin,cos,inf,exp

from numpy import array,r_,c_,arange,savetxt

from numpy.lib.scimath import arccos

from numpy.random import shuffle,randint,rand

from matplotlib.pyplot import plot, show, rc

a=loadtxt("Pdata17_1.txt")

x=a[:,::2]. flatten(); y=a[:,1::2]. flatten()

d1=array([[70,40]]); xy=c_[x,y]

xy=r_[d1,xy,d1]; N=xy.shape[0]

t=radians(xy)  #转化为弧度

d=array([[6370*arccos(cos(t[i,0]-t[j,0])*cos(t[i,1])*cos(t[j,1])+

 sin(t[i,1])*sin(t[j,1])) for i in range(N)]

       for j in range(N)]).real

savetxt('Pdata17_2.txt',c_[xy,d])  #把数据保存到文本文件,供下面使用

path=arange(N); L=inf

for j in range(1000):

    path0=arange(1,N-1); shuffle(path0)

    path0=r_[0,path0,N-1]; L0=d[0,path0[1]]  #初始化

    for i in range(1,N-1):L0+=d[path0[i],path0[i+1]]

    if L0<L: path=path0; L=L0

print(path,'\n',L)       

e=0.1**30; M=20000; at=0.999; T=1

 for k in range(M):

    c=randint(1,101,2); c.sort()

    c1=c[0]; c2=c[1]

    df=d[path[c1-1],path[c2]]+d[path[c1],path[c2+1]]-\

    d[path[c1-1],path[c1]]-d[path[c2],path[c2+1]]  #续行

    if df<0:

        path=r_[path[0],path[1:c1],path[c2:c1-1:-1],path[c2+1:102]]; L=L+df

    else:

        if exp(-df/T)>=rand(1):

            path=r_[path[0],path[1:c1],path[c2:c1-1:-1],path[c2+1:102]]

            L=L+df

    T=T*at

    if T<e: break

print(path,'\n',L)  #输出巡航路径及路径长度

xx=xy[path,0]; yy=xy[path,1]; rc('font',size=16)

plot(xx,yy,'-*'); show()  #画巡航路径

遗传算法

#遗传算法

import numpy as np

from numpy.random import randint, rand, shuffle

from matplotlib.pyplot import plot, show, rc

a=np.loadtxt("Pdata17_2.txt")

xy,d=a[:,:2],a[:,2:]; N=len(xy)

w=50; g=10  #w为种群的个数,g为进化的代数

J=[];

for i in np.arange(w):

    c=np.arange(1,N-1); shuffle(c)

    c1=np.r_[0,c,101]; flag=1

    while flag>0:

        flag=0

        for m in np.arange(1,N-3):

            for n in np.arange(m+1,N-2):

                if d[c1[m],c1[n]]+d[c1[m+1],c1[n+1]]<\

                   d[c1[m],c1[m+1]]+d[c1[n],c1[n+1]]:

                    c1[m+1:n+1]=c1[n:m:-1]; flag=1

    c1[c1]=np.arange(N); J.append(c1)

J=np.array(J)/(N-1)

for k in np.arange(g):

    A=J.copy()

    c1=np.arange(w); shuffle(c1) #交叉操作的染色体配对组

    c2=randint(2,100,w)  #交叉点的数据

    for i in np.arange(0,w,2):

        temp=A[c1[i],c2[i]:N-1]  #保存中间变量

        A[c1[i],c2[i]:N-1]=A[c1[i+1],c2[i]:N-1]

        A[c1[i+1],c2[i]:N-1]=temp

    B=A.copy()

    by=[]  #初始化变异染色体的序号

    while len(by)<1: by=np.where(rand(w)<0.1)

    by=by[0]; B=B[by,:]

    G=np.r_[J,A,B]

    ind=np.argsort(G,axis=1)  #把染色体翻译成0,1,…,101

NN=G.shape[0]; L=np.zeros(NN)

    for j in np.arange(NN):

        for i in np.arange(101):

            L[j]=L[j]+d[ind[j,i],ind[j,i+1]]

    ind2=np.argsort(L)

    J=G[ind2,:]

path=ind[ind2[0],:]; zL=L[ind2[0]]

xx=xy[path,0]; yy=xy[path,1]; rc('font',size=16)

plot(xx,yy,'-*'); show()  #画巡航路径

print("所求的巡航路径长度为:",zL)

人工神经网络算法

1981年生物学家格若根(W. Grogan)和维什(W. Wirth)发现了两类飞朦。它们测量了这两类飞朦每个个体的翼长和触角长,数据见表17.3。抓到三只新的飞朦,它们的触角长和翼长分别为(1.24,1.80),(1.28,1.84),(1.40,2.04),试分别判定它们属于哪一个种类?

将问题视为一个系统,飞朦的数据作为输入,飞朦的类型作为输出,研究输入和输出的关系。输入数据有15个,对应15个输出。

建立只有一个隐层,神经元的个数为15的BP网络,利用Python程序,求得三只待判朦虫分别属于Apf、Af、Apf类。

#神经网络算法

from sklearn.neural_network import MLPClassifier

from numpy import array, r_, ones,zeros

x0=array([[1.14,1.18,1.20,1.26,1.28,1.30,1.24,1.36,1.38,1.38,1.38,1.40,1.48,1.54,1.56],

         [1.78,1.96,1.86,2.00,2.00,1.96,1.72,1.74,1.64,1.82,1.90,1.70,1.82,1.82,2.08]]).T

y0=r_[ones(6),zeros(9)]

md = MLPClassifier(solver='lbfgs', alpha=1e-5,

                hidden_layer_sizes=15)

md.fit(x0, y0)

 x=array([[1.24, 1.80], [1.28, 1.84], [1.40, 2.04]])

pred=md.predict(x)

print(md.score(x0,y0)); print(md.coefs_)

print("属于各类的概率为:",md.predict_proba(x))

print("三个待判样本点的类别为:",pred);

公路运量主要包括客运量和货运量两个方面。据研究,某地区的公路运量主要与该地区的人数、机动车数量和公路面积有关,表17.4给出了该地区1990年至2009年20年间公路运量的相关数据。根据有关部门数据,该地区2010年和2011年的人数分别为73.39万人、75.55万人,机动车数量分别为3.9635万辆、4.0975万辆,公路面积将分别为0.9880万平方米、1.0268万平方米。请利用BP神经网络预测该地区2010年和2011年的公路客运量和货运量。

利用BP网络求得2010年和2011年的公路客运量的预测值分别为62782.0336万人和65849.9027万人;货运量分别为31439.9231万吨和32917.5961万吨。

原始数据和网络输出值的对比如图17.5所示。

#神经网络算法

from sklearn.neural_network import MLPRegressor

from numpy import array, loadtxt

from pylab import subplot, plot, show, xticks,rc,legend

rc('font',size=15); rc('font',family='SimHei')

a=loadtxt("Pdata17_5.txt"); x0=a[:,:3]; y1=a[:,3]; y2=a[:,4]

md1=MLPRegressor(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=10)

md1.fit(x0, y1)

x=array([[73.39,3.9635,0.988],[75.55,4.0975,1.0268]])

pred1=md1.predict(x)

print(md1.score(x0,y1))

print("客运量的预测值为:",pred1,'\n----------------')

md2=MLPRegressor(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=10)

md2.fit(x0, y2); pred2=md2.predict(x); print(md2.score(x0,y2))

print("货运量的预测值为:",pred2)

yr=range(1990,2010)

subplot(121)

plot(yr,y1,'o')

plot(yr,md1.predict(x0),'-*')

xticks(yr,rotation=55)

legend(("原始数据","网络输出客运量"))

subplot(122); plot(yr,y2,'o'); plot(yr,md2.predict(x0),'-*')

xticks(yr,rotation=55)

legend(("原始数据","网络输出货运量"),loc='upper left')

show()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值