from scipy.special import comb from itertools import combinations import numpy as np from copy import deepcopy import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
def T_weight(H,M): N = int(comb(H+M-1,M-1)) tmp1 = np.array(list(combinations(np.arange(1,H+M),M-1))) tmp2 = np.tile(np.arange(0,M-1),(int(comb(H+M-1,M-1)),1)) Temp = tmp1-tmp2-1 W = np.zeros((N,M)) W[:,0] = Temp[:,0]-0 for i in range(1,M-1): W[:,i] = Temp[:,i]-Temp[:,i-1] W[:,-1] = H-Temp[:,-1] W = W/H return N,W
def F_weight(p1,p2,M): N,W = T_weight(p1,M) if p2 > 0: N2,W2 = T_weight(p2,M) N = N+N2 W = np.concatenate([W,W2/2+1/(2*M)]) return N,W
def F_objective(Operation,p,M,Input): if p=='test': Output,Boundary = F_test(Operation,p,M,Input) elif p[:3]=='WFG': Output,Boundary = F_WFG(Operation,p,M,Input) elif p[:4]=='DTLZ': Output,Boundary = F_DTLZ(Operation,p,M,Input) return Output,Boundary
def F_test(Operation,Problem,M,Input): Boundary = None if Operation=='init': D = 10 MaxValue = np.ones((1,D))*5 MinValue = np.ones((1,D))*(-5) Population = np.random.rand(Input,D) Population = Population*np.tile(MaxValue,(Input,1))+(1-Population)*np.tile(MinValue,(Input,1)) Output = Population Boundary = np.array([MaxValue,MinValue]) elif Operation=='value': Population = Input FunctionValue = np.zeros((Population.shape[0],M)) x1 = Population[:,0] x2 = Population[:,1] FunctionValue[:,0] = x1**4-10*x1**2+x1*x2+x2**4-(x1**2)*(x2**2) FunctionValue[:,1] = x2**4-(x1**2)*(x2**2)+x1**4+x1*x2 Output = FunctionValue return Output,Boundary
def F_DTLZ(Operation,Problem,M,Input): Boundary = None K = [5,10,10,10,10,10,20] K = K[int(Problem[-1])-1] if Operation=='init': D = M+K-1 MaxValue = np.ones((1,D)) MinValue = np.zeros((1,D)) Population = np.random.rand(Input,D) Population = Population*np.tile(MaxValue,(Input,1))+(1-Population)*np.tile(MinValue,(Input,1)) Output = Population Boundary = np.array([MaxValue,MinValue]) elif Operation=='value': Population = Input FunctionValue = np.zeros((Population.shape[0],M)) if Problem == 'DTLZ1': g = 100*(K+np.sum((Population[:,M-1:]-0.5)**2-np.cos(20*np.pi*(Population[:,M-1:]-0.5)),axis=1)) for i in range(M): FunctionValue[:,i] = 0.5*np.prod(Population[:,0:M-i-1],axis=1)*(1+g) if i > 0: FunctionValue[:,i] = FunctionValue[:,i]*(1-Population[:,M-i-1]) elif Problem == 'DTLZ2': g = np.sum((Population[:,M-1:]-0.5)**2,axis=1) for i in range(M): FunctionValue[:,i] = (1+g)*np.prod(np.cos(0.5*np.pi*Population[:,0:M-i-1]),axis=1) if i > 0: FunctionValue[:,i] = FunctionValue[:,i]*np.sin(0.5*np.pi*Population[:,M-i-1]) elif Problem == 'DTLZ3': g = 100*(K+np.sum((Population[:,M-1:]-0.5)**2-np.cos(20*np.pi*(Population[:,M-1:]-0.5)),axis=1)) for i in range(M): FunctionValue[:,i] = (1+g)*np.prod(np.cos(0.5*np.pi*Population[:,0:M-i-1]),axis=1) if i > 0: FunctionValue[:,i] = FunctionValue[:,i]*np.sin(0.5*np.pi*Population[:,M-i-1]) elif Problem == 'DTLZ4': Population[:,0:M-2] = Population[:,0:M-2]**100 g = np.sum((Population[:,M-1:]-0.5)**2,axis=1) for i in range(M): FunctionValue[:,i] = (1+g)*np.prod(np.cos(0.5*np.pi*Population[:,0:M-i-1]),axis=1) if i > 0: FunctionValue[:,i] = FunctionValue[:,i]*np.sin(0.5*np.pi*Population[:,M-i-1]) elif Problem == 'DTLZ5': g = np.sum((Population[:,M-1:]-0.5)**2,axis=1) Temp = np.tile(g,(1,M-2)) if M>2: Temp = Temp.reshape(Temp.shape[1],Temp.shape[0]) Population[:,1:M-1] = (1+2*Temp*Population[:,1:M-1])/(2+2*Temp) for i in range(M): FunctionValue[:,i] = (1+g)*np.prod(np.cos(0.5*np.pi*Population[:,0:M-i-1]),axis=1) if i > 0: FunctionValue[:,i] = FunctionValue[:,i]*np.sin(0.5*np.pi*Population[:,M-i-1]) elif Problem == 'DTLZ6': g = np.sum(Population[:,M-1:]**0.1,axis=1) Temp = np.tile(g,(1,M-2)) if M>2: Temp = Temp.reshape(Temp.shape[1],Temp.shape[0]) Population[:,1:M-1] = (1+2*Temp*Population[:,1:M-1])/(2+2*Temp) for i in range(M): FunctionValue[:,i] = (1+g)*np.prod(np.cos(0.5*np.pi*Population[:,0:M-i-1]),axis=1) if i > 0: FunctionValue[:,i] = FunctionValue[:,i]*np.sin(0.5*np.pi*Population[:,M-i-1]) elif Problem == 'DTLZ7': g = 1+9*np.mean(Population[:,M-1:],axis=1) FunctionValue[:,0:M-1] = Population[:,0:M-1] if M>2: Temp = np.tile(g,(1,M-2)) Temp = Temp.reshape(Temp.shape[1],Temp.shape[0]) else: Temp = np.tile(g,(1,M-1)) h = M-np.sum(FunctionValue[:,0:M-1]/(1+Temp)*(1+np.sin(3*np.pi*FunctionValue[:,0:M-1])),axis=1) FunctionValue[:,M-1] = (1+g)*h Output = FunctionValue return Output,Boundary
def F_WFG(Operation,Problem,M,Input): K = [4,4,6,8,10,0,7,0,9] K = K[M-2] L = 10 Boundary = None if Operation == 'init': D = K+L MaxValue = np.arange(1,D+1)*2 MinValue = np.zeros(D) Population = np.random.rand(Input,D) Population = Population*np.tile(MaxValue,(Input,1))+(1-Population)*np.tile(MinValue,(Input,1)) Output = Population Boundary = np.array([MaxValue,MinValue]) elif Operation == 'value': Population = Input N = Population.shape[0] D = 1 S = np.tile(np.arange(1,M+1)*2,(N,1)) if Problem == 'WFG3': A = np.concatenate([np.ones((N,1)),np.zeros((N,M-2))],axis=1) else: A = np.ones((N,M-1)) z01 = Population/np.tile(np.arange(1,Population.shape[1]+1)*2,(N,1)) if Problem == 'WFG1': t1 = np.zeros((N,K+L)) t1[:,0:K] = z01[:,0:K] t1[:,K:] = s_linear(z01[:,K:],0.35) t2 = np.zeros((N,K+L)) t2[:,0:K] = t1[:,0:K] t2[:,K:] = b_flat(t1[:,K:],0.8,0.75,0.85) t3 = np.zeros((N,K+L)) t3 = t2**0.02 t4 = np.zeros((N,M)) for i in range(M-1): t4[:,i] = r_sum(t3[:,i*K//(M-1):(i+1)*K//(M-1)],np.arange(2*(i*K//(M-1)),2*(i+1)*K//(M-1),2)) t4[:,M-1] = r_sum(t3[:,K:K+L],np.arange(2*K,2*(K+L),2)) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t4[:,M-1],A[:,i]],axis=0)*(t4[:,i]-0.5)+0.5 x[:,M-1] = t4[:,M-1] h = convex(x) h[:,M-1] = mixed(x) elif Problem == 'WFG2': t1 = np.zeros((N,K+L)) t1[:,0:K] = z01[:,0:K] t1[:,K:] = s_linear(z01[:,K:],0.35) t2 = np.zeros((N,K+L//2)) t2[:,0:K] = t1[:,0:K] for i in range(K,K+L//2): t2[:,i] = r_nonsep(t1[:,K+2*(i-K)-2:K+2*(i-K)],2) t3 = np.zeros((N,M)) for i in range(M-1): t3[:,i] = r_sum(t2[:,i*K//(M-1):(i+1)*K//(M-1)],np.ones(K//(M-1))) t3[:,M-1] = r_sum(t2[:,K:K+L//2],np.ones(L//2)) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t3[:,M-1],A[:,i]],axis=0)*(t3[:,i]-0.5)+0.5 x[:,M-1] = t3[:,M-1] h = convex(x) h[:,M-1] = disc(x) elif Problem == 'WFG3': t1 = np.zeros((N,K+L)) t1[:,0:K] = z01[:,0:K] t1[:,K:] = s_linear(z01[:,K:],0.35) t2 = np.zeros((N,K+L//2)) t2[:,0:K] = t1[:,0:K] for i in range(K,K+L//2): t2[:,i] = r_nonsep(t1[:,K+2*(i-K)-2:K+2*(i-K)],2) t3 = np.zeros((N,M)) for i in range(M-1): t3[:,i] = r_sum(t2[:,i*K//(M-1):(i+1)*K//(M-1)],np.ones(K//(M-1))) t3[:,M-1] = r_sum(t2[:,K:K+L//2],np.ones(L//2)) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t3[:,M-1],A[:,i]],axis=0)*(t3[:,i]-0.5)+0.5 x[:,M-1] = t3[:,M-1] h = linear(x) elif Problem == 'WFG4': t1 = np.zeros((N,K+L)) t1 = s_multi(z01,30,10,0.35) t2 = np.zeros((N,M)) for i in range(M-1): t2[:,i] = r_sum(t1[:,i*K//(M-1):(i+1)*K//(M-1)],np.ones(K//(M-1))) t2[:,M-1] = r_sum(t1[:,K:K+L],np.ones(L)) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t2[:,M-1],A[:,i]],axis=0)*(t2[:,i]-0.5)+0.5 x[:,M-1] = t2[:,M-1] h = concave(x) h[:,M-1] = disc(x) elif Problem == 'WFG5': t1 = np.zeros((N,K+L)) t1 = s_decept(z01,0.35,0.001,0.05) t2 = np.zeros((N,M)) for i in range(M-1): t2[:,i] = r_sum(t1[:,i*K//(M-1):(i+1)*K//(M-1)],np.ones(K//(M-1))) t2[:,M-1] = r_sum(t1[:,K:K+L],np.ones(L)) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t2[:,M-1],A[:,i]],axis=0)*(t2[:,i]-0.5)+0.5 x[:,M-1] = t2[:,M-1] h = concave(x) h[:,M-1] = disc(x) elif Problem == 'WFG6': t1 = np.zeros((N,K+L)) t1[:,0:K] = z01[:,0:K] t1[:,K:] = s_linear(z01[:,K:],0.35) t2 = np.zeros((N,M)) for i in range(M-1): t2[:,i] = r_nonsep(t1[:,i*K//(M-1):(i+1)*K//(M-1)],2) t2[:,M-1] = r_nonsep(t1[:,K-1:],L) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t2[:,M-1],A[:,i]],axis=0)*(t2[:,i]-0.5)+0.5 x[:,M-1] = t2[:,M-1] h = concave(x) h[:,M-1] = disc(x) elif Problem == 'WFG7': t1 = np.zeros((N,K+L)) for i in range(K): t1[:,i] = b_param(z01[:,i],r_sum(z01[:,i:],np.ones(K+L-i)),0.98/49.98,0.02,50) t1[:,K:] = z01[:,K:] t2 = np.zeros((N,K+L)) t2[:,0:K] = t1[:,0:K] t2[:,K:] = s_linear(t1[:,K:],0.35) t3 = np.zeros((N,M)) for i in range(M-1): t3[:,i] = r_sum(t2[:,i*K//(M-1):(i+1)*K//(M-1)],np.ones(K//(M-1))) t3[:,M-1] = r_sum(t2[:,K:K+L],np.ones(L)) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t3[:,M-1],A[:,i]],axis=0)*(t3[:,i]-0.5)+0.5 x[:,M-1] = t3[:,M-1] h = concave(x) h[:,M-1] = disc(x) elif Problem == 'WFG8': t1 = np.zeros((N,K+L)) t1[:,0:K] = z01[:,0:K] for i in range(K,K+L): t1[:,i] = b_param(z01[:,i],r_sum(z01[:,0:i-1],np.ones(i-1)),0.98/49.98,0.02,50) t2 = np.zeros((N,K+L)) t2[:,0:K] = t1[:,0:K] t2[:,K:] = s_linear(t1[:,K:],0.35) t3 = np.zeros((N,M)) for i in range(M-1): t3[:,i] = r_sum(t2[:,i*K//(M-1):(i+1)*K//(M-1)],np.ones(K//(M-1))) t3[:,M-1] = r_sum(t2[:,K:K+L],np.ones(L)) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t3[:,M-1],A[:,i]],axis=0)*(t3[:,i]-0.5)+0.5 x[:,M-1] = t3[:,M-1] h = concave(x) h[:,M-1] = disc(x) elif Problem == 'WFG9': t1 = np.zeros((N,K+L)) for i in range(K+L-1): t1[:,i] = b_param(z01[:,i],r_sum(z01[:,i:],np.ones(K+L-i)),0.98/49.98,0.02,50) t1[:,-1] = z01[:,-1] t2 = np.zeros((N,K+L)) t2[:,0:K] = s_decept(t1[:,0:K],0.35,0.001,0.05) t2[:,K:] = s_multi(t1[:,K:],30,95,0.35) t3 = np.zeros((N,M)) for i in range(M-1): t3[:,i] = r_nonsep(t2[:,i*K//(M-1):(i+1)*K//(M-1)],K//(M-1)) t3[:,M-1] = r_nonsep(t2[:,K:],L) x = np.zeros((N,M)) for i in range(M-1): x[:,i] = np.max([t3[:,M-1],A[:,i]],axis=0)*(t3[:,i]-0.5)+0.5 x[:,M-1] = t3[:,M-1] h = concave(x) h[:,M-1] = disc(x) Output = np.tile(D*x[:,M-1].reshape((N,1)),(1,M))+S*h return Output,Boundary
def b_flat(y,A,B,C): Output = A+np.minimum(0,np.floor(y-B))*A*(B-y)/B-np.minimum(0,np.floor(C-y))*(1-A)*(y-C)/(1-C) Output = np.round(Output,-6) return Output
def b_param(y,Y,A,B,C): Output = y**(B+(C-B)*(A-(1-2*Y)*np.abs(np.floor(0.5-Y)+A))) return Output
def s_linear(y,A): Output = np.abs(y-A)/np.abs(np.floor(A-y)+A) return Output
def s_decept(y,A,B,C): Output = 1+(np.abs(y-A)-B)*(np.floor(y-A+B)*(1-C+(A-B)/B)/(A-B)+np.floor(A+B-y)*(1-C+(1-A-B)/B)/(1-A-B)+1/B) return Output
def s_multi(y,A,B,C): Output = (1+np.cos((4*A+2)*np.pi*(0.5-np.abs(y-C)/2./(np.floor(C-y)+C)))+4*B*(np.abs(y-C)/2./(np.floor(C-y)+C))**2)/(B+2) return Output
def r_sum(y,w): Output = np.sum(y*np.tile(w,(y.shape[0],1)),axis=1)/np.sum(w) return Output
def r_nonsep(y,A): Output = np.zeros(y.shape[0]) for j in range(y.shape[1]): Temp = np.zeros(y.shape[0]) for k in range(A-1): Temp = Temp+np.abs(y[:,j]-y[:,(j+k)%y.shape[1]]) Output = Output+y[:,j]+Temp Output = Output/(y.shape[1]/A)/np.ceil(A/2)/(1+2*A-2*np.ceil(A/2)) return Output
def linear(x): Output = np.zeros(x.shape) for i in range(x.shape[1]): Output[:,i] = np.prod(x[:,0:x.shape[1]-i-1],axis=1) if i > 0: Output[:,i] = Output[:,i]*(1-x[:,x.shape[1]-i-1]) return Output
def convex(x): Output = np.zeros(x.shape) for i in range(x.shape[1]): Output[:,i] = np.prod(1-np.cos(x[:,0:-1-i]*np.pi/2),axis=1) if i > 0: Output[:,i] = Output[:,i]*(1-np.sin(x[:,x.shape[1]-i]*np.pi/2)) return Output
def concave(x): Output = np.zeros(x.shape) for i in range(x.shape[1]): Output[:,i] = np.prod(np.sin(x[:,0:-1-i]*np.pi/2),axis=1) if i > 0: Output[:,i] = Output[:,i]*(np.cos(x[:,x.shape[1]-i]*np.pi/2)) return Output
def mixed(x): Output = 1-x[:,0]-np.cos(10*np.pi*x[:,0]+np.pi/2)/10/np.pi return Output
def disc(x): Output = 1-x[:,0]*(np.cos(5*np.pi*x[:,0]))**2 return Output
def F_mating(Population): N,D = Population.shape MatingPool = np.zeros((N,D)) Rank = list(range(N)) np.random.shuffle(Rank) Pointer = 1 for i in range(0,N,2): k = np.zeros((1,2)) for j in range(2): if Pointer >= N: np.random.shuffle(Rank) Pointer = 1 k = Rank[Pointer-1:Pointer+1] Pointer = Pointer+2 MatingPool[i,:] = Population[k[0],:] if i+1<N: MatingPool[i+1,:] = Population[k[1],:] return MatingPool
def F_generator(MatingPool,Boundary,MaxOffspring): N,D = MatingPool.shape ProC = 1 ProM = 1/D DisC = 20 DisM = 20 Offspring = np.zeros((N,D)) for i in range(0,N,2): beta = np.zeros((1,D)) miu = np.random.rand(1,D) beta[miu<=0.5] = (2*miu[miu<=0.5])**(1/(DisC+1)) beta[miu>0.5] = (2-2*miu[miu>0.5])**(-1/(DisC+1)) beta = beta*(-1)**np.random.randint(2,size=(1,D)) beta[np.random.rand(1,D)>ProC] = 1 if i+1<N: Offspring[i,:] = (MatingPool[i,:]+MatingPool[i+1,:])/2+beta*(MatingPool[i,:]-MatingPool[i+1,:])/2 Offspring[i+1,:] = (MatingPool[i,:]+MatingPool[i+1,:])/2-beta*(MatingPool[i,:]-MatingPool[i+1,:])/2 Offspring = Offspring[0:MaxOffspring,:] if MaxOffspring == 1: MaxValue = Boundary[0,:] MinValue = Boundary[1,:] else: MaxValue = np.tile(Boundary[0,:],(MaxOffspring,1)) MinValue = np.tile(Boundary[1,:],(MaxOffspring,1)) k = np.random.rand(MaxOffspring,D) miu = np.random.rand(MaxOffspring,D) Temp = (k<=ProM)*(miu<0.5) Offspring[Temp] = Offspring[Temp]+(MaxValue[Temp]-MinValue[Temp])*((2*miu[Temp]+(1-2*miu[Temp])*(1-(Offspring[Temp]-MinValue[Temp])/(MaxValue[Temp]-MinValue[Temp]))**(DisM+1))**(1/(DisM+1))-1) Temp = (k<=ProM)*(miu>=0.5) Offspring[Temp] = Offspring[Temp]+(MaxValue[Temp]-MinValue[Temp])*(1-(2*(1-miu[Temp])+2*(miu[Temp]-0.5)*(1-(MaxValue[Temp]-Offspring[Temp])/(MaxValue[Temp]-MinValue[Temp]))**(DisM+1))**(1/(DisM+1))) Offspring[Offspring>MaxValue] = MaxValue[Offspring>MaxValue] Offspring[Offspring<MinValue] = MinValue[Offspring<MinValue] return Offspring
def F_sort(FunctionValue): Kind = 2 N,M = FunctionValue.shape MaxFront = 0 cz = np.zeros(N) FrontValue = np.zeros(N)+np.inf Rank = FunctionValue.argsort(axis=0)[:,0] FunctionValue = FunctionValue[np.lexsort(FunctionValue[:,::-1].T)] while (Kind==1 and np.sum(cz)<N) or (Kind==2 and np.sum(cz)<N/2) or (Kind==3 and MaxFront<1): MaxFront = MaxFront+1 d = deepcopy(cz) for i in range(N): if d[i]==0: for j in range(i+1,N): if d[j]==0: k = 1 for m in range(1,M): if FunctionValue[i,m] > FunctionValue[j,m]: k = 0 break if k == 1: d[j] = 1 FrontValue[Rank[i]] = MaxFront cz[i] = 1 return FrontValue,MaxFront
def F_choose(FunctionValue1,FunctionValue2,K,Z): FunctionValue = np.concatenate([FunctionValue1,FunctionValue2]) N,M = FunctionValue.shape N1 = FunctionValue1.shape[0] N2 = FunctionValue2.shape[0] NoZ = Z.shape[0] Zmin = np.min(FunctionValue,axis=0) Extreme = np.zeros(M) w = np.zeros((M,M))+0.000001+np.eye(M) for i in range(M): Extreme[i] = np.argmin(np.max(FunctionValue/np.tile(w[i,:],(N,1)),axis=1)) Hyperplane = np.linalg.lstsq(FunctionValue[Extreme.astype('int'),:],np.ones((M,1)))[0] a = 1/Hyperplane if np.any(np.isnan(a)): a = np.max(FunctionValue,axis=0).T FunctionValue = (FunctionValue-np.tile(Zmin,(N,1)))/(np.tile(a.T,(N,1))-np.tile(Zmin,(N,1))) Distance = np.zeros((N,NoZ)) normZ = np.sum(Z**2,axis=1)**0.5 normF = np.sum(FunctionValue**2,axis=1)**0.5 for i in range(N): normFZ = np.sum((np.tile(FunctionValue[i,:],(NoZ,1))-Z)**2,axis=1)**0.5 for j in range(NoZ): S1 = normF[i] S2 = normZ[j] S3 = normFZ[j] p = (S1+S2+S3)/2 Distance[i,j] = 2*np.sqrt(p*(p-S1)*(p-S2)*(p-S3))/S2 d = np.min(Distance.T,axis=0) pii = np.argmin(Distance.T,axis=0) rho = np.zeros(NoZ) for i in range(N1): rho[pii[i]] = rho[pii[i]]+1 Choose = np.zeros(N2) Zchoose = np.ones(NoZ) k = 1 while k <= K: Temp = np.argwhere(Zchoose==1).ravel() j = np.argmin(rho[Temp]) j = Temp[j] I1 = (np.ravel(Choose)==0).nonzero() I2 = (np.ravel(pii[N1:])==j).nonzero() I = np.intersect1d(I1,I2) if len(I)>0: if rho[j] == 0: s = np.argmin(d[N1+I]) else: s = np.random.randint(len(I)) Choose[I[s]] = 1 rho[j] = rho[j]+1 k = k+1 else: Zchoose[j] = 0 return Choose
def main(Problem,M,Generations): assert M==2 or M==3 p1 = [99,13,7,5,4,3,3,2,3] p2 = [0,0,0,0,1,2,2,2,2] p1 = p1[M-2] p2 = p2[M-2] N,Z = F_weight(p1,p2,M) Z[Z==0] = 0.000001 Population,Boundary = F_objective('init',Problem,M,N) plt.ion() F = None if M==3: fig = plt.figure(figsize=plt.figaspect(0.5)) for Gene in range(Generations): MatingPool = F_mating(Population) Offspring = F_generator(MatingPool,Boundary,N) Population = np.concatenate([Population,Offspring]) FunctionValue = F_objective('value',Problem,M,Population)[0] FrontValue,MaxFront = F_sort(deepcopy(FunctionValue)) Next = np.zeros(N) NoN = np.count_nonzero(FrontValue[FrontValue<MaxFront]) Next[:NoN] = (np.ravel(FrontValue.T)<MaxFront).nonzero()[0] Last = (np.ravel(FrontValue.T)==MaxFront).nonzero()[0] c = Next[:NoN].astype('int') Choose = F_choose(FunctionValue[c,:],FunctionValue[Last,:],N-NoN,Z) Next[NoN:N] = Last[Choose.astype(bool)] Population = Population[Next.astype('int'),:] F = F_objective('value',Problem,M,Population)[0] plt.cla() if M==3: fig.suptitle(Problem+" Generation="+str(Gene+1)) ax = fig.add_subplot(1,2,1, projection='3d') fig.delaxes(fig.axes[0]) ax.scatter(F[:, 0], F[:, 1],F[:,2], color='b') ax2 = fig.add_subplot(1,2,2, projection='3d') ax2.view_init(10,50) ax2.scatter(F[:, 0], F[:, 1],F[:,2], color='b') if Gene==Generations-1: plt.ioff() plt.show() else: plt.pause(0.2) else: plt.title(Problem+" Generation="+str(Gene+1)) plt.scatter(F[:,0], F[:,1], color='b') if Gene==Generations-1: plt.ioff() plt.scatter(F[:,0], F[:,1], color='b') plt.show() else: plt.pause(0.2)
if __name__ == "__main__": main(Problem="DTLZ7", M=3, Generations=500)
|