package lt.ktu.gmj.tasks;
import java.util.*;
import java.lang.*;



public class Genetic
{
   private int num_of_Items;
   private int num_of_population;
   public int [][] Population;
   private Random rnd = new Random();

   Genetic(int Items, int pop)
   {

     int i;
     num_of_population = pop;
     num_of_Items = Items;

     Population = new int[pop][];

     for (i=0;i<pop;i++) Population[i] = new int[Items];




   }



public void mutation(int A1)
{

  int position;

  position = (int) (Math.random()*(num_of_Items));

  if(Population[A1][position]==1)
        Population[A1][position] = 0;
    else Population[A1][position] = 1;



}

public void cross(int A1)
{
  int i;
  int A2;
  int position;

  A2 = (int)(Math.random()*(num_of_population));

  position = (int) (Math.random()*(num_of_Items));


  for (i=0;i<position;i++) Population[A1][i]=Population[A2][i];
  for (i=position;i<num_of_Items;i++) Population[A2][i] = Population[A1][i];
}


public void generate()
{
  int i,j,position;

  for(i=0;i<num_of_population;i++)
  {
    for(j=0;j<num_of_Items;j++) Population[i][j] = 0;
  }


  for(i=0;i<num_of_population;i++)
  {
   /* for(j=0;j<num_of_Items;j++) {
      if (rnd.nextBoolean()) Population[i][j] = 1;
      else Population[i][j] = 0;
    }*/
  position = (int) (Math.random()*(num_of_Items));
  Population[i][position] = 1;

  }

}


public void reproduction(double Wealth[])
{
  double sum=0;
  int i, pos;
  int [][] NewPopulation;
  double prob;
  double min, present;
  int j;

  for (i=0;i<num_of_population;i++)
  {
    sum = sum + Wealth[i];
  }

  NewPopulation = new int[num_of_population][];

  for (i=0;i<num_of_population;i++) NewPopulation[i] = new int[num_of_Items];




  for(i=0;i<num_of_population;i++)
  {
   prob = rnd.nextDouble();
   present = 0;
   pos = 0;
    for (j=0;j<num_of_population;j++)
    {

      if(i==0)
      {
        if (prob>0&&prob<=(Wealth[i]/sum)) {pos = j; break;}


      }
      else
      {
        if(prob>present&&prob<=(present+Wealth[i]/sum)) {pos = j; break;}

      }
      present = present+ Wealth[i]/sum;
    }
    for (j=0;j<num_of_Items;j++)  NewPopulation[i][j] = Population[pos][j];
   }

 for (i=0;i<num_of_population;i++)
 {
  for (j=0;j<num_of_Items;j++) Population[i][j]=NewPopulation[i][j];
 }



}




};
