1 /** 2 * Copyright: © 2012-2014 Anton Gushcha 3 * License: Subject to the terms of the MIT license, as written in the included LICENSE file. 4 * Authors: NCrashed <ncrashed@gmail.com>, 5 * LeMarwin <lemarwin42@gmail.com>, 6 * Nazgull09 <nazgull90@gmail.com> 7 */ 8 module devol.programtype; 9 10 public 11 { 12 import devol.individ; 13 import devol.world; 14 import devol.std.line; 15 } 16 private 17 { 18 import std.math; 19 import std..string; 20 } 21 22 interface ProgTypeAbstract 23 { 24 /// Минимальный размер программы при генерации 25 @property uint progMinSize() 26 in 27 { 28 assert(progMinSize() <= progMaxSize(), "Min program size is greater then max program size!"); 29 } 30 31 /// Максимальный размер программы при генерации 32 @property uint progMaxSize() 33 in 34 { 35 assert(progMinSize() <= progMaxSize(), "Min program size is greater then max program size!"); 36 } 37 38 /// Минимальный размер секции при генерации 39 @property uint scopeMinSize() 40 in 41 { 42 assert(scopeMinSize() <= scopeMaxSize(), "Min scope size is greater then max scope size!"); 43 } 44 45 /// Максимальный размер секции при генерации 46 @property uint scopeMaxSize() 47 in 48 { 49 assert(scopeMinSize() <= scopeMaxSize(), "Min scope size is greater then max scope size!"); 50 } 51 52 /// Шанс сгененрировать новую подлинию при генерации 53 @property float newOpGenChance() 54 in 55 { 56 assert(abs(newOpGenChance()+newScopeGenChance()+newLeafGenChance()-1) < 0.01, "Generation summed chance isn't 1!"); 57 } 58 out(result) 59 { 60 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 61 } 62 63 /// Шанс сгенерировать новую подсекцию при генерации 64 @property float newScopeGenChance() 65 in 66 { 67 assert(abs(newOpGenChance()+newScopeGenChance()+newLeafGenChance()-1) < 0.01, "Generation summed chance isn't 1!"); 68 } 69 out(result) 70 { 71 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 72 } 73 74 /// Шанс сгенерировать новый аргумент при генерации 75 @property float newLeafGenChance() 76 in 77 { 78 assert(abs(newOpGenChance()+newScopeGenChance()+newLeafGenChance()-1) < 0.01, "Generation summed chance isn't 1!"); 79 } 80 out(result) 81 { 82 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 83 } 84 85 /// Шанс изменения значения листа программы 86 @property float mutationChangeChance() 87 in 88 { 89 assert(abs(mutationChangeChance()+mutationReplaceChance()+mutationDeleteChance()-1) < 0.01, "Generation summed chance isn't 1!"); 90 } 91 out(result) 92 { 93 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 94 } 95 96 /// Шанс замены узла программы на подлинию 97 @property float mutationReplaceChance() 98 in 99 { 100 assert(abs(mutationChangeChance()+mutationReplaceChance()+mutationDeleteChance()-1) < 0.01, "Generation summed chance isn't 1!"); 101 } 102 out(result) 103 { 104 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 105 } 106 107 /// Шанс удаление узла программы и замены его листом 108 @property float mutationDeleteChance() 109 in 110 { 111 assert(abs(mutationChangeChance()+mutationReplaceChance()+mutationDeleteChance()-1) < 0.01, "Generation summed chance isn't 1!"); 112 } 113 out(result) 114 { 115 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 116 } 117 118 /// Шанс добавления новой линии в программе 119 @property float mutationAddLineChance() 120 in 121 { 122 assert(mutationAddLineChance()+mutationRemoveLineChance() <= 1, "Mutation summ chance of add/remove line is greater 1!"); 123 } 124 out(result) 125 { 126 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 127 } 128 129 /// Шанс удаления линии в программе 130 @property float mutationRemoveLineChance() 131 in 132 { 133 assert(mutationAddLineChance()+mutationRemoveLineChance() <= 1, "Mutation summ chance of add/remove line is greater 1!"); 134 } 135 out(result) 136 { 137 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 138 } 139 140 /// Максимальный модуль изменения значений для числовых типов 141 @property string maxMutationChange() 142 out(result) 143 { 144 assert(isNumeric(result), "Mutation change must be a numeric string!"); 145 } 146 147 /// Шанс провести операцию мутации над индивидом 148 @property float mutationChance() 149 in 150 { 151 assert( abs( mutationChance()+crossingoverChance() - 1) < 0.01, "Summ of mutattion and crossingover chances isn't 1.0!"); 152 } 153 out(result) 154 { 155 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 156 } 157 158 /// Шанс провести операцию кроссинговера над индивидом 159 @property float crossingoverChance() 160 out(result) 161 { 162 assert( 0 <= result && result <= 1, "Return value isn't a probability!"); 163 } 164 165 /// Часть популяции из лучших индивидов, которые будут скопированы в следующее поколение 166 @property float copyingPart() 167 out(result) 168 { 169 assert( 0 <= result && result <= 1, "Return value must be in range [0,1]!"); 170 } 171 172 /// Размер генома, при котором начинает повышаться шанс мутации удаления 173 @property size_t deleteMutationRiseGenomeSize(); 174 // out(result) 175 // { 176 // assert(result <= maxGenomeSize(), "Return value must be less or equal maxGenomeSize"); 177 // } 178 179 /// Максимальный размер генома индивида в количестве листов 180 @property size_t maxGenomeSize(); 181 // out(result) 182 // { 183 // assert(result >= deleteMutationRiseGenomeSize(), "Return value must be greater or equal deleteMutationRiseGenomeSize"); 184 // } 185 186 /// Оценка результата работы индивида 187 double getFitness(IndAbstract pInd, WorldAbstract pWorld, double time); 188 189 /// Инициализация входных значений для индивида 190 Line[] initValues(WorldAbstract pWorld); 191 } 192