php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 367|回复: 0

遗传算法中初始化种群一些重要的源码

[复制链接]

3138

主题

3148

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7946
贡献
0
注册时间
2021-4-14
最后登录
2024-11-21
在线时间
763 小时
QQ
发表于 2024-1-14 08:48:21 | 显示全部楼层 |阅读模式
  1. 不可行初始种群产生的程序源代码:


  2. Private Sub Command1_Click()          '切换到不可行性初始种群产生的窗口
  3. Form2.Show
  4. Form1.Hide
  5. End Sub
  6. Private Sub Command2_Click()          '切换到不可行性初始种群产生的窗口
  7. Form3.Show
  8. Form1.Hide
  9. End Sub

  10. Private Sub Form_Load()                '设置窗口背景颜色
  11. BackColor = QBColor(3)
  12. End Sub

  13. Private Sub Form_Unload(Cancel As Integer) '提示窗口
  14. Dim v As Integer
  15. v = MsgBox("你真的要关闭窗口?", vbYesNo)
  16. If v = vbNo Then
  17. Cancel = -1
  18. End If
  19. End Sub

  20. Option Explicit                         '定义变量
  21. Private Declare Function timeGetTime() Lib "winmm.dll" () As Long   '声明时间函数
  22. Dim k(1 To 100), Y(10), g(1 To 11) As Integer
  23. Dim a, C, X, p, f, t, h, i, j, e, u, ii As Integer
  24. Dim sh, m As Double
  25. Dim n As String, S(1000), r(1000001) As String
  26. Dim l(100, 10) As Single
  27. Dim b, bb, D, z As Long
  28. '参数注释:a,c :参数;b,bb,D:时间;i,j:循环变量;n:染色体字符串;u:字符串长度;sh:熵值;m:概率;z:种群大小;S(1000):存放生成的随机数;r(1000001)存放初始种群;k(1 to 100):某一基因位上各基因的个数;Y(t):各基因的个数
  29. Private Sub Command1_Click()             '返回主窗口
  30. Form1.Show
  31. Form2.Hide
  32. End Sub

  33. Private Sub Command3_Click()             '初始化
  34. Combo1.ListIndex = -1
  35. Text2.Text = ""
  36. Text7.Text = ""
  37. Text8.Text = ""
  38. For j = 1 To 100
  39. k(j) = 0
  40. t = 0
  41. m = 0
  42. sh = 0
  43. n = ""
  44. Next
  45. For i = 1 To 100
  46. k(i) = 0
  47. Next
  48. For j = 1 To 100
  49. For i = 1 To 10
  50.   l(j, i) = 0
  51. Next
  52. Next
  53. End Sub                               '利用For循环清空各个值及数组
  54. Private Sub Command2_Click()            '运行
  55. b = timeGetTime()                      '调取程序开始时间
  56. j = Combo1.ListIndex
  57. If j = 1 Then                           '选择随机函数Rnd法
  58. z = Text3.Text                          '给种群大小赋值
  59. p = Val(Text9)                          '给约束赋值
  60. For j = 1 To z
  61.   For i = 1 To 1000
  62.   bb = timeGetTime()()
  63.   Randomize (bb + i)     '利用时间加循环次数作为控制因子对Rnd函数进行初始化
  64.   X = Int(p * Rnd)
  65.   t = X Mod 10
  66.   If Y(t) < p Then        '当Y(t)大于各基因的约束时跳出If语句
  67.   Y(t) = Y(t) + 1
  68.   n = n & t
  69.   End If
  70.   u = Len(n)
  71.   If u = p * p Then       '当染色体的长度达到100时跳出For循环,j=j+1
  72.   Exit For
  73.   End If
  74.   Next i
  75. n = Replace(n, "0", "a")   '将染色体中的所有字符"0"置换为"a"
  76. r(j) = n
  77. i = 1
  78. n = ""
  79. For t = 0 To 9           '将Y(t)进行清零
  80. Y(t) = 0
  81. Next
  82. Next j
  83. Open "F:\vb1\随机函数法.txt" For Output As #1   '输出初始种群
  84. For i = 1 To z Step 1
  85. Print #1, r(i)
  86. Next i
  87. Text7.Text = r(1)                             '将第一条染色体输出到窗口中
  88. Close #1
  89. D = timeGetTime()                           '调取程序结束时间
  90. Text8.Text = (D - b) / 1000 & "秒"               '统计程序运行时间
  91. shang                                           '调用子函数
  92. Open "F:\vb1\重复.txt" For Output As #3         '输出初始种群中的重复染色体
  93. For i = 1 To z - 1
  94. For j = i + 1 To z
  95. If r(i) = r(j) Then                           '如果两条染色体相同则输出
  96. Print #3, r(i)
  97. End If
  98. Next
  99. Next
  100. Close #3
  101. Else                                        '选择混合同余法
  102. p = Val(Text9)                                '给初始种群赋值
  103. a = Text4.Text                                '给参数赋值
  104. a = 4 * a + 1
  105. C = Text5.Text
  106. C = 2 * C + 1
  107. z = Text3.Text
  108. For j = 1 To z
  109. bb = timeGetTime()
  110. Randomize (bb + i)                   '利用时间加循环次数作为控制因子对Rnd函数进行初始化
  111. X = Int(Rnd * (p * 10))                       '产生0到99的随机数
  112. S(1) = X
  113. For i = 1 To 127
  114. S(i + 1) = (a * S(i) + C) Mod 128             '对随机数进行运算
  115. If S(i + 1) < 100 Then
  116. u = S(i + 1) Mod 10
  117. n = n & u
  118. End If
  119. Next i
  120. n = n & (X Mod 10)
  121. n = Replace(n, "0", "a")                        '将染色体中的字符"0"置换为"a"
  122. r(j) = n
  123. i = 1
  124. n = ""
  125. Next j
  126. Open "F:\vb1\混合同余法.txt" For Output As #2  '输出不可行初始种群
  127. For i = 1 To z Step 1
  128.   Print #2, r(i)
  129. Next i
  130. Text7.Text = r(1)                              '将第一条染色体输出在窗口上
  131. Close #2
  132. D = timeGetTime()                            '调取程序结束时间
  133. Text8.Text = (D - b) / 1000 & "秒"                '统计程序运行时间
  134. shang                                       '调用子函数
  135. Open "F:\vb1\重复.txt" For Output As #4       '输出重复的染色体
  136. For i = 1 To z - 1
  137. For j = i + 1 To z
  138.   If r(i) = r(j) Then                            '如果两条染色体相同则输出
  139.   Print #4, r(j)
  140.   End If
  141. Next
  142. Next
  143. Close #4
  144. End If
  145. End Sub
  146. Private Function shang()                        '子函数计算熵值
  147. t = 0
  148. For j = 1 To 100
  149.   For i = 1 To z
  150.    Select Case Mid(r(i), j, 1)            '统计r(i)中第i基因位上的各基因个数
  151.    Case "1"
  152.    g(1) = g(1) + 1                             '若是字符"1",则g(1)加1,统计字符的个数
  153.    Case "2"
  154.    g(2) = g(2) + 1
  155.    Case "3"
  156.    g(3) = g(3) + 1
  157.    Case "4"
  158.    g(4) = g(4) + 1
  159.    Case "5"
  160.    g(5) = g(5) + 1
  161.    Case "6"
  162.    g(6) = g(6) + 1
  163.    Case "7"
  164.    g(7) = g(7) + 1
  165.    Case "8"
  166.    g(8) = g(8) + 1
  167.    Case "9"
  168.    g(9) = g(9) + 1
  169.    Case "a"
  170.    g(10) = g(10) + 1
  171.    Case Else
  172.    g(11) = 0
  173.    End Select
  174.    Next
  175.    For i = 1 To 10                          '不同基因的个数统计
  176.     If g(i) <> 0 Then
  177.     k(j) = k(j) + 1
  178.     End If
  179.    Next
  180.     For i = 1 To 10                        '不同基因位上不同基因的概率统计
  181.      l(j, i) = g(i) / z
  182.     Next
  183.     For i = 1 To 10                        '将g(10)清零
  184.      g(i) = 0
  185.     Next
  186.   If k(j) > t Then                          '统计各基因位上基因的最大值
  187.    t = k(j)
  188.   End If
  189. Next
  190. For j = 1 To 100                           '将二维数组中的各个值赋给m
  191. For i = 1 To k(j)
  192.   m = l(j, i)
  193.   If  m <> 0 Then
  194.   sh = 1 / (Log(t) * 100) * Log(m) * (-m) + sh   '计算熵值
  195.   End If
  196. Next
  197. Next
  198. Text2.Text = sh                            '输出熵值
  199. End Function
  200. Private Sub Command4_Click()                    '在窗口中直接查看重复的初始种群
  201. Shell "notepad.exe " & App.Path & "\重复", vbNormalFocus
  202. End Sub
  203. Private Sub Command6_Click()       '在窗口中查看由混合同余法产生的初始种群                  
  204. Shell "notepad.exe " & App.Path & "\混合同余法", vbNormalFocus
  205. End Sub
  206. Private Sub Command7_Click()       '在窗口中查看由随机函数法产生的初始种群
  207. Shell "notepad.exe " & App.Path & "\随机函数法", vbNormalFocus
  208. End Sub
  209. Private Sub Command8_Click()       '查看每条染色体的个数
  210. Load Form4
  211. Form4.Show
  212. End Sub
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-21 22:30 , Processed in 0.993330 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表