Optimisation(minimisation) par les réseaux de neurones
yokohama2
Messages postés1Date d'inscriptionlundi 23 janvier 2006StatutMembreDernière intervention23 janvier 2006
-
23 janv. 2006 à 17:15
lavidato
Messages postés1Date d'inscriptionlundi 3 janvier 2011StatutMembreDernière intervention 3 janvier 2011
-
3 janv. 2011 à 20:26
salut je travaille dans le domaine d'optimisation de la fonction de coût d'énergie électrique sous des contraintes en utilisant les reseau de neurones, c'est une fonction quadretique.
j'aimerai bien avoir une aide dans soit un algorithme ou un programme qui utilise les reseaux de neurones pour minimiser une fonction de coût.
merci.
Public
Numero : integer; //pour info
NumeroCouche : integer; // pour info seulement pas d'insertion
Procedure Calcule;
Constructor Create(aNumeroCouche,aNumero, aNbSynapse : Integer; aModeCalcule : TModeCalcule; aStochastique : Boolean);
Type TCoucheNeurone = class(TObject)
Public
Numero : integer;
Neurones : Array of TNeurone;
SortieNeurones : TDoubleArray;
Procedure Calcule;
Procedure AssignesEntrees(aEntrees : Array of Double);
Constructor Create(aNumero, aNb_Neurones, aNbEntreesParNeurone : integer; aModeCalcule : TModeCalcule);
end;
Type TOnCalculeSortieEvent = Procedure(Sender : TObject; aSortie : Double) of Object;
Type TRNA = class(TObject)
Private
FSortie: Double;
FSortieChange : TOnCalculeSortieEvent;
Procedure SetSortie(aSortie : Double);
Public
Numero : integer;
dMSE, dMAE : Double; //Erreur Quadratique moyenne et Absolue Moyenne
CoucheNeurones : Array of TCoucheNeurone;
Temps : String; //ms
Procedure Calcule;
Procedure Apprends(aEntrees, aSortiesVoulues : Array of Double);
Procedure SaveCoefs(aFileName : String);
Procedure LoadCoefs(aFileName : String);
Constructor Create(aNumero, aNbCouches, aNbEntrees : integer; aNbNeuronesParCouche : Array of integer; aModesCalcules : Array of TModeCalcule);
Published
Property Sortie : Double read FSortie write SetSortie;
Property OnSortieCalculed : TOnCalculeSortieEvent read FSortieChange write FSortieChange;
end;
implementation
{ TNeurone }
procedure TNeurone.Calcule;
begin
case FModeCalcule of
FctSigmoide: CalculeSortieSigmoideSommePonderee;
FctLineaire: CalculeSortieLineaireSommePonderee;
end;
SetNbCalcules(FNbCalcules+1);
end;
procedure TNeurone.CalculeSortieLineaireSommePonderee;
var
i : integer;
sortie : Double;
begin
for i := 0 to Length(FEntrees) - 1 do
Sortie := Sortie + FEntrees[i].Entree*Coefs[i].Poids;
SetSortie(Sortie);
end;
procedure TNeurone.CalculeSortieSigmoideSommePonderee;
var
i : integer;
sortie : Double;
begin
sortie:=0;
for i := 0 to Length(FEntrees) - 1 do
Sortie := Sortie + FEntrees[i].Entree*Coefs[i].Poids;
Sortie := 1/(1+exp(-KA*Sortie ));
SetSortie(Sortie);
end;
constructor TNeurone.Create(aNumeroCouche, aNumero, aNbSynapse : Integer; aModeCalcule: TModeCalcule; aStochastique: Boolean);
var i : integer;
begin
Randomize;
Numero:=aNumero;
NumeroCouche:=aNumeroCouche;
FModeCalcule := aModeCalcule;
FStochastique := aStochastique;
FNbCalcules := 0;
FNbRetroCalcules := 0;
SetLength(FCoefs,aNbSynapse);
SetLength(FEntrees,aNbSynapse);
//init de coefs au hazard
for i := 0 to aNbSynapse - 1 do
begin
Coefs[i] := Tpoids.Create(i,Numero,NumeroCouche);
Entrees[i] := TEntree.Create(i,Numero,NumeroCouche);
end;
end;
procedure TNeurone.SetErreur(aErreur: Double);
begin
if FErreur <> aErreur then
FErreur := aErreur;
If assigned(FOnErreurChange) then
FOnErreurChange(self,FErreur) ;
end;
procedure TNeurone.SetNbCalcules(aNbCalcules: integer);
begin
if FNbCalcules <> aNbCalcules then
begin
FNbCalcules:=aNbCalcules;
if assigned(FOnNbCalculesChange) then
FOnNbCalculesChange(self,FNbCalcules);
end;
end;
procedure TNeurone.SetNbRetroCalcules(aNbRetroCalcules: integer);
begin
if FNbRetroCalcules <> aNbRetroCalcules then
begin
FNbRetroCalcules:=aNbRetroCalcules;
if assigned(FOnNbRetroCalculesChange) then
FOnNbRetroCalculesChange(self,FNbRetroCalcules);
end;
end;
procedure TNeurone.SetSortie(aSortie: Double);
begin
if FSortie <> aSortie then
begin
FSortie := aSortie;
end;
If assigned(FOnSortieChange) then
FOnSortieChange(self,FSortie,FModeCalcule);
end;
{ TCoucheNeurone }
procedure TCoucheNeurone.AssignesEntrees(aEntrees: Array of Double);
var i,k : integer;
begin
for i := 0 to Length(Neurones) - 1 do
for k := 0 to Length(aEntrees) - 1 do
Neurones[i].Entrees[k].Entree:=aEntrees[k];
end;
procedure TCoucheNeurone.Calcule;
var i : integer;
begin
for i := 0 to Length(Neurones) - 1 do
begin
Neurones[i].Calcule;
SortieNeurones[i]:=Neurones[i].Sortie;
end;
end;
constructor TCoucheNeurone.Create(aNumero, aNb_Neurones, aNbEntreesParNeurone: integer; aModeCalcule: TModeCalcule);
var i : integer;
begin
Numero:=aNumero;
SetLength(Neurones,aNb_Neurones);
for i := 0 to Length(Neurones) - 1 do
Neurones[i] := TNeurone.Create(Numero,i,aNbEntreesParNeurone, aModeCalcule, false);
SetLength(SortieNeurones, Length(Neurones));
end;
{ TRNA }
procedure TRNA.Apprends(aEntrees, aSortiesVoulues: Array of Double);
var
i,j,k : integer;
Delta : Double;
TableauSortie : TDoubleArray;
begin
SetLength(TableauSortie, Length(aSortiesVoulues));
for I := 0 to Length(aSortiesVoulues) - 1 do
TableauSortie[i]:=aSortiesVoulues[i];
// on assigne les entrees du reseau
CoucheNeurones[0].AssignesEntrees(aEntrees);
// on Calcule la sortie du reseau
Calcule;
//Calcule erreurs de la derniere couche
dMSE := 0; dMAE := 0;
for i := 0 to Length(CoucheNeurones[Length(CoucheNeurones)-1].Neurones) - 1 do
begin
CoucheNeurones[Length(CoucheNeurones)-1].Neurones[i].Erreur:=µ * CoucheNeurones[Length(CoucheNeurones)-1].Neurones[i].Sortie * (1-CoucheNeurones[Length(CoucheNeurones)-1].Neurones[i].Sortie)*(TableauSortie[i]-CoucheNeurones[Length(CoucheNeurones)-1].Neurones[i].Sortie);
dMSE := dMSE + sqr(TableauSortie[i]-CoucheNeurones[Length(CoucheNeurones)-1].Neurones[i].Sortie);
dMAE := dMAE + abs(dMAE);
end;
dMSE := dMSE / Length(CoucheNeurones[Length(CoucheNeurones)-1].Neurones);
dMAE := dMAE / Length(CoucheNeurones[Length(CoucheNeurones)-1].Neurones);
//---------------
// Retropropagation de l'erreur de chaques sorties
// pour chaque couche en partant de l'avant derniere
for i := Length(CoucheNeurones)-2 downto 0 do
begin
//pour chaque neurone
for j := Length(CoucheNeurones[i].Neurones)-1 downto 0 do
begin
Delta := 0;
//Pour chaque coef
for k := Length(CoucheNeurones[i+1].Neurones)-1 downto 0 do
Delta := Delta + CoucheNeurones[i+1].Neurones[k].Coefs[j].Poids * CoucheNeurones[i+1].Neurones[k].Erreur;
// --- la boucle commence à l'avant derniere couche
for i:=Length(CoucheNeurones)-1 downto 1 do
for j:=Length(CoucheNeurones[i].Neurones)-1 downto 0 do
for k:=Length(CoucheNeurones[i-1].Neurones)-1 downto 0 do
begin
CoucheNeurones[i].Neurones[j].Coefs[k].Poids := CoucheNeurones[i].Neurones[j].Coefs[k].Poids + dEta * CoucheNeurones[i-1].Neurones[k].sortie * CoucheNeurones[i].Neurones[j].Erreur + dAlpha * CoucheNeurones[i].Neurones[j].Coefs[k].Value2;
CoucheNeurones[i].Neurones[j].Coefs[k].Value2 := dEta * CoucheNeurones[i-1].Neurones[k].sortie * CoucheNeurones[i].Neurones[j].Erreur;
end;
//---------------------
end;
procedure TRNA.Calcule;
var
i : integer;
freq,deb,fin : int64;
begin
QueryPerformanceFrequency(freq);
QueryPerformanceCounter(deb);
for i := 0 to Length(CoucheNeurones) - 1 do
begin
CoucheNeurones[i].Calcule;
if i<>Length(CoucheNeurones) - 1 then
CoucheNeurones[i+1].AssignesEntrees(CoucheNeurones[i].SortieNeurones);
end;
Sortie:=CoucheNeurones[Length(CoucheNeurones)-1].Neurones[Length(CoucheNeurones[Length(CoucheNeurones)-1].Neurones)-1].Sortie;
QueryPerformanceCounter(fin);
Temps := FormatFloat('0.000000 ms', (fin-deb)/freq*1000);
end;
constructor TRNA.Create(aNumero, aNbCouches, aNbEntrees: integer; aNbNeuronesParCouche: array of integer; aModesCalcules : Array of TModeCalcule);
var
i : integer;
begin
Numero:=aNumero;
SetLength(CoucheNeurones,aNbCouches);
for i := 0 to aNbCouches - 1 do
if i = 0 then
CoucheNeurones[i]:=TCoucheNeurone.Create(i,aNbNeuronesParCouche[i], aNbEntrees, aModesCalcules[i])
else
CoucheNeurones[i]:=TCoucheNeurone.Create(i,aNbNeuronesParCouche[i], aNbNeuronesParCouche[i-1], aModesCalcules[i]);
end;
procedure TRNA.LoadCoefs(aFileName: String);
var
i,j,k : integer;
T : TextFile;
Val : Double;
begin
AssignFile(T,AFileName);
Reset(T);
for i := 0 to Length(CoucheNeurones) - 1 do
for j := 0 to Length(CoucheNeurones[i].Neurones) - 1 do
for k := 0 to Length(CoucheNeurones[i].Neurones[j].Coefs) - 1 do
begin
Read(T,Val);
CoucheNeurones[i].Neurones[j].Coefs[k].Poids:=Val;
end;
CloseFile(T);
end;
procedure TRNA.SaveCoefs(aFileName: String);
var
i,j,k : integer;
T : TextFile;
begin
AssignFile(T,AFileName);
ReWrite(T);
for i := 0 to Length(CoucheNeurones) - 1 do
for j := 0 to Length(CoucheNeurones[i].Neurones) - 1 do
for k := 0 to Length(CoucheNeurones[i].Neurones[j].Coefs) - 1 do
writeln(T,CoucheNeurones[i].Neurones[j].Coefs[k].Poids);
CloseFile(T);
end;
procedure TRNA.SetSortie(aSortie: Double);
begin
if FSortie <> aSortie then
begin
FSortie:= ASortie;
if assigned(FSortieChange) then
FSortieChange(Self,FSortie);
end;
end;
procedure TPoids.SetPoids(aPoids: Double);
begin
if Self.FPoids <> aPoids then
begin
Self.FPoids := aPoids;
if Assigned(FPoidsChange) then
FPoidsChange(Self,FPoids);
end;
end;
procedure TPoids.SetValue2(aValue2: Double);
begin
if Self.FValue2 <> aValue2 then
begin
Self.FValue2 := aValue2;
//if Assigned(FValue2Change) then
//FValue2Change(Self,FValue2);
end;
end;
{ TEntree }
constructor TEntree.Create(aNumero, aNumeroNeurone, aNumeroCouche: integer);
begin
Numero:=aNumero;
NumeroNeurone:=aNumeroNeurone;
NumeroCouche:=aNumeroCouche;
end;
procedure TEntree.SetEntree(aEntree: Double);
begin
if Self.FEntree <> aEntree then
begin
Self.FEntree := aEntree;
if Assigned(FEntreeChange) then
FEntreeChange(Self,FEntree);
end;
end;
//On assigne les évenements pour des statistiques sur le réseau
for i := 0 to Length(rna.CoucheNeurones) - 1 do
for j := 0 to Length(rna.CoucheNeurones[i].Neurones) - 1 do
for k := 0 to Length(rna.CoucheNeurones[i].Neurones[j].Coefs) - 1 do
begin
rna.CoucheNeurones[i].Neurones[j].Entrees[k].OnEntreeChange:=affiche_e;
rna.CoucheNeurones[i].Neurones[j].Coefs[k].OnPoidsChange:=Affiche_c;
rna.CoucheNeurones[i].Neurones[j].OnSortieChange:=Affiche_s;
rna.CoucheNeurones[i].Neurones[j].OnErreurChange:=Affiche_er;
rna.CoucheNeurones[i].Neurones[j].OnNbCalculesChange:=Affiche_NbCalcs;
rna.CoucheNeurones[i].Neurones[j].OnNbRetroCalculesChange:=Affiche_NbRetroCalcs;
end;
//Attribution des entrées
rna.CoucheNeurones[0].AssignesEntrees(entrees);
// on charge les poids des synapses
rna.LoadCoefs('Coefs.txt');
rna.Calcule;
rna.Apprends([0,1],[1]);
rna.SaveCoefs('Coefs.txt');
Ceci est une transcription du vb à delphi, dites moi ce que vous en pensez.
lavidato
Messages postés1Date d'inscriptionlundi 3 janvier 2011StatutMembreDernière intervention 3 janvier 2011 3 janv. 2011 à 20:26
BONJOUR;
SVP ptitjip , d'ou tu as copie ce programme et par quelle version de delphi peut etre compile, moi j'ai essaye par delphi 7 mais il y a des erreurs!!?? SVP c'est urgent!!