Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Map;
- import java.util.TreeMap;
- /**
- * Created by Kate Mosquito on 16.09.2018.
- */
- public class EVO {
- static int a=-5;
- static int b=5;
- static double e=0.1;
- static int n;
- static int k=0;
- static int iX[]; //массив для начальной популяции
- static double distance_matr[][];
- static double Y[];
- static ArrayList<Integer> population=new ArrayList<>();
- static Map <Double, Integer> treeMap = new TreeMap <Double, Integer>();
- static ArrayList <Integer> final_pop = new ArrayList<>();
- static {
- n=(int)Math.round((b-a)/e);
- k=Math.round(log2(n));
- e=(b-a)/Math.pow(2,k);
- distance_matr=new double[30][30];
- }
- public static int log2(int n){
- if(n <= 0) throw new IllegalArgumentException();
- return 31 - Integer.numberOfLeadingZeros(n);
- }
- public static double func (double xx){ //функция нахождения у-ков, действительных значений точек на графике
- double x=a+xx*e;
- return x*x-2*x+1; //функция одной переменной
- }
- public static void generate (){ //функция для формирования начальной популяции
- iX = new int [30];
- Y = new double[30];
- int beg= 0, end=(int)Math.pow(2,k);
- iX[0]=beg + (int) (Math.random() * end);
- boolean flag=true;
- for (int i=1; i< iX.length;i++) {
- int z= beg + (int) (Math.random() * end);
- for (int j=0; j<iX.length; j++) { //проверка, чтоб не было одинаковых значений
- if (iX[j]==z) {flag=false; break;}
- if (flag=true) {
- iX[i]=z;
- Y[i]=func(iX[i]);
- }
- }
- flag=true;
- }
- System.out.println("Первоначальная популяция: ");
- for (int i=0; i<iX.length;i++) System.out.print(iX[i]+" ");
- }
- public static void raschet (){ //аутбридинг фенотипный
- int first = 0 + (int) (Math.random() * 30);
- int sec=maxParent(first);
- String f_ch = toBinary(iX[first]);
- String sec_ch = toBinary(iX[sec]);
- int razryad = 0 + (int) (Math.random()*k);
- String offspring1 = f_ch.substring(0,razryad)+sec_ch.substring(razryad);
- String offspring2 = sec_ch.substring(0,razryad)+f_ch.substring(razryad);
- System.out.println("Первый родитель: "+f_ch);
- System.out.println("Второй родитель: "+sec_ch);
- System.out.println("Разряд:"+razryad);
- System.out.println("Первый отпрыск: "+offspring1);
- System.out.println("Второй отпрыск: "+offspring2);
- //ВЫБОР оффспринга (ото 0 до 1)
- String OFFSPRING="";
- double r = Math.random();
- if (r<0.5) OFFSPRING=offspring1;
- else OFFSPRING=offspring2;
- System.out.println("Выбраный отпрыск: "+OFFSPRING);
- //МУТАЦИЯ
- r = Math.random();
- if (r<=0.01){
- System.out.println("МУТАЦИЯ СОСТОЯЛАСЬ");
- razryad = 0 + (int) (Math.random()*k);
- if (OFFSPRING.charAt(razryad)=='0') {
- char[] OFFSPRINGChars = OFFSPRING.toCharArray();
- OFFSPRINGChars[razryad] = '1';
- OFFSPRING = String.valueOf(OFFSPRINGChars);
- }
- else if (OFFSPRING.charAt(razryad)=='1') {
- char[] OFFSPRINGChars = OFFSPRING.toCharArray();
- OFFSPRINGChars[razryad] = '0';
- OFFSPRING = String.valueOf(OFFSPRINGChars);
- }
- System.out.println("Разряд:"+(razryad+1));
- System.out.println("Число после мутации: "+OFFSPRING);
- }
- int offspring = ToInt(OFFSPRING);
- System.out.println("В десятеричной системе: "+offspring);
- //ФОРМИРОВАНИЕ ПОПУЛЯЦИИ (элитный отбор - проверка на равенство элементов
- boolean flag=true;
- if (population.isEmpty()) population.add(offspring);
- else if (!population.isEmpty()){
- for (Integer i:
- population) {
- if (offspring==i) {flag=false; break;}
- }
- if (flag=true) {
- boolean flag1 = true;
- for (int i = 0; i < iX.length; i++) {
- if (offspring == iX[i]) {
- flag1 = false;
- break;
- }
- }
- if (flag1 == true) {
- population.add(offspring);
- }
- flag1=true;
- }
- flag=true;
- }
- }
- public static void form_new_pop (){
- final_pop.addAll(population);
- for (int i=0; i<iX.length;i++) final_pop.add(iX[i]);
- Collections.sort(final_pop);
- for (Integer i: final_pop
- ) {
- System.out.print(i+", ");
- }
- System.out.println();
- }
- public static void treemap (){
- for (int i=0; i<60; i++){
- treeMap.put(func(final_pop.get(i)),final_pop.get(i));
- }
- int i =0;
- for(Map.Entry<Double, Integer> item : treeMap.entrySet()){
- //System.out.println(item.getKey()+", "+item.getValue());
- if(i!=29){
- iX[i]=item.getValue();
- Y[i]=func(iX[i]);
- System.out.println(iX[i]+", "+Y[i]);
- }
- }
- }
- public static double max(double a[][]){
- double m=-1000;
- for (int i = 0; i < a.length; i++) {
- for (int j = 0; j < a.length; j++) {
- if (a[i][j]>m)m=a[i][j];
- }
- }
- return m;
- }
- public static int maxParent(int first){
- double max=-1000;
- int j=0;
- for (int i = 0; i < Y.length; i++) {
- double d=Math.abs(Y[first]-Y[i]);
- if(d>max){
- max=d;
- j=i;
- }
- }
- return j;
- }
- public static double[][] distance(double [] matrix){//рассчет расстояний между текущей популяцией
- double dist[][]=new double[30][30];
- for (int i = 0; i < 30; i++) {
- for (int j = 0; j < 30; j++) {
- dist[i][j]=Math.abs(matrix[i]-matrix[j]);
- }
- }
- return dist;
- }
- public static String toBinary (int dec){ //перевод в двоичную систему
- String bin_str = Integer.toBinaryString(dec);
- if (bin_str.length()!=13){
- int l=13-bin_str.length();
- StringBuffer sb = new StringBuffer(bin_str);
- for (int i=0; i<l; i++){
- sb=sb.insert(0,'0');
- }
- bin_str= sb.toString();
- }
- return bin_str;
- } //из 10 в 2-ю
- public static int pow(int a, int b) {//???
- int result = 1;
- for (int i = 0; i < b; i++) {
- result *= a;
- }
- return result;
- } //для след функции
- public static int ToInt(String bin){
- int res = 0, a = 0, mult = 0;
- char[] symbols = bin.toCharArray();
- for(int len = symbols.length-1; len >= 0; len--){
- int temp = 0;
- a = Character.getNumericValue(symbols[len]);
- temp = a * pow(2, mult);
- mult++;
- res += temp;
- }
- return res;
- } //Из 2-1 в 10-ю
- public static void main(String[] args) {
- System.out.println("к=" + k + " e" + e);
- generate();
- distance_matr = distance(Y);
- for (int i = 0; i < distance_matr.length; i++) {
- for (int j = 0; j < distance_matr.length; j++) {
- System.out.print(Math.round(distance_matr[i][j])+" ");
- }
- System.out.println();
- }
- for (int i = 0; max(distance_matr)>e; i++) {
- System.out.println("---------------------------Популяция"+i+"------------------");
- System.out.println(max(distance_matr));
- while (population.size() != 30) {
- raschet();
- }
- System.out.println("Полученная популяция");
- for (Integer j : population
- ) {
- System.out.print(j + ", ");
- }
- form_new_pop();
- System.out.println("Значения X и У:");
- treemap();
- distance_matr=distance(Y);
- population=new ArrayList<>();
- treeMap = new TreeMap <Double, Integer>();
- final_pop = new ArrayList<>();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement