蛙跳算法python代码

这是用蛙跳算法写的一个3维矩阵正交化代码。
import numpy as np
import random
import math
import matplotlib.pyplot as plt
N=150
M=10
T=100
pi=math.pi

def fun1(X,W):
r=[]
X=np.dot(X,W)
R=np.corrcoef(X[:,0],X[:,1])
r.append(R[0][1])
R=np.corrcoef(X[:,0],X[:,2])
r.append(R[0][1])
R=np.corrcoef(X[:,2],X[:,1])
r.append(R[0][1])
Y=np.linalg.norm®
return Y

alpha=[]
beta=[]
gamma=[]
for i in range(0, N):
alpha.append(random.random()2pi)
for i in range(0, N):
beta.append(random.random()2pi)
for i in range(0, N):
gamma.append(random.random()2pi)
W=[]
X1=[]
X2=[]
X3=[]
for i in range(0, 30000):
X1.append(random.random())
X2.append(random.random())
X3.append(random.random())
X=(X1,X2,X3)
X=np.array(X)
X=X.T
print(X)
i=0
while (i <N):
x1=[math.cos(alpha[i]),math.sin(alpha[i]),0]
x2=[-math.sin(alpha[i]),math.cos(alpha[i]),0]
x3=[0,0,1]
y1=[math.cos(beta[i]),0,math.sin(beta[i])]
y2=[0,1,0]
y3=[-math.sin(beta[i]),0,math.cos(beta[i])]
z1=[1,0,0]
z2=[0,math.cos(gamma[i]),math.sin(gamma[i])]
z3=[0,-math.sin(gamma[i]),math.cos(gamma[i])]
x=(x1,x2,x3)
y=(y1,y2,y3)
z=(z1,z2,z3)
x=np.array(x)
y=np.array(y)
z=np.array(z)
w=np.dot(np.dot(x,y),z)
i = i + 1
W.append(w)

Fglobal=1
Costfun=[]
for tt in range(0, T):
F=[]
for n in range(0, N):
mun=fun1(X,W[n])
F.append(mun)
for n in range(0, N):
if F[n]==min(F):
Wgbest=W[n]
Costfun.append(min(F))
FS=sorted(F, reverse=True)

R=[]
for n in range(0, N):
    for i in range(0, N):
        if FS[n]==F[i]:
            R.append(W[n])
            break

FB=[]
for m in range(0, M):
    for t in range(int(N/M)*(m),int(N/M)*(m+1)):
        mun=fun1(X,R[t])
        FB.append(mun)
    for i in range(0, int(N/M)):
        if FB[i]==min(FB):
            Wbbest=R[i+int(N/M)*(m)]
    for j in range(0, int(N/M)):
        if FB[j]==max(FB):
            jj=j+int(N/M)*(m)
            Wbbad=R[jj]
    if np.linalg.norm(Wbbest-Wbbad)!=0:
        R[jj]=R[jj]+random.random()*(Wbbest-Wbbad)
    elif np.linalg.norm(Wgbest-Wbbad)!=0:
        R[jj]=R[jj]+random.random()*(Wgbest-Wbbad)
    else:
        Q=[]
        for i in range(0, 9):
            Q.append(random.random())
        Q=np.array(Q)
        R[jj]=Q.reshape(3,3)
        u,s,v=np.linalg.svd(R[jj])
        R[jj]=np.dot(u,v.T)
W=[]
for n in range(0, N):
    W.append(R[n])

print(Wgbest)
print(Costfun)
fig = plt.figure()
plt.plot(Costfun)
plt.show()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值