Hola amigos foreros. Estoy aquí nuevamente con un gran problema para mí pero que sin duda para ustedes será pan comido.
El problema lo trataré de presentar de la forma más simple, tengo una instancia creada con el siguiente código:
Código:
TInstancia = class(TObject) //Definición de una instancia
private
function NormaCuadrado(A:VectorIR; B:VectorIR):Double; //Función interna y privada
procedure Mutar();
procedure ActualizarCGyVDistancia_en_Mutar(ClsVieja:Integer; ClsNueva:Integer; PosiIndividuo:Integer);
protected
public
VClasificacion:VectorInt; //Vector de clasificación (1,1,2,3,2,...) Significa Ind1 en Clase 1, Ind2 en clase 2...
VDistancias:VectorIR; //Vector que contiene las distancias de cada indi al CG de la Clase a la que pertenece.
MatrizCG:MatrizReal; //Los CG de las instancia por filas: Fila 1 CG de clase 1, Fila 2 CG clase 2...
Inercia:Double; //Inecia de la intacia: Suma de los valores del vector VDistanacias.
VectorCardi:VectorInt; //Cardinalidades de las clases, en la pasición i se encuentra la cardinalidad del la cls i+1.
function PosiClaseMasPopulosa(): Integer;
function Clon():TInstancia;
published
end;
Para evitar las referencias por medio de punteros, dicha Instancia tiene una función de clonación dada por:
Código:
function TInstancia.Clon():TInstancia ;
begin
Result:=TInstancia.Create;
Result.VClasificacion:=Copy(Self.VClasificacion);
Result.VDistancias:=Copy(Self.VDistancias);
Result.MatrizCG:=Copy(Self.MatrizCG);
Result.Inercia:=Self.Inercia;
Result.VectorCardi:=Copy(Self.VectorCardi);
end;
Bueno, el problema es el siguiente. Suponga que se tiene un vector lleno de objetos de clase TInstancia, supongalo de tamaño N. Luego de pasar por un procedimiento, se debe aumenta el tamaño del vector aumenta en una cantidad mayor que N, y se desea luego hacer una selección de los mejores N objetos. (No importa que significa mejores), suponga que se seleccionan los primeros N de esa nueva lista.
Eso lo hice con el siguiente procedimiento:
Código:
SetLength(VInstanciasAux,N);
for i:=0 to N-1 do begin
VInstanciasAux[i]:=TInstancia.Create;
VInstanciasAux[i]:=Self.VInstancias[i].Clon;
end;
Self.VInstancias:=nil;
SetLength(Self.VInstancias,NInstActual);
Self.VInstancias:=VInstanciasAux;
VInstanciasAux:=nil;
El problema es el siguiente, cuando N es grande y los vectores de cada una de las Instancias son grandes, 500 entradas aproximadamente cada uno. Luego de un tiempo me tira el siguiente error:
Finalmente, he notado que el ram de mi computadora se agota durante la corrida. Estoy trabajando con una Toshiba Qosmio con un i7 y con 8 GB de ram. No he podido liberar la memoria que ya he utilizado.
Si necesitan más información, por favor indique me lo que necesitan saber.