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

📄 frmmain.frm

📁 遗传算法的实现(转载)
💻 FRM
📖 第 1 页 / 共 3 页
字号:
            y2 = m_pts(i).y
            x4 = x0 + x2 * sngScale
            y4 = y0 - y2 * sngScale
            p.Line (x3, y3)-(x4, y4)
            
        Next
    End If
End Sub
Public Function init() As Boolean
    Dim i, j, k As Long
    Randomize
    pg.Max = g.maxgeneration
    
    InitKnapSack    'initialize KnapSack data
    InitBin         'initialize Bin packing data

    
    menuFuns_Click (0)
    
End Function

Public Function Decoding(ByVal genome As GALib.IGenome) As String
    Dim x As Single
    Dim i As Long, idx As Long, lInc As Long
    idx = 0
    If m_lFunID <> cstKNAPSACK Then
        For i = 1 To m_allelesetarr(0).Size / 10
            lInc = genome.getbitslong(idx, idx + 9)
            x = -5.12 + 0.01 * lInc
            If i <> 10 Then
                Decoding = Decoding + Format(x, "#0.00") + "=>"
            Else
                Decoding = Decoding + Format(x, "#0.00")
            End If
            idx = idx + 10
        Next
    Else
        For i = 1 To m_allelesetarr(0).Size
            lInc = genome(i - 1)
            If i <> m_allelesetarr(0).Size Then
                Decoding = Decoding + CStr(lInc) + "=>"
            Else
                Decoding = Decoding + CStr(lInc)
            End If
        Next
    End If
End Function

'==================================



Public Function InitPop(Index As Integer)
    Dim gTemplate As New genome 'sample genome
    Dim k As Long
    Dim bret As Boolean
    Dim aset As AlleleSet
    
    m_allelesetarr.deleteArray  'reset alleleset array
    
    If menuReal.Checked = True Then     'create alleles for real genomes
        If m_lFunID = cstFUNRAS Then
            bret = m_allelesetarr.newArray(10)
            Set aset = m_allelesetarr(0)
            Call aset.newDiscrete(-5.12, 5.12, 0.001, GABOUND_INCLUSIVE, GABOUND_INCLUSIVE)
            For k = 1 To 9
                Call m_allelesetarr.link(k, 0)
            Next
            txt = "Objective Function: 10×n+ ∑[x(i)×x(i)-10×cos(2πx(i))]   (n=10)"
            InitParameters GA_CROWDINGGA, GA_RANDOMINITIALIZER, GA_UNIFORMCROSSOVER, _
                GA_GAUSSIANMUTATOR, GA_MINIMIZE, GA_ROULETTEEWHEELSELECTOR, 150, 100, 0.9, 0.01
        ElseIf m_lFunID = cstFUNACKLEY Then
                bret = m_allelesetarr.newArray(10)
                Set aset = m_allelesetarr(0)
                Call aset.newDiscrete(-32, 32, 0.001, GABOUND_INCLUSIVE, GABOUND_INCLUSIVE)
            For k = 1 To 9
                Call m_allelesetarr.link(k, 0)
            Next
            txt = "Objective Function: 20+e+ [20×exp(-0.2×(sqrt((1/n)×∑(x(i)^2))-exp((1/n)∑(cos(2×Pi×x(i)))]   (n=10)"
            InitParameters GA_CROWDINGGA, GA_RANDOMINITIALIZER, GA_UNIFORMCROSSOVER, _
                GA_GAUSSIANMUTATOR, GA_MINIMIZE, GA_ROULETTEEWHEELSELECTOR, 150, 100, 0.9, 0.01
        
        ElseIf m_lFunID = cstFUNSPHERE Then
                bret = m_allelesetarr.newArray(10)
                Set aset = m_allelesetarr(0)
                Call aset.newDiscrete(-5.12, 5.12, 0.001, GABOUND_INCLUSIVE, GABOUND_INCLUSIVE)
            For k = 1 To 9
                Call m_allelesetarr.link(k, 0)
            Next
            txt = "Objective Function: ∑[x(i)-5+i]^2   (n=10)"
            InitParameters GA_CROWDINGGA, GA_RANDOMINITIALIZER, GA_UNIFORMCROSSOVER, _
                GA_GAUSSIANMUTATOR, GA_MINIMIZE, GA_ROULETTEEWHEELSELECTOR, 150, 100, 0.9, 0.01
       
       ElseIf m_lFunID = cstFUNTSP Or m_lFunID = cstFUNTSP2 Then
                bret = m_allelesetarr.newArray(24)
                Set aset = m_allelesetarr(0)
                Call aset.newEnumerator(24)
            For k = 1 To 23
                Call m_allelesetarr.link(k, 0)
            Next
            For k = 1 To 24
                aset(k - 1) = k
            Next
            If m_lFunID = cstFUNTSP Then
                txt = "Circle TSP Problem"
                CircleTSP   'initialize tsp data
            Else
                txt = "Random TSP Problem"
                RandomTSP  'initialize tsp data
            End If
            InitParameters GA_SIMPLEGA, GA_ORDERINITIALIZER, GA_CUSTOMCROSSOVER _
                , GA_SWAPMUTATOR, GA_MINIMIZE, GA_ROULETTEEWHEELSELECTOR, 500, 50, 0.9, 0.04
            
       ElseIf m_lFunID = cstKNAPSACK Then
            bret = m_allelesetarr.newArray(50)
            Set aset = m_allelesetarr(0)
            Call aset.newDiscrete(0, 1, 1, GABOUND_INCLUSIVE, GABOUND_INCLUSIVE)
            For k = 1 To 49
                Call m_allelesetarr.link(k, 0)
            Next
            txt = "A single knapsack problem with 50 objects"
            InitParameters GA_CROWDINGGA, GA_RANDOMINITIALIZER, GA_UNIFORMCROSSOVER, _
                GA_GAUSSIANMUTATOR, GA_MAXIMIZE, GA_ROULETTEEWHEELSELECTOR, 150, 100, 0.9, 0.01
       
       ElseIf m_lFunID = cstBIN Then
            bret = m_allelesetarr.newArray(60)
            Set aset = m_allelesetarr(0)
            Call aset.newEnumerator(60)
            For k = 1 To 59
                Call m_allelesetarr.link(k, 0)
            Next
            For k = 0 To 59
                aset(k) = k
            Next
            txt = "60 objects in 'triplets' of items from (25,50), bins of size 100"
            InitParameters GA_SIMPLEGA, GA_ORDERINITIALIZER, GA_ORDERCROSSOVER _
                , GA_SWAPMUTATOR, GA_MINIMIZE, GA_TOURNAMENTSELECTOR, 500, 100, _
                1, 0.003
       ElseIf m_lFunID = cstSTEINER Or m_lFunID = cstSTEINER2 Then
            m_allelesetarr.newArray (2)
            Set aset = m_allelesetarr(0)
            Call aset.newDiscrete(-100, 100, 0.01, GABOUND_INCLUSIVE, GABOUND_INCLUSIVE)
            m_allelesetarr.link 1, 0
            CircleTSP
           txt = "Steiner's Problem"
           InitParameters GA_CROWDINGGA, GA_RANDOMINITIALIZER, GA_SINGLEPOINTCROSSOVER _
                , GA_GAUSSIANMUTATOR, GA_MINIMIZE, GA_ROULETTEEWHEELSELECTOR, 150, 50, 0.9, 0.01
           
       End If
       gTemplate.Type = GA_REALGENOME  'set genome type
    Else                                'create alleles for binary genomes
        If m_lFunID = cstFUNRAS Then
                m_allelesetarr.newArray (1)
                Set aset = m_allelesetarr(0)
                Call aset.newBinary(50)
                txt = "Objective Function: 10×n+ ∑[x(i)×x(i)-10×cos(2πx(i))]   (n=5)"
                InitParameters GA_STEADYGA, GA_RANDOMINITIALIZER, GA_SINGLEPOINTCROSSOVER _
                , GA_FLIPMUTATOR, GA_MINIMIZE, GA_TOURNAMENTSELECTOR, 250, 300, 0.9, 0.01
        
        ElseIf m_lFunID = cstFUNACKLEY Then
                m_allelesetarr.newArray (1)
                Set aset = m_allelesetarr(0)
                Call aset.newBinary(100)
                txt = "Objective Function: 10×n+ ∑[x(i)×x(i)-10×cos(2πx(i))]   (n=10)"
                InitParameters GA_STEADYGA, GA_RANDOMINITIALIZER, GA_SINGLEPOINTCROSSOVER _
                , GA_FLIPMUTATOR, GA_MINIMIZE, GA_TOURNAMENTSELECTOR, 250, 300, 0.9, 0.01
        
        ElseIf m_lFunID = cstFUNSPHERE Then
                m_allelesetarr.newArray (1)
                Set aset = m_allelesetarr(0)
                Call aset.newBinary(100)
                txt = "Objective Function: ∑[x(i)-5+i]^2   (n=10)"
                InitParameters GA_STEADYGA, GA_RANDOMINITIALIZER, GA_SINGLEPOINTCROSSOVER _
                , GA_FLIPMUTATOR, GA_MINIMIZE, GA_TOURNAMENTSELECTOR, 250, 300, 0.9, 0.01
        
        ElseIf m_lFunID = cstFUNTSP Or m_lFunID = cstFUNTSP2 Or m_lFunID = cstBIN Then
                txt = "Not implemented"
                Exit Function
        ElseIf m_lFunID = cstKNAPSACK Then
                m_allelesetarr.newArray (1)
                Set aset = m_allelesetarr(0)
                Call aset.newBinary(50)
                txt = "A single knapsack problem with 50 objects"
                InitParameters GA_STEADYGA, GA_RANDOMINITIALIZER, GA_SINGLEPOINTCROSSOVER _
                , GA_FLIPMUTATOR, GA_MAXIMIZE, GA_TOURNAMENTSELECTOR, 250, 300, 0.9, 0.02
        
        End If
        gTemplate.Type = GA_BINARYGENOME    'set genome type
    End If
    m_allelesetarr.init                                 'initialization of all alleles
    gTemplate.AlleleSetArray = m_allelesetarr           'define alleles
    gTemplate.newGenome             'create a genome
    m_Pop.newPopulation , gTemplate 'create population based on gTemplate
    Set g.population = m_Pop                            'assign the population to G+
    
    If m_lFunID = cstFUNTSP Or m_lFunID = cstFUNTSP2 Then 'for TSP to improve speed
        Dim i As Long
        For i = 0 To 5
            g.population.best(i).mutator = GA_CUSTOMMUTATOR
        Next
    End If
    
End Function

Public Function InitParameters(ag As GAAlgorithmType, init As GAInitializerType, _
    cos As GACrossoverType, mut As GAMutatorType, obj As GAMaxMinType, _
    sel As GASelector, maxgen As Long, popsize As Long, pcos As Single, pmut As Single)
    g.algorithm = ag
    g.definitializer = init
    g.Crossover = cos
    g.defmutator = mut
    g.maximini = obj
    g.maxgeneration = maxgen
    g.defpopsize = popsize
    g.pcrossover = pcos
    g.pmutation = pmut
    g.defselector = sel
    pg.Value = 0
    pg.Max = g.maxgeneration
End Function









'===FUNCTIONS FOR INITIALIZE DATA
Public Sub InitBin()
m_w(0) = 32.9
m_w(1) = 36.1
m_w(2) = 25.7
m_w(3) = 38.2
m_w(4) = 39.1
m_w(5) = 25.9
m_w(6) = 35#
m_w(7) = 39.5
m_w(8) = 26.3
m_w(9) = 34.2
m_w(10) = 42.7
m_w(11) = 25.7
m_w(12) = 31.6
m_w(13) = 45.9
m_w(14) = 25.5
m_w(15) = 28.6
m_w(16) = 36.7
m_w(17) = 27#
m_w(18) = 36.3
m_w(19) = 46#
m_w(20) = 26.7
m_w(21) = 27.3
m_w(22) = 45.9
m_w(23) = 25.9
m_w(24) = 28.2
m_w(25) = 49.3
m_w(26) = 25.3
m_w(27) = 25.4
m_w(28) = 46#
m_w(29) = 25.3
m_w(30) = 28.7
m_w(31) = 36.6
m_w(32) = 29.2
m_w(33) = 34.2
m_w(34) = 47#
m_w(35) = 25.4
m_w(36) = 27.6
m_w(37) = 40.5
m_w(38) = 25.2
m_w(39) = 34.3
m_w(40) = 49.9
m_w(41) = 25#
m_w(42) = 25.1
m_w(43) = 48.8
m_w(44) = 25.1
m_w(45) = 26.1
m_w(46) = 38.4
m_w(47) = 25.8
m_w(48) = 35.8
m_w(49) = 40.7
m_w(50) = 28.8
m_w(51) = 30.5
m_w(52) = 41.5
m_w(53) = 26.1
m_w(54) = 32.4
m_w(55) = 42.3
m_w(56) = 27.9
m_w(57) = 29.8
m_w(58) = 36.8
m_w(59) = 30.3
m_w(60) = 32.9
End Sub
Public Sub InitKnapSack()
m_knap(1).p = 23
m_knap(2).p = 21
m_knap(3).p = 37
m_knap(4).p = 28
m_knap(5).p = 27
m_knap(6).p = 21
m_knap(7).p = 6
m_knap(8).p = 38
m_knap(9).p = 7
m_knap(10).p = 11
m_knap(11).p = 49
m_knap(12).p = 23
m_knap(13).p = 27
m_knap(14).p = 15
m_knap(15).p = 0
m_knap(16).p = 17
m_knap(17).p = 17
m_knap(18).p = 5
m_knap(19).p = 41
m_knap(20).p = 32
m_knap(21).p = 32
m_knap(22).p = 21
m_knap(23).p = 28
m_knap(24).p = 0
m_knap(25).p = 25
m_knap(26).p = 30
m_knap(27).p = 5
m_knap(28).p = 11
m_knap(29).p = 41
m_knap(30).p = 28
m_knap(31).p = 42
m_knap(32).p = 22
m_knap(33).p = 35
m_knap(34).p = 13
m_knap(35).p = 14
m_knap(36).p = 46
m_knap(37).p = 2
m_knap(38).p = 34
m_knap(39).p = 32
m_knap(40).p = 15
m_knap(41).p = 48
m_knap(42).p = 39
m_knap(43).p = 3
m_knap(44).p = 40
m_knap(45).p = 28
m_knap(46).p = 16
m_knap(47).p = 17
m_knap(48).p = 31
m_knap(49).p = 19
m_knap(50).p = 0
m_knap(1).w = 1
m_knap(2).w = 4
m_knap(3).w = 2
m_knap(4).w = 28
m_knap(5).w = 47
m_knap(6).w = 2
m_knap(7).w = 23
m_knap(8).w = 12
m_knap(9).w = 12
m_knap(10).w = 45
m_knap(11).w = 21
m_knap(12).w = 29
m_knap(13).w = 36
m_knap(14).w = 43
m_knap(16).w = 1
m_knap(17).w = 38
m_knap(18).w = 4
m_knap(19).w = 33
m_knap(20).w = 18
m_knap(21).w = 3
m_knap(22).w = 38
m_knap(23).w = 11
m_knap(24).w = 35
m_knap(25).w = 13
m_knap(26).w = 29
m_knap(27).w = 3
m_knap(28).w = 32
m_knap(29).w = 26
m_knap(30).w = 21
m_knap(31).w = 47
m_knap(32).w = 9
m_knap(33).w = 29
m_knap(34).w = 26
m_knap(35).w = 47
m_knap(36).w = 46
m_knap(37).w = 19
m_knap(38).w = 30
m_knap(39).w = 34
m_knap(40).w = 8
m_knap(41).w = 48
m_knap(42).w = 5
m_knap(43).w = 0
m_knap(44).w = 45
m_knap(45).w = 20
m_knap(46).w = 22
m_knap(47).w = 40
m_knap(48).w = 4
m_knap(49).w = 49
m_knap(50).w = 0
End Sub
Public Sub CircleTSP()
    'Get TSP Circle DATA
    m_pts(1).x = 100#: m_pts(1).y = 0#
    m_pts(2).x = 96.593: m_pts(2).y = 25.882
    m_pts(3).x = 86.603: m_pts(3).y = 50#
    m_pts(4).x = 70.711: m_pts(4).y = 70.711
    m_pts(5).x = 50#: m_pts(5).y = 86.603
    m_pts(6).x = 25.882: m_pts(6).y = 96.593
    m_pts(7).x = 0#: m_pts(7).y = 100#
    m_pts(8).x = -25.882: m_pts(8).y = 96.593
    m_pts(9).x = -50#: m_pts(9).y = 86.603
    m_pts(10).x = -70.711: m_pts(10).y = 70.711
    m_pts(11).x = -86.603: m_pts(11).y = 50#
    m_pts(12).x = -96.593: m_pts(12).y = 25.882
    m_pts(13).x = -100#: m_pts(13).y = 0#
    m_pts(14).x = -96.593: m_pts(14).y = -25.882
    m_pts(15).x = -86.603: m_pts(15).y = -50#
    m_pts(16).x = -70.711: m_pts(16).y = -70.711
    m_pts(17).x = -50#: m_pts(17).y = -86.603
    m_pts(18).x = -25.882: m_pts(18).y = -96.593
    m_pts(19).x = 0#: m_pts(19).y = -100#
    m_pts(20).x = 25.882: m_pts(20).y = -96.593
    m_pts(21).x = 50#: m_pts(21).y = -86.603
    m_pts(22).x = 70.711: m_pts(22).y = -70.711
    m_pts(23).x = 86.603: m_pts(23).y = -50#
    m_pts(24).x = 96.593: m_pts(24).y = -25.882

End Sub
Public Sub RandomTSP()
    Dim i As Long
    For i = 1 To 24
        m_pts(i).x = -100 + Rnd * 200
        m_pts(i).y = 100 - Rnd * 200
    Next
End Sub

⌨️ 快捷键说明

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