package optimizacion;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */
public class Hugo extends geneticos_binarios{
    public static void main(String[] args) {
       double r[][] = {{0, 1}, {0.5, 1.5}};
       Hugo aplica = new Hugo(10000, 2, 1000, 3, r);
       //aplica.Itera();
       int x[][] = {{1,1,1},{1,1,0}};

       System.out.println(aplica.decodificar(x[0],0)+ " " +
                          aplica.decodificar(x[1],1)+ " " +
                          aplica.decodificar(x[1],1)*60+ " " +
                          +aplica.funcion(x));
   }

   /**
    * Constructor local
    * @param poblacion int Tamano de la poblacion
    * @param parametros int Numero de parametros de la funcion
    * @param iter int numero de generaciones
    * @param genes int numeros de genes por parametro
    * @param Ran double[][] Rangos de busqueda
    */

   public Hugo(int poblacion, int parametros, int iter, int genes, double Ran[][])
   {
       super(poblacion, parametros, iter, genes, Ran);
   }

   /**
    * Funci�n a minimiza
    * @param x double[]
    * @return double
    */

   public double funcion(int vector[][]) {
       double f, x, y,x1,x2,Xc_neg,w;
      x = decodificar(vector[0], 0);
       y = decodificar(vector[1], 1);
       //valores de las cargas y el voltaje para la funcion que calcula perdidas
       double Za,Zb,Xc;//
double PT,P1,P2,FP,FPload,A;
double Vs[] = new double[2];
double Zlinea[] = new double[2];
double Zload[] = new double[2];
double Zlinea1[] = new double[2];
double Zlinea2[] = new double[2];
double Aserie[] = new double[2];
double Xcpolar[] = new double[2];
double Aseriepolar[] = new double[2];
double Apolar[] = new double[2];
double B[] = new double[2];
double Bpolar[] = new double[2];
double Aparalelo_polar[] = new double[2];
double Aparalelo_rect[] = new double[2];
double ZT[] = new double[2];
double ZT_polar[] = new double[2];
double IT[] = new double[2];
double Cpolar[] = new double[2];
double Drect[] = new double[2];
double Erect[] = new double[2];
double DErect[] = new double[2];
double DEpolar[] = new double[2];
double Fpolar[] = new double[2];
double I2[] = new double[2];
double Zload_polar[] = new double[2];
double Vload_polar[] = new double[2];

Vs[0]=120;
Vs[1]=0;
    //System.out.println("vs: ["+Vs[0]+","+Vs[1]+" rad]");
x1=x;
x2=1-x1;    // Otorga el valor de la distancia a la que se coloca el capacitor
Zlinea[0]=10;
Zlinea[1]=20;
//System.out.println("Impedancia de linea: ["+Zlinea[0]+","+Zlinea[1]+"j]");
Zload[0]=30;
Zload[1]=40;
//System.out.println("Impedancia de Carga: ["+Zload[0]+","+Zload[1]+"j]");
//Xc=-86.74698795; //cambiar valores para los dods casos de estudio
//Xc=-60;

Xc=-60.09252125773315;        //Reactancia necesaria desde la carga
//System.out.println("Impedancia del capacitor: ["+0+","+Xc+" j]");
Xc=Xc*y;   //Otroga el valor del tama�o elegido por algoritmos geneticos
Xcpolar[0]=Xc*-1;
Xcpolar[1]=-(Math.PI/2);
//System.out.println("Xcpolar: ["+Xcpolar[0]+","+Xcpolar[1]+"  rad]");

Zlinea1[0]=Zlinea[0]*x1;
Zlinea1[1]=Zlinea[1]*x1;
//System.out.println("Impedancia de linea 1: ["+Zlinea1[0]+","+Zlinea1[1]+"j]");
Zlinea2[0]=Zlinea[0]*x2;
Zlinea2[1]=Zlinea[1]*x2;
//System.out.println("Impedancia de linea 2: ["+Zlinea2[0]+","+Zlinea2[1]+"j]");
Aserie[0]=Zlinea2[0]+Zload[0];
Aserie[1]=Zlinea2[1]+Zload[1];
//System.out.println("Aserie: ["+Aserie[0]+","+Aserie[1]+"j]");
Aseriepolar[0]=Math.sqrt(Math.pow(Aserie[0],2)+Math.pow(Aserie[1],2));
Aseriepolar[1]=Math.atan(Aserie[1]/Aserie[0]);
//System.out.println("Aseriepolar: ["+Aseriepolar[0]+","+Aseriepolar[1]+" rad]");
Apolar[0]=Aseriepolar[0]*Xcpolar[0];
Apolar[1]=Aseriepolar[1]+Xcpolar[1];
//System.out.println("Apolar: ["+Apolar[0]+","+Apolar[1]+" rad]");
B[0]=Aserie[0];
B[1]=Aserie[1]+Xc;
//System.out.println("B: ["+B[0]+","+B[1]+"j]");
Bpolar[0]=Math.sqrt(Math.pow(B[0],2)+Math.pow(B[1],2));
Bpolar[1]=Math.atan(B[1]/B[0]);
//System.out.println("Bpolar: ["+Bpolar[0]+","+Bpolar[1]+" rad]");
Aparalelo_polar[0]=Apolar[0]/Bpolar[0];
Aparalelo_polar[1]=Apolar[1]-Bpolar[1];
//System.out.println("Aparalelo_polar: ["+Aparalelo_polar[0]+","+Aparalelo_polar[1]+" rad]");
Aparalelo_rect[0]=Aparalelo_polar[0]*Math.cos(Aparalelo_polar[1]);
Aparalelo_rect[1]=Aparalelo_polar[0]*Math.sin(Aparalelo_polar[1]);
//System.out.println("Aparalelo_rect: ["+Aparalelo_rect[0]+","+Aparalelo_rect[1]+" j]");
ZT[0]=Aparalelo_rect[0]+Zlinea1[0];
ZT[1]=Aparalelo_rect[1]+Zlinea1[1];
//System.out.println("ZT: ["+ZT[0]+","+ZT[1]+" j]");
ZT_polar[0]=Math.sqrt(Math.pow(ZT[0],2)+Math.pow(ZT[1],2));
ZT_polar[1]=Math.atan(ZT[1]/ZT[0]);
//System.out.println("ZT_polar: ["+ZT_polar[0]+","+ZT_polar[1]+" rad]");
IT[0]=Vs[0]/ZT_polar[0];
IT[1]=Vs[1]-ZT_polar[1];
//System.out.println("IT: ["+IT[0]+","+IT[1]+" rad]");

Cpolar[0]=1/Aseriepolar[0];
Cpolar[1]=0-Aseriepolar[1];
//System.out.println("Cpolar: ["+Cpolar[0]+","+Cpolar[1]+" rad]");
Drect[0]=Cpolar[0]*Math.cos(Cpolar[1]);
Drect[1]=Cpolar[0]*Math.sin(Cpolar[1]);
//System.out.println("Drect: ["+Drect[0]+","+Drect[1]+" j]");
Erect[0]=0;
Erect[1]=1/(-1*Xc);
//System.out.println("Erect: ["+Erect[0]+","+Erect[1]+" j]");
DErect[0]=Drect[0]+Erect[0];
DErect[1]=Drect[1]+Erect[1];
//System.out.println("Derect: ["+DErect[0]+","+DErect[1]+" rad]");
DEpolar[0]=Math.sqrt(Math.pow(DErect[0],2)+Math.pow(DErect[1],2));
DEpolar[1]=Math.atan(DErect[1]/DErect[0]);
//System.out.println("DEpolar: ["+DEpolar[0]+","+DEpolar[1]+" rad]");
Fpolar[0]=Cpolar[0]/DEpolar[0];
Fpolar[1]=Cpolar[1]-DEpolar[1];
//System.out.println("Fpolar: ["+Fpolar[0]+","+Fpolar[1]+" rad]");
I2[0]=Fpolar[0]*IT[0];
I2[1]=Fpolar[1]+IT[1];
//System.out.println("I2: ["+I2[0]+","+I2[1]+" rad]");

FP=Math.cos(Vs[1]-IT[1]);
//System.out.println("FP: ["+FP+"]");

P1=0.5*Math.pow(IT[0],2)*Zlinea1[0];
//System.out.println("P1: ["+P1+"]");
P2=0.5*Math.pow(I2[0],2)*Zlinea2[0];
//System.out.println("P2: ["+P2+"]");
PT=P1+P2;
//System.out.println("PT: ["+PT+"]");

    Zload_polar[0]=Math.sqrt(Math.pow(Zload[0],2)+Math.pow(Zload[1],2));
      Zload_polar[1]=Math.atan(Zload[1]/Zload[0]);
      Vload_polar[0]=I2[0]*Zload_polar[0];
      Vload_polar[1]=I2[1]+Zload_polar[1];
      FPload=Math.cos(Vload_polar[1]-I2[1]);
      A=1-FPload;

      // f = x*Math.sin(4.0*x) + 1.1*y*Math.sin(2.0*y);
f=PT;

/////////////////////////////////////////////////////////////
      //Suponiendo una compensaci�n serie

      ZT[0]=Zlinea1[0]+Zlinea2[0]+Zload[0];
      ZT[1]=Zlinea1[0]+Xc+Zlinea2[0]+Zload[0];
      ZT_polar[0]=Math.sqrt(Math.pow(ZT[0],2)+Math.pow(ZT[1],2));
      ZT_polar[1]=Math.atan(ZT[1]/ZT[0]);
      IT[0]=Vs[0]/ZT_polar[0];
      IT[1]=Vs[1]-ZT_polar[0];
      //P1=0.5*Math.pow(IT[0],2)*Zlinea1[0];
      //System.out.println("P1: ["+P1+"]");
     // P2=0.5*Math.pow(I2[0],2)*Zlinea2[0];
      //System.out.println("P2: ["+P2+"]");
//PT=P1+P2;
//f=PT+A;
      return (f);
   }
}
