原问题来自包括遗传算法在内的现代优化算法简介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()