Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.71 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Map;
  4. import java.util.TreeMap;
  5.  
  6. /**
  7. * Created by Kate Mosquito on 16.09.2018.
  8. */
  9.  
  10. public class EVO {
  11. static int a=-5;
  12. static int b=5;
  13. static double e=0.1;
  14. static int n;
  15. static int k=0;
  16. static int iX[]; //массив для начальной популяции
  17. static double distance_matr[][];
  18. static double Y[];
  19. static ArrayList<Integer> population=new ArrayList<>();
  20. static Map <Double, Integer> treeMap = new TreeMap <Double, Integer>();
  21. static ArrayList <Integer> final_pop = new ArrayList<>();
  22. static {
  23. n=(int)Math.round((b-a)/e);
  24. k=Math.round(log2(n));
  25. e=(b-a)/Math.pow(2,k);
  26. distance_matr=new double[30][30];
  27. }
  28.  
  29. public static int log2(int n){
  30. if(n <= 0) throw new IllegalArgumentException();
  31. return 31 - Integer.numberOfLeadingZeros(n);
  32. }
  33.  
  34. public static double func (double xx){ //функция нахождения у-ков, действительных значений точек на графике
  35. double x=a+xx*e;
  36. return x*x-2*x+1; //функция одной переменной
  37. }
  38.  
  39. public static void generate (){ //функция для формирования начальной популяции
  40. iX = new int [30];
  41. Y = new double[30];
  42. int beg= 0, end=(int)Math.pow(2,k);
  43. iX[0]=beg + (int) (Math.random() * end);
  44. boolean flag=true;
  45.  
  46. for (int i=1; i< iX.length;i++) {
  47. int z= beg + (int) (Math.random() * end);
  48. for (int j=0; j<iX.length; j++) { //проверка, чтоб не было одинаковых значений
  49. if (iX[j]==z) {flag=false; break;}
  50. if (flag=true) {
  51. iX[i]=z;
  52. Y[i]=func(iX[i]);
  53. }
  54. }
  55. flag=true;
  56. }
  57.  
  58. for (int i=0; i<iX.length;i++) System.out.print("SUPER POPA="+iX[i]);
  59. }
  60.  
  61. public static void raschet (){ //панмиксией
  62. int first = 0 + (int) (Math.random() * 30); //панмиксия - рандомный выбор индекса икса в массиве
  63. int sec=0 + (int) (Math.random() * 30);
  64. while (first==sec)
  65. {sec = 0 + (int) (Math.random() * 30);}
  66. String f_ch = toBinary(iX[first]);
  67. System.out.println("first chi="+f_ch);
  68. String sec_ch = toBinary(iX[sec]);
  69. System.out.println("sex chi="+sec_ch);
  70. int razryad = 0 + (int) (Math.random()*k);
  71. System.out.println("razryad="+razryad);
  72. String offspring1 = f_ch.substring(0,razryad)+sec_ch.substring(razryad);
  73. System.out.println("offspring1="+offspring1);
  74.  
  75. String offspring2 = sec_ch.substring(0,razryad)+f_ch.substring(razryad);
  76. System.out.println("offspring2="+offspring2);
  77.  
  78.  
  79.  
  80. //ВЫБОР оффспринга (ото 0 до 1)
  81. String OFFSPRING="";
  82. double r = Math.random();
  83. if (r<0.5) OFFSPRING=offspring1;
  84. else OFFSPRING=offspring2;
  85. System.out.println("nachal'ny OFFSPRING="+OFFSPRING);
  86.  
  87.  
  88. //МУТАЦИЯ
  89. r = Math.random();
  90. if (r<=0.01){
  91. System.out.println("МУТАЦИЯ СОСТОЯЛАСЬ");
  92. razryad = 0 + (int) (Math.random()*k);
  93. if (OFFSPRING.charAt(razryad)=='0') {
  94. char[] OFFSPRINGChars = OFFSPRING.toCharArray();
  95. OFFSPRINGChars[razryad] = '1';
  96. OFFSPRING = String.valueOf(OFFSPRINGChars);
  97. }
  98. else if (OFFSPRING.charAt(razryad)=='1') {
  99. char[] OFFSPRINGChars = OFFSPRING.toCharArray();
  100. OFFSPRINGChars[razryad] = '0';
  101. OFFSPRING = String.valueOf(OFFSPRINGChars);
  102. }
  103. System.out.println("razr="+(razryad+1));
  104. System.out.println("chislo+mutation="+OFFSPRING);
  105. }
  106. int offspring = ToInt(OFFSPRING);
  107. System.out.println("To integer="+offspring);
  108.  
  109. //ФОРМИРОВАНИЕ ПОПУЛЯЦИИ (элитный отбор - проверка на равенство элементов
  110. boolean flag=true;
  111. if (population.isEmpty()) population.add(offspring);
  112. else if (!population.isEmpty()){
  113. for (Integer i:
  114. population) {
  115. if (offspring==i) {flag=false; break;}
  116. }
  117. if (flag=true) {
  118. boolean flag1 = true;
  119. for (int i = 0; i < iX.length; i++) {
  120. if (offspring == iX[i]) {
  121. flag1 = false;
  122. break;
  123. }
  124. }
  125. if (flag1 == true) {
  126. population.add(offspring);
  127. }
  128. flag1=true;
  129. }
  130. flag=true;
  131. }
  132. }
  133.  
  134. public static void form_new_pop (){
  135. final_pop.addAll(population);
  136. for (int i=0; i<iX.length;i++) final_pop.add(iX[i]);
  137. System.out.println("\nsize final_pop="+final_pop.size());
  138. Collections.sort(final_pop);
  139. for (Integer i: final_pop
  140. ) {
  141. System.out.println(i+", ");
  142. }
  143. }
  144.  
  145. public static void treemap (){
  146. for (int i=0; i<60; i++){
  147. treeMap.put(func(final_pop.get(i)),final_pop.get(i));
  148. }
  149. int i =0;
  150. for(Map.Entry<Double, Integer> item : treeMap.entrySet()){
  151. //System.out.println(item.getKey()+", "+item.getValue());
  152. if(i!=29){
  153. iX[i]=item.getValue();
  154. Y[i]=func(iX[i]);
  155. System.out.println(iX[i]+", "+Y[i]);
  156. }
  157. }
  158. }
  159. public static double max(double a[][]){
  160. double m=-1000;
  161. for (int i = 0; i < a.length; i++) {
  162. for (int j = 0; j < a.length; j++) {
  163. if (a[i][j]>m)m=a[i][j];
  164. }
  165. }
  166. return m;
  167. }
  168. public static double[][] distance(double [] matrix){//рассчет расстояний между текущей популяцией
  169. double dist[][]=new double[30][30];
  170. for (int i = 0; i < 30; i++) {
  171. for (int j = 0; j < 30; j++) {
  172. dist[i][j]=Math.abs(matrix[i]-matrix[j]);
  173. }
  174. }
  175. return dist;
  176. }
  177.  
  178. public static String toBinary (int dec){ //перевод в двоичную систему
  179. String bin_str = Integer.toBinaryString(dec);
  180. if (bin_str.length()!=13){
  181. int l=13-bin_str.length();
  182. StringBuffer sb = new StringBuffer(bin_str);
  183. for (int i=0; i<l; i++){
  184. sb=sb.insert(0,'0');
  185. }
  186. bin_str= sb.toString();
  187. }
  188. return bin_str;
  189. } //из 10 в 2-ю
  190.  
  191. public static int pow(int a, int b) {//???
  192. int result = 1;
  193. for (int i = 0; i < b; i++) {
  194. result *= a;
  195. }
  196. return result;
  197. } //для след функции
  198.  
  199. public static int ToInt(String bin){
  200. int res = 0, a = 0, mult = 0;
  201. char[] symbols = bin.toCharArray();
  202. for(int len = symbols.length-1; len >= 0; len--){
  203. int temp = 0;
  204. a = Character.getNumericValue(symbols[len]);
  205. temp = a * pow(2, mult);
  206. mult++;
  207. res += temp;
  208. }
  209. return res;
  210. } //Из 2-1 в 10-ю
  211.  
  212. public static void main(String[] args) {
  213.  
  214. System.out.println("к=" + k + " e" + e);
  215. generate();
  216. distance_matr = distance(Y);
  217. // for (int i = 0; i < distance_matr.length; i++) {
  218. // for (int j = 0; j < distance_matr.length; j++) {
  219. // System.out.print(Math.round(distance_matr[i][j])+" ");
  220. // }
  221. // System.out.println();
  222. // }
  223. for (int i = 0; max(distance_matr)>e; i++) {
  224. System.out.println("---------------------------Популяция"+i+"------------------");
  225. System.out.println(max(distance_matr));
  226. while (population.size() != 30) {
  227. raschet();
  228. }
  229. System.out.println("Полученная популяция");
  230. for (Integer j : population
  231. ) {
  232. System.out.print(j + ", ");
  233. }
  234. form_new_pop();
  235. System.out.println("TREEMAP");
  236. treemap();
  237. distance_matr=distance(Y);
  238. population=new ArrayList<>();
  239. treeMap = new TreeMap <Double, Integer>();
  240. final_pop = new ArrayList<>();
  241. }
  242. }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement