Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.03 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. System.out.println("Первоначальная популяция: ");
  58. for (int i=0; i<iX.length;i++) System.out.print(iX[i]+" ");
  59. }
  60.  
  61. public static void raschet (){ //аутбридинг фенотипный
  62. int first = 0 + (int) (Math.random() * 30);
  63. int sec=maxParent(first);
  64. String f_ch = toBinary(iX[first]);
  65. String sec_ch = toBinary(iX[sec]);
  66. int razryad = 0 + (int) (Math.random()*k);
  67. String offspring1 = f_ch.substring(0,razryad)+sec_ch.substring(razryad);
  68. String offspring2 = sec_ch.substring(0,razryad)+f_ch.substring(razryad);
  69. System.out.println("Первый родитель: "+f_ch);
  70. System.out.println("Второй родитель: "+sec_ch);
  71. System.out.println("Разряд:"+razryad);
  72. System.out.println("Первый отпрыск: "+offspring1);
  73. System.out.println("Второй отпрыск: "+offspring2);
  74.  
  75.  
  76.  
  77. //ВЫБОР оффспринга (ото 0 до 1)
  78. String OFFSPRING="";
  79. double r = Math.random();
  80. if (r<0.5) OFFSPRING=offspring1;
  81. else OFFSPRING=offspring2;
  82. System.out.println("Выбраный отпрыск: "+OFFSPRING);
  83.  
  84.  
  85. //МУТАЦИЯ
  86. r = Math.random();
  87. if (r<=0.01){
  88. System.out.println("МУТАЦИЯ СОСТОЯЛАСЬ");
  89. razryad = 0 + (int) (Math.random()*k);
  90. if (OFFSPRING.charAt(razryad)=='0') {
  91. char[] OFFSPRINGChars = OFFSPRING.toCharArray();
  92. OFFSPRINGChars[razryad] = '1';
  93. OFFSPRING = String.valueOf(OFFSPRINGChars);
  94. }
  95. else if (OFFSPRING.charAt(razryad)=='1') {
  96. char[] OFFSPRINGChars = OFFSPRING.toCharArray();
  97. OFFSPRINGChars[razryad] = '0';
  98. OFFSPRING = String.valueOf(OFFSPRINGChars);
  99. }
  100. System.out.println("Разряд:"+(razryad+1));
  101. System.out.println("Число после мутации: "+OFFSPRING);
  102. }
  103. int offspring = ToInt(OFFSPRING);
  104. System.out.println("В десятеричной системе: "+offspring);
  105.  
  106. //ФОРМИРОВАНИЕ ПОПУЛЯЦИИ (элитный отбор - проверка на равенство элементов
  107. boolean flag=true;
  108. if (population.isEmpty()) population.add(offspring);
  109. else if (!population.isEmpty()){
  110. for (Integer i:
  111. population) {
  112. if (offspring==i) {flag=false; break;}
  113. }
  114. if (flag=true) {
  115. boolean flag1 = true;
  116. for (int i = 0; i < iX.length; i++) {
  117. if (offspring == iX[i]) {
  118. flag1 = false;
  119. break;
  120. }
  121. }
  122. if (flag1 == true) {
  123. population.add(offspring);
  124. }
  125. flag1=true;
  126. }
  127. flag=true;
  128. }
  129. }
  130.  
  131. public static void form_new_pop (){
  132. final_pop.addAll(population);
  133. for (int i=0; i<iX.length;i++) final_pop.add(iX[i]);
  134. Collections.sort(final_pop);
  135. for (Integer i: final_pop
  136. ) {
  137. System.out.print(i+", ");
  138. }
  139. System.out.println();
  140. }
  141.  
  142. public static void treemap (){
  143. for (int i=0; i<60; i++){
  144. treeMap.put(func(final_pop.get(i)),final_pop.get(i));
  145. }
  146. int i =0;
  147. for(Map.Entry<Double, Integer> item : treeMap.entrySet()){
  148. //System.out.println(item.getKey()+", "+item.getValue());
  149. if(i!=29){
  150. iX[i]=item.getValue();
  151. Y[i]=func(iX[i]);
  152. System.out.println(iX[i]+", "+Y[i]);
  153. }
  154. }
  155. }
  156. public static double max(double a[][]){
  157. double m=-1000;
  158. for (int i = 0; i < a.length; i++) {
  159. for (int j = 0; j < a.length; j++) {
  160. if (a[i][j]>m)m=a[i][j];
  161. }
  162. }
  163. return m;
  164. }
  165. public static int maxParent(int first){
  166. double max=-1000;
  167. int j=0;
  168. for (int i = 0; i < Y.length; i++) {
  169. double d=Math.abs(Y[first]-Y[i]);
  170. if(d>max){
  171. max=d;
  172. j=i;
  173. }
  174. }
  175. return j;
  176. }
  177. public static double[][] distance(double [] matrix){//рассчет расстояний между текущей популяцией
  178. double dist[][]=new double[30][30];
  179. for (int i = 0; i < 30; i++) {
  180. for (int j = 0; j < 30; j++) {
  181. dist[i][j]=Math.abs(matrix[i]-matrix[j]);
  182. }
  183. }
  184. return dist;
  185. }
  186.  
  187. public static String toBinary (int dec){ //перевод в двоичную систему
  188. String bin_str = Integer.toBinaryString(dec);
  189. if (bin_str.length()!=13){
  190. int l=13-bin_str.length();
  191. StringBuffer sb = new StringBuffer(bin_str);
  192. for (int i=0; i<l; i++){
  193. sb=sb.insert(0,'0');
  194. }
  195. bin_str= sb.toString();
  196. }
  197. return bin_str;
  198. } //из 10 в 2-ю
  199.  
  200. public static int pow(int a, int b) {//???
  201. int result = 1;
  202. for (int i = 0; i < b; i++) {
  203. result *= a;
  204. }
  205. return result;
  206. } //для след функции
  207.  
  208. public static int ToInt(String bin){
  209. int res = 0, a = 0, mult = 0;
  210. char[] symbols = bin.toCharArray();
  211. for(int len = symbols.length-1; len >= 0; len--){
  212. int temp = 0;
  213. a = Character.getNumericValue(symbols[len]);
  214. temp = a * pow(2, mult);
  215. mult++;
  216. res += temp;
  217. }
  218. return res;
  219. } //Из 2-1 в 10-ю
  220.  
  221. public static void main(String[] args) {
  222.  
  223. System.out.println("к=" + k + " e" + e);
  224. generate();
  225. distance_matr = distance(Y);
  226. for (int i = 0; i < distance_matr.length; i++) {
  227. for (int j = 0; j < distance_matr.length; j++) {
  228. System.out.print(Math.round(distance_matr[i][j])+" ");
  229. }
  230. System.out.println();
  231. }
  232. for (int i = 0; max(distance_matr)>e; i++) {
  233. System.out.println("---------------------------Популяция"+i+"------------------");
  234. System.out.println(max(distance_matr));
  235. while (population.size() != 30) {
  236. raschet();
  237. }
  238. System.out.println("Полученная популяция");
  239. for (Integer j : population
  240. ) {
  241. System.out.print(j + ", ");
  242. }
  243. form_new_pop();
  244. System.out.println("Значения X и У:");
  245. treemap();
  246. distance_matr=distance(Y);
  247. population=new ArrayList<>();
  248. treeMap = new TreeMap <Double, Integer>();
  249. final_pop = new ArrayList<>();
  250. }
  251. }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement