Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. open System;
  2.  
  3. let random = new System.Random()
  4.  
  5. type Gene(r : int, g : int, b : int) =
  6. member this.r = r
  7. member this.g = g
  8. member this.b = b
  9.  
  10. let fitness (gene : Gene) =
  11. gene.r + gene.g + gene.b
  12.  
  13. let mutate (gene : Gene) =
  14. if random.Next(0, 100) > 94 then
  15. let randomGene = random.Next(0, 3);
  16. let randomValue = random.Next(0, 256);
  17. if randomGene = 0 then
  18. let result = new Gene(randomValue, gene.g, gene.b)
  19. result
  20. else if randomGene = 1 then
  21. let result = new Gene(gene.r, randomValue, gene.b)
  22. result
  23. else
  24. let result = new Gene(gene.r, gene.g, randomValue)
  25. result
  26. else
  27. gene
  28.  
  29. let randomChild (geneA : Gene) (geneB : Gene) =
  30. let randParent = random.Next(0, 6);
  31.  
  32. if randParent = 0 then
  33. new Gene(geneA.r, geneB.g, geneA.b)
  34. else if randParent = 1 then
  35. new Gene(geneB.r, geneA.g, geneB.b)
  36. else if randParent = 2 then
  37. new Gene(geneA.r, geneA.g, geneB.b)
  38. else if randParent = 3 then
  39. new Gene(geneB.r, geneB.g, geneA.b)
  40. else if randParent = 4 then
  41. new Gene(geneA.r, geneB.g, geneB.b)
  42. else
  43. new Gene(geneB.r, geneB.g, geneA.b)
  44.  
  45. let spliceGenes (geneA : Gene) (geneB : Gene) =
  46. let fitA = fitness geneA
  47. let fitB = fitness geneB
  48. let randChild = randomChild geneA geneB
  49.  
  50. if fitA > fitB then
  51. let childA = mutate randChild
  52. let childB = new Gene(geneA.r, geneA.g, geneA.b) |> mutate
  53. [childA; childB]
  54. else
  55. let childA = new Gene(geneB.r, geneB.g, geneB.b) |> mutate
  56. let childB = mutate randChild
  57. [childA; childB]
  58.  
  59. let rec doBreeding genes =
  60. if (List.length genes) > 1 then
  61. let g1 = List.head genes
  62. let g2 = List.head (List.tail genes)
  63. let list = spliceGenes g1 g2
  64. let res = list @ (doBreeding (List.tail (List.tail genes)))
  65. res
  66. else
  67. []
  68.  
  69. let randomGene = fun () ->
  70. let geneR = random.Next(0, 256)
  71. let geneG = random.Next(0, 256)
  72. let geneB = random.Next(0, 256)
  73. let g = new Gene(geneR, geneG, geneB);
  74. g
  75.  
  76. let printGene (g: Gene) =
  77. printfn "R: %i, G: %i, B: %i" g.r g.g g.b
  78.  
  79. let printGenes genes =
  80. genes
  81. |> Seq.iter(fun x -> printGene x)
  82.  
  83. let shuffle genes =
  84. genes |> List.sortBy (fun gene -> random.Next())
  85.  
  86. let checkPopulationFitness genes =
  87. let avg = List.averageBy(fun ele -> float (fitness ele)) genes
  88. avg < 765.0
  89.  
  90. let rec doXSeries x geneSeq =
  91. let popFails = checkPopulationFitness geneSeq
  92. if x > 0 && popFails then
  93. let newSeq = doBreeding (Seq.toList geneSeq)
  94. let num = x - 1
  95. let result = doXSeries num (newSeq |> shuffle)
  96. result
  97. else
  98. printfn "%i" (10000 - x)
  99. geneSeq
  100.  
  101. [<EntryPoint>]
  102. let main argv =
  103. let geneSeq = seq { for x in 1..16 -> randomGene() } |> Seq.toList
  104. ignore (printGenes geneSeq)
  105.  
  106. printfn "\n"
  107.  
  108. let newSeq = doXSeries 10000 geneSeq
  109. ignore (printGenes newSeq)
  110.  
  111. 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement