unit uprobred;

{$mode delphi}

interface

uses
Classes, SysUtils,matreal,xMatDefs,uodt_types,ubibfun_onl;
type
 //a continuación 2 ejemplos de la como podria ser TinfoAdn
 TinfoAdn1 = Record
  a,b:TvectR;
  Ma,Mb:TmatR;
 end ;
 TinfoAdn2 = Record
  c:TvectR;
  d:NReal;
  u:integer;
  Mr:TmatR;
 end ;

 TproblemaGenetico =Class(Tobject)
  //identifica univocamente a cada resultado de la evaluación
  idRes :integer;
  //indica que método se usa  genético o gpa
  raza        : Integer;
  //informacion genetica que me determina el adn
  infoAdn1: TinfoAdn1;
  infoAdn2:TinfoAdn2;
  //cant de veces que evalué el plan.
  cnt_evaluaciones  : Integer;
  //es el ERROR
  fCriterio1 : NReal;
  // dimensionado (N)
  nVarsContinuasProb: integer;
  //vector donde defino el estado actual del sistema;
  x :TVectR;
  //indice de tiempo
  KPuntoT:integer;
  (* para obtener el tiempo k  hay que hacer M-KPuntoT siendo M la dimension
   del espacio de tiempo*)
  // vector con las definicion de las variables continua (dimension N)
  XCont_def: TDAOfDefVarContinua;
  protected
   //funciones de restriccion

   {Frest:array of Tfunc;}

   Function Fx1_rest(x:TvectR;kpuntoT:integer): NReal;Virtual;Abstract;
   Function Fx2_rest(x:TvectR;kpuntoT:integer): NReal;virtual;Abstract;
  Public
  //funcion f(x) de Rn en R
  Function Fx(x:TVectR;kpuntoT:Integer):NReal;
  //registro una nueva variable continua con las restricciones de caja
  constructor Create(_nVarsContinuasProb:integer);
  procedure Registrar_Continua(ixc: integer; xmin, xmax: NReal;
   nPuntos: integer; nombre: string; unidades: string);
  procedure   Free;
  procedure   Evaluar;
  procedure   Mutar;
  //concatena en caso del info adn sea mas complejo que un simple array
  //dispongo de 2 funciones o mas en funcion de tipo infoAdn
  function adn(infoAdn1:TinfoAdn1): TDAOfNReal;overload;
  function adn(infoAdn2:TinfoAdn2): TDAOfNReal;overload;

 end ;
 (*defino una primera restricion de tipo 1 puedo definir
  otros tipos de la misma forma*)
 TFx_Rest1 = class(TProblemaGenetico)
  protected
   Function Fx1_rest(x:TvectR;kpuntoT:integer): NReal;override;
   Function Fx2_rest(x:TvectR;kpuntoT:integer): NReal;override;
  end;
 //defino una segunda restricion de tipo 2
 TFx_Rest2 = class(TProblemaGenetico)
  protected
   Function Fx1_rest(x:TvectR;kpuntoT:integer): NReal ; override;
   Function Fx2_rest(x:TvectR;kpuntoT:integer): NReal;override;
  end;

implementation
  constructor TproblemaGenetico.create(_nVarsContinuasProb:integer);
  begin
   inherited create;
   nvarsContinuasProb :=_nvarsContinuasProb;
   x:= TVectR.Create_init(nvarsContinuasProb);
   Setlength(XCont_def,_nVarsContinuasProb);
   kpuntoT:=0;
   Fx1_rest(x,kpuntoT);
   Fx2_rest(x,kPuntoT);
   idres := -1;
  end;

  procedure TproblemaGenetico.Registrar_Continua(ixc:integer; xmin, xmax: NReal;
   nPuntos: integer; nombre: string; unidades: string);
  begin
  end;
  procedure TProblemaGenetico.Free;
  begin
   inherited
    free;
    {setlength(xCont_def,0);
    x.free;}
  end;
  procedure TproblemaGenetico.Evaluar;
  begin
  end;
  procedure TproblemaGenetico.Mutar;
  begin
  end;
  function TProblemaGenetico.adn(infoAdn1:TinfoAdn1): TDAOfNReal;
  begin

  end;
  function TproblemaGenetico.adn(infoAdn2:TinfoAdn2): TDAOfNReal;
  begin

  end;

  Function TproblemaGenetico.Fx(x:TVectR;kpuntoT:integer):NReal;
  begin

  end;


  function TFx_Rest1.Fx1_rest(x:TvectR;kpuntoT:integer): NReal ;
  begin

  end;

  function TFx_Rest1.Fx2_rest(x:TvectR;kpuntoT:integer): NReal ;
  begin

  end;
  function TFx_Rest2.Fx1_rest(x:TvectR;kpuntoT:integer): NReal ;
  begin

  end;
  function TFx_Rest2.Fx2_rest(x:TvectR;kpuntoT:integer): NReal ;
  begin

  end;

end.

