⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sga.f90

📁 提供了遗传算法的一些代码库文件
💻 F90
字号:

       REAL,DIMENSION(:,:),ALLOCATABLE :: XYcen, XYran
       REAL,DIMENSION(:,:),ALLOCATABLE :: XYcenT,XYcen1
       REAL,DIMENSION(:),ALLOCATABLE :: XboundL,FIT,Pslt
       REAL,DIMENSION(:),ALLOCATABLE :: XYran1,FITNESS
       REAL,DIMENSION(:,:),ALLOCATABLE :: XYcen2
       REAL,DIMENSION(:,:),ALLOCATABLE :: XYcen3
       REAL,DIMENSION(:,:),ALLOCATABLE :: XYcenO


	 INTEGER,PARAMETER :: Npop=300
	 INTEGER,PARAMETER :: Nslt=20
       REAL,DIMENSION(3):: Urand

       REAL,DIMENSION(3*Npop):: FITtmp
       REAL,DIMENSION(3*Npop):: FIT0

	 ALLOCATE(XYcen(2,Npop), XYran(2,Npop))
	 ALLOCATE(XYcenT(2,3*Npop),XYcen1(2,Npop))
	 ALLOCATE(XboundL(Npop),FIT(Npop),Pslt(Npop))
	 ALLOCATE(XYran1(Npop),FITNESS(Npop))
	 ALLOCATE(XYcen2(2,Npop))
	 ALLOCATE(XYcen3(2,Npop))
	 ALLOCATE(XYcenO(2,3*Npop))

	 OPEN(14,FILE='XYO.DAT') 
      
      
	
      XboundR=10  !0.0
      YboundU=10   !40.0
      YboundB=-10   !10.0

!          /*父代群体的初始化*/
!	CALL RANDOM_SEED()
      CALL RANDOM_NUMBER (XYran)

      DO I=1,Npop
	 XYcen(2,i)=YboundB+XYran(2,i)*(YboundU-YboundB)
	 XboundL(I)=-10  !YboundB-XYcen(2,I)
	 XYcen(1,I)=XboundL(I)+XYran(1,i)*(XboundR-XboundL(I))    
      ENDDO

      
	DO I=1,Npop
	Xtemp=XYcen(1,I)
	ytemp=XYcen(2,I)
      FIT(I)=FUNC(Xtemp,ytemp)
	ENDDO
!      write(14,20)((XYcen(J,I),J=1,2),FIT(I),I=1,Npop)
     
	DO I=1,Npop

      FITtmp(I)=FIT(I)
	ENDDO

      CALL SORT2(Npop,FITtmp)

	DO I=1,Npop
	   DO J=1,Npop
	     IF(FITtmp(I)==FIT(J))THEN
	       XYcenT(1,I)=XYcen(1,J)
	       XYcenT(2,I)=XYcen(2,J)
	     ENDIF
         ENDDO
	ENDDO

	DO I=1,Npop

      FIT(I)=FITtmp(I)
	XYcen(1,I)=XYcenT(1,I)
	XYcen(2,I)=XYcenT(2,I)
	ENDDO



       write(14,20)((XYcen(J,I),J=1,2),FIT(I),I=1,Npop)
                  DO IR=1,7
!          /*父代群体的适应度评价*/

	DO I=1,Npop

      FITNESS(I)=1.0/(FIT(I)*FIT(I)+0.001)   !
	ENDDO
!       write(14,*)'适应度'
!       write(14,20)((XYcen(J,I),J=1,2),FITNESS(I),I=1,Npop)

!          /*选择操作,产生NO.1 子代群体*/
!          /*Pslt(i): 选择概率;子代群体:XYcen1(2,i)*/
      SUM=0.0
	DO I=1,Npop
      SUM=SUM+FITNESS(I)
	ENDDO
	DO I=1,Npop
      Pslt(I)=FITNESS(I)/SUM
	ENDDO

	DO I=1,Npop
	   SUM=0.0
	   DO J=1,I
	   SUM=SUM+Pslt(J)
	   ENDDO
         FITtmp(I)=SUM

	ENDDO
!	CALL RANDOM_SEED()

      CALL RANDOM_NUMBER (XYran1)
      DO I=1,Npop-Nslt
	   IF(XYran1(I).GT.0.0.AND.XYran1(I).LE.FITtmp(1))THEN
	   XYcen1(1,I)=XYcen(1,1)
	   XYcen1(2,I)=XYcen(2,1)
	   ENDIF
	   DO J=2,Npop
	   IF(XYran1(I).GT.FITtmp(J-1).AND.XYran1(I).LE.FITtmp(J))THEN
	   XYcen1(1,I)=XYcen(1,J)
	   XYcen1(2,I)=XYcen(2,J)
	   ENDIF
         ENDDO
	ENDDO

      DO I=1,Nslt
 	   XYcen1(1,I+Npop-Nslt)=XYcen(1,I)
	   XYcen1(2,I+Npop-Nslt)=XYcen(2,I)        
	ENDDO

!       write(14,*)'选择概率'
!       write(14,20)((XYcen(J,I),J=1,2),Pslt(I),I=1,Npop)
!       write(14,*)'累计选择概率'
 !      write(14,20)((XYcen(J,I),J=1,2),FITtmp(I),I=1,Npop)
 !      write(14,*)'子代群体1'
 !      write(14,20)((XYcen1(J,I),J=1,2),XYran1(I),I=1,Npop)
!          /*杂交操作,产生NO.2 子代群体*/
!          /*Pslt(i): 选择概率;子代群体:XYcen2(2,i)*/

      DO I=1,Npop
	   Xtemp1=0.0
	   Ytemp1=0.0
	   Xtemp2=0.0
	   Ytemp2=0.0
         Urand=0.0
!	CALL RANDOM_SEED()

      CALL RANDOM_NUMBER (Urand)

	   IF(Urand(1).GT.0.0.AND.Urand(1).LE.FITtmp(1))THEN
	   Xtemp1=XYcen(1,1)
	   Ytemp1=XYcen(2,1)
	   ENDIF
	   DO J=2,Npop
	   IF(Urand(1).GT.FITtmp(J-1).AND.Urand(1).LE.FITtmp(J))THEN
	   Xtemp1=XYcen(1,J)
	   Ytemp1=XYcen(2,J)
	   ENDIF
         ENDDO
	   IF(Urand(2).GT.0.0.AND.Urand(2).LE.FITtmp(1))THEN
	   Xtemp2=XYcen(1,1)
	   Ytemp2=XYcen(2,1)
	   ENDIF
	   DO J=2,Npop
	   IF(Urand(2).GT.FITtmp(J-1).AND.Urand(2).LE.FITtmp(J))THEN
	   Xtemp2=XYcen(1,J)
	   Ytemp2=XYcen(2,J)
	   ENDIF
         ENDDO
         
	   IF(Urand(3).LT.0.5)THEN
	     XYcen2(1,I)=Urand(1)*Xtemp1+(1.0-Urand(1))*Xtemp2
	     XYcen2(2,I)=Urand(1)*Ytemp1+(1.0-Urand(1))*Ytemp2
	   ENDIF
	   IF(Urand(3).GE.0.5)THEN
	     XYcen2(1,I)=Urand(2)*Xtemp1+(1.0-Urand(2))*Xtemp2
	     XYcen2(2,I)=Urand(2)*Ytemp1+(1.0-Urand(2))*Ytemp2
	   ENDIF
	ENDDO

!!        write(14,*)'子代群体2'
 !!       write(14,20)((XYcen2(J,I),J=1,2),FITtmp(I),I=1,Npop) 

!          /*变异操作,产生NO.3 子代群体*/
!          /*Pslt(i): 选择概率;子代群体:XYcen3(2,i)*/

      SUM=0.0
	DO I=1,Npop
      Pslt(I)=1.0-Pslt(I)
	ENDDO
	DO I=1,Npop
       Urand=0.0
!	CALL RANDOM_SEED()
      
      CALL RANDOM_NUMBER (Urand)
	  IF(Urand(3).LT.Pslt(I))THEN
	    XYcen3(2,i)=YboundB+Urand(1)*(YboundU-YboundB)
	    XboundL(I)=-10  !YboundB-XYcen(2,I)
	    XYcen3(1,I)=XboundL(I)+Urand(2)*(XboundR-XboundL(I))
	   ENDIF
	  IF(Urand(3).GE.Pslt(I))THEN
	    XYcen3(2,i)=XYcen(2,i)
	    XYcen3(1,I)=XYcen(1,I)
	   ENDIF	        
	ENDDO     


!!       write(14,*)'子代群体3'
! !      write(14,20)((XYcen3(J,I),J=1,2),Pslt(I),I=1,Npop)

      KM=0
	DO I=1,Npop
	    FLAG=0.0
	    DO J=1,Npop
	    IF(XYcen3(1,I)==XYcen(1,J).AND.XYcen3(2,I)==XYcen(2,J))THEN
	    FLAG=1.0
	    EXIT
	    ENDIF
	    ENDDO

	    IF(FLAG==0.0)THEN
	    KM=KM+1
          XYcenO(1,KM)=XYcen3(1,I)
          XYcenO(2,KM)=XYcen3(2,I)
	    ENDIF
	ENDDO
	DO I=1,Npop
	    FLAG=0.0
	    DO J=1,Npop
	    IF(XYcen2(1,I)==XYcen(1,J).AND.XYcen2(2,I)==XYcen(2,J))THEN
	    FLAG=1.0
	    EXIT
	    ENDIF
	    ENDDO

	    IF(FLAG==0.0)THEN
	    KM=KM+1
          XYcenO(1,KM)=XYcen2(1,I)
          XYcenO(2,KM)=XYcen2(2,I)
	    ENDIF
	ENDDO	   

	DO I=1,Npop
	    FLAG=0.0
	    DO J=1,Npop
	    IF(XYcen1(1,I)==XYcen(1,J).AND.XYcen1(2,I)==XYcen(2,J))THEN
	    FLAG=1.0
	    EXIT
	    ENDIF
	    ENDDO

	    IF(FLAG==0.0)THEN
	    KM=KM+1
          XYcenO(1,KM)=XYcen1(1,I)
          XYcenO(2,KM)=XYcen1(2,I)
	    ENDIF
	ENDDO
!       write(14,*)'子代群体'
!       write(14,30)((XYcenO(J,I),J=1,2),I=1,KM)


	DO I=1,KM
	Xtemp=XYcenO(1,I)
	ytemp=XYcenO(2,I)
      FIT0(I)=FUNC(Xtemp,ytemp)
	ENDDO
!      write(14,20)((XYcen(J,I),J=1,2),FIT(I),I=1,Npop)
     
	DO I=1,Npop

      FIT0(I+KM)=FIT(I)
	ENDDO

	DO I=1,Npop
	XYcenO(1,I+KM)=XYcen(1,I)
	XYcenO(2,I+KM)=XYcen(2,I)
	ENDDO

      KM=KM+Npop

	DO I=1,KM

      FITtmp(I)=FIT0(I)
	ENDDO

      CALL SORT2(KM,FITtmp)

	DO I=1,KM
	   DO J=1,KM
	     IF(FITtmp(I)==FIT0(J))THEN
	       XYcenT(1,I)=XYcenO(1,J)
	       XYcenT(2,I)=XYcenO(2,J)
	     ENDIF
         ENDDO
	ENDDO

	DO I=1,KM

      FIT0(I)=FITtmp(I)
	XYcenO(1,I)=XYcenT(1,I)
	XYcenO(2,I)=XYcenT(2,I)
	ENDDO
       write(14,20)((XYcenO(J,I),J=1,2),FIT0(I),I=1,KM)

	DO I=1,Npop

      FIT(I)=FIT0(I)
	XYcen(1,I)=XYcenO(1,I)
	XYcen(2,I)=XYcenO(2,I)
	ENDDO

                                    ENDDO
 !      write(14,*)'OVER==============='
       write(14,20)((XYcen(J,I),J=1,2),FIT(I),I=1,Npop)

	     
20    format(3f25.10)
      write(*,30)((XYran(J,I),J=1,2),I=1,Npop)
30    format(2f25.10)


      end


      FUNCTION FUNC(X,Y)
      FUNC=SIN(3.0*3.1415*X)**2.0+
     *(X-1.0)**2.0*(1.0+SIN(3.0*3.1415*X)**2.0)+
     *(Y-1.0)**2.0*(1.0+SIN(3.0*3.1415*Y)**2.0)
!	100.0*(X**2.0-Y)**2.0+(1.0-X)**2.0   !(4.0-2.1*(X**2.0)+(X**4.0)/3.0)*(X**2.0)+X*Y+
 !    *(4.0*(Y**2.0)-4.0)*(Y**2.0)  !
      END FUNCTION FUNC

      SUBROUTINE sort2(n,ra)
      REAL ra(n)
      INTEGER i,ir,j,l
      REAL a,aaa,rra
      l=n/2+1
      ir=n
      do 
       if (l>1) then
      l=l-1
      rra=ra(l)
       else
      rra=ra(ir)
      ra(ir)=ra(1)
      ir=ir-1
      if (ir==1) then
      ra(1)=rra
      return
      endif
      endif
      i=l
      j=l+l
      do while(j<=ir) 
       aaa=1.
      if (j<ir) then
      if (ra(j)<ra(j+1)) j=j+1
      endif
      if (rra<ra(j)) then
      ra(i)=ra(j)
      i=j
      j=j+j
      else
      j=ir+1
      endif
      end do 
      ra(i)=rra
      end do
      END SUBROUTINE sort2


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -