form1.frm

来自「水库调度的遗传算法」· FRM 代码 · 共 533 行 · 第 1/2 页

FRM
533
字号
   Data1.Recordset.Fields("4水位末") = upwater_level(bestindex, 12)
   '发电流量
   Data1.Recordset.Fields("5发流量") = Q2(bestindex, 1)
   Data1.Recordset.Fields("6发流量") = Q2(bestindex, 2)
   Data1.Recordset.Fields("7发流量") = Q2(bestindex, 3)
   Data1.Recordset.Fields("8发流量") = Q2(bestindex, 4)
   Data1.Recordset.Fields("9发流量") = Q2(bestindex, 5)
   Data1.Recordset.Fields("10发流量") = Q2(bestindex, 6)
   Data1.Recordset.Fields("11发流量") = Q2(bestindex, 7)
   Data1.Recordset.Fields("12发流量") = Q2(bestindex, 8)
   Data1.Recordset.Fields("1发流量") = Q2(bestindex, 9)
   Data1.Recordset.Fields("2发流量") = Q2(bestindex, 10)
   Data1.Recordset.Fields("3发流量") = Q2(bestindex, 11)
   Data1.Recordset.Fields("4发流量") = Q2(bestindex, 12)
   '弃水流量
   Data1.Recordset.Fields("5弃流量") = QS(bestindex, 1)
   Data1.Recordset.Fields("6弃流量") = QS(bestindex, 2)
   Data1.Recordset.Fields("7弃流量") = QS(bestindex, 3)
   Data1.Recordset.Fields("8弃流量") = QS(bestindex, 4)
   Data1.Recordset.Fields("9弃流量") = QS(bestindex, 5)
   Data1.Recordset.Fields("10弃流量") = QS(bestindex, 6)
   Data1.Recordset.Fields("11弃流量") = QS(bestindex, 7)
   Data1.Recordset.Fields("12弃流量") = QS(bestindex, 8)
   Data1.Recordset.Fields("1弃流量") = QS(bestindex, 9)
   Data1.Recordset.Fields("2弃流量") = QS(bestindex, 10)
   Data1.Recordset.Fields("3弃流量") = QS(bestindex, 11)
   Data1.Recordset.Fields("4弃流量") = QS(bestindex, 12)
   Data1.Recordset.Update
End Sub
Public Sub generatepopulation()
'***把水位的取值划为M等份
For j = 1 To insize  'insize是个体大小
    m(j) = (max_water_level(j) - min_water_level(j)) / 0.05
Next j
'****************生成初始群体
   Randomize
   For i = 1 To popsize
       vm(i, 0) = cha(Z(), V(), 20, zd)                         '由死水位查死库容
       upwater_level(i, 0) = zd                                 '死水位
       For j = 1 To insize
         If j <> 12 Then
           K(i, j) = Int(Rnd * (20 + 1)) * (m(j) / 20)
           upwater_level(i, j) = min_water_level(j) + K(i, j) * (max_water_level(j) - min_water_level(j)) / m(j) '上游水位
           vm(i, j) = cha(Z(), V(), 20, upwater_level(i, j))    '由上游水位查库容
           w(i, j) = vm(i, j - 1) + Q1(j) - vm(i, j)           '下泄水量
           Q2(i, j) = (w(i, j) * 100000000) / (T(j) * 86400)               '下泄流量
           downwater_level(i, j) = cha(Q(), zx(), 53, Q2(i, j)) '由下泄流量查下游水位
           H(i, j) = (upwater_level(i, j) + upwater_level(i, j - 1)) / 2 - downwater_level(i, j)   '水头,暂且不考虑水头损失。
           n(i, j) = 8.5 * Q2(i, j) * H(i, j) * 0.0001         '出力,万KW
         Else
           upwater_level(i, 12) = zd                             '第12个计算时段末水位为死水位
           vm(i, j) = cha(Z(), V(), 20, upwater_level(i, j))     '由上游水位查库容
           w(i, j) = vm(i, j - 1) + Q1(j) - vm(i, j)           '下泄水量
           Q2(i, j) = (w(i, j) * 100000000) / (T(j) * 86400)                 '下泄流量
           downwater_level(i, j) = cha(Q(), zx(), 53, Q2(i, j))  '由下泄流量查下游水位
           H(i, j) = (upwater_level(i, j) + upwater_level(i, j - 1)) / 2 - downwater_level(i, j)   '水头,暂且不考虑水头损失。
           n(i, j) = 8.5 * Q2(i, j) * H(i, j) * 0.0001         '出力,万KW
         End If
       Next j
   Next i
End Sub

Public Sub evaluatepopulation() '计算该群体适应度,然后求出平均适应值
                                '和适应度最高与最差个体
Dim sum As Single
Dim sumnum As Single
 MMM = 50
   For i = 1 To popsize
        sum = 0
        upwater_level(i, 0) = zd
        For j = 1 To insize
            upwater_level(i, j) = min_water_level(j) + K(i, j) * (max_water_level(j) - min_water_level(j)) / m(j) '上游水位
            H(i, j) = (upwater_level(i, j) + upwater_level(i, j - 1)) / 2 - downwater_level(i, j)   '水头,暂且不考虑水头损失。
            n(i, j) = 8.5 * Q2(i, j) * H(i, j) * 0.0001         '出力,万KW。
            QS(i, j) = 0                                        '弃水流量为0。
            '装机容量限制
            If n(i, j) > capacity Then                          '出力大于装机容量
               n(i, j) = 30
               QL = 300000 / (8.5 * H(i, j))                    '发电流量
               QS(i, j) = Q2(i, j) - QL                         '弃水流量
            End If
            '保证出力限制
            If n(i, j) < bzcl And Q2(i, j) < min_Q Then
               'E(i, j) = n(i, j) * T(j) * 24 / 10000 - MMM * (bzcl - n(i, j))    '时段电量(亿度)
               E(i, j) = 0.5 * n(i, j) * T(j) * 24 / 10000
            Else
               E(i, j) = n(i, j) * T(j) * 24 / 10000
            End If
            sum = sum + E(i, j)                                 '累积电量(亿度)
        Next j
           fitness(i) = sum                                    '一年的发电量
   Next i
  '*******************求出群体适应度的平均值
   sunnum = 0
   For i = 1 To popsize
     sumnum = sumnum + fitness(i)
   Next i
   averagefitness = sumnum / popsize
  '******找出当前群体中适应度最高和最差的个体
   bestfitness = fitness(1)
   For i = 1 To popsize
       If fitness(i) >= bestfitness Then
          bestfitness = fitness(i)
          bestindex = i
       End If
   Next i
   worstfitness = fitness(1)
   For i = 1 To popsize
       If fitness(i) <= worstfitness Then
          worstfitness = fitness(i)
          worstindex = i
       End If
   Next i
End Sub
Public Sub selectionoperator()    '选择运算采用轮盘赌的方式

Dim p As Single, flag As Integer
Dim sumnum As Single
Dim pop(500) As Single             '适应值累加比例
'开始
sumnum = 0
For i = 1 To popsize  '计算该代总的适应度值
  sumnum = sumnum + fitness(i)
Next i
popfitness(1) = fitness(1)
For i = 2 To popsize '累加适应值
 popfitness(i) = popfitness(i - 1) + fitness(i)
Next i
'累加适应比例
  For i = 1 To popsize
      pop(i) = popfitness(i) / sumnum
  Next i
'选择
Randomize
  For i = 1 To popsize
      p = 0.3  '选择概率
      flag = 1
      Do While p > pop(flag) And flag < 30
               flag = flag + 1
      Loop
      For j = 1 To insize
          newK(i, j) = K(flag, j)
      Next j
  Next i
  For i = 1 To popsize  '复制操作
      For j = 1 To insize
        K(i, j) = newK(i, j)
      Next j
  Next i
End Sub
Public Sub crossoveroperator() '交叉运算
   Randomize
   For i = 1 To popsize / 2
       If i = 1 Then
          index(i) = Int((popsize / 2 + 1) * Rnd) + popsize / 2
       End If
       
       If i <> 1 Then
1000
          index(i) = Int((popsize / 2 + 1) * Rnd) + popsize / 2
          zzz = index(i)
          For r = 1 To (i - 1)
              If index(r) = zzz Then
                 GoTo 1000
              End If
          Next r
       End If
   Next i
    
    For i = 1 To popsize
      For j = 1 To insize
          k1(i, j) = K(i, j)
      Next j
    Next i

    Randomize
    For i = 1 To popsize / 2
        crossover_position = Int(insize * Rnd + 1) '交叉点
        For j = crossover_position To insize
            k1(i, j) = K(index(i), j)
            k1(index(i), j) = K(i, j)
        Next j
    Next i
End Sub
Public Sub mutationoperator() '变异运算,采用非均匀变异开始(基本完整)
    b = 3                                    '形状系数
    s = l / Maxgen                           '进化标计
    Randomize
    For i = 1 To popsize
        a2 = Int((insize - 1) * Rnd + 1)    '确定变异基因位
        a3 = Int(Rnd * 2 + 1)
        If a3 = 1 Then
           y = m(a2) - k1(i, a2)
        Else
           y = k1(i, a2) - 0
        End If
        ss = Rnd
        d = y * (1 - ss ^ ((1 - s) * b))
        If a3 = 1 Then
           k1(i, a2) = k1(i, a2) + d
        Else
           k1(i, a2) = k1(i, a2) - d
        End If
    Next i
'******非均匀变异结束
End Sub
Public Sub generatenextpopulation() '产生下一代群体
 
 Call selectionoperator  '选择算子
 Call crossoveroperator  '交叉算子
 Call mutationoperator   '变异算子
 For i = 1 To popsize
   For j = 1 To insize
      K(i, j) = k1(i, j)
   Next j
 Next i
End Sub



Private Sub Command2_Click()
   End
End Sub

Private Sub Form_Load()

Data1.DatabaseName = App.Path + "\资料数据库.mdb"

Data1.RecordSource = "select * from 水位库容表"
Data1.Refresh
Data1.Recordset.MoveLast
aa = Data1.Recordset.RecordCount
Data1.Recordset.MoveFirst
For i = 1 To aa
    Z(i) = Data1.Recordset.Fields("水位")
    V(i) = Data1.Recordset.Fields("库容")
    Data1.Recordset.MoveNext
Next i

Data1.RecordSource = "select * from 下泄流量下游水位表"
Data1.Refresh
Data1.Recordset.MoveLast
bb = Data1.Recordset.RecordCount
Data1.Recordset.MoveFirst
For i = 1 To bb
    zx(i) = Data1.Recordset.Fields("下游水位") '下泄曲线
    Q(i) = Data1.Recordset.Fields("下泄流量")
    Data1.Recordset.MoveNext
Next i

Data1.RecordSource = "select * from 入库流量表"
Data1.Refresh
Data1.Recordset.MoveLast
cc = Data1.Recordset.RecordCount
Data1.Recordset.MoveFirst
For i = 1 To cc
    Q1(i) = Data1.Recordset.Fields("入库流量")
    T(i) = Data1.Recordset.Fields("月天数")
    Q1(i) = Q1(i) * T(i) * 86400 / 100000000
    Data1.Recordset.MoveNext
Next i

Data1.Visible = False
End Sub

⌨️ 快捷键说明

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