Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OPTIMISATION PAR GOLDEN SECTION SEARCH À UNE DIMENSION


Information sur la source

Catégorie :Maths & Algorithmes Classé sous : optimisation, nonderivatives, goldensearch Niveau : Débutant Date de création : 06/02/2006 Date de mise à jour : 09/05/2006 22:33:57 Vu : 4 091

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

Description

Cette méthode d'optimisation est relativement simple mais obtient de bon résultat sur des problêmes simple (sans minimum locaux). Son avantage principale avantage et qu'elle ne requiert pas la dérivé de la fonction étudiée comme dans la méthode du gradient (si elle est trop compliqué à calculé par exemple).

 

Source

  • #include "iostream.h"
  • #include "math.h"
  • #include "Opti.h"
  • int main()
  • {
  • double bas, haut, mid;
  • double * Tab;
  • Tab = new double[3];
  • *Tab=1;
  • *(Tab+1)=2;
  • *(Tab+2)=-3;
  • //l'optimisation nécessite 3 "first guess" , la fourchette moyenne est ici la moyenne des deux autres...
  • bas=-4;
  • haut=2;
  • mid=(bas+haut)/2;
  • Opti K(bas, haut, mid, Tab);
  • cout << endl
  • << K.Gsearch();
  • cout << endl;
  • delete [] Tab;
  • return 0;
  • }
  • //voici le Opti.h
  • #ifndef OPTI_H
  • #define OPTI_H
  • #include "math.h"
  • #define Tol 0.000000001
  • #define R 0.6180339 //golden section
  • #define C (1-R)
  • #define N 100 //max iter
  • class Opti
  • {
  • public: double a;
  • double b;
  • double c; //valeur initiale d'optimisation
  • double * para; //paramêtre additionnelle de la fonction à optimiser
  • Opti(double A, double B, double M, double * Para)
  • {
  • a=A;
  • b=B;
  • c=M;
  • para=Para;
  • }
  • //fonction à optimiser et à editer (ici f(x)=1/(x^k) + g
  • //on intégre par rapport à x, k et g sont des paramêtres additionnelles
  • double ff(double i){return (*para)*pow(i,2)+ *(para+1) * i + *(para+2);}
  • //fin de la fonction
  • double Gsearch()
  • {
  • double f1, f2, x0, x1, x2, x3;
  • int n;
  • n=0;
  • x0=a;
  • x3=c;
  • if( fabs(c-b)>fabs(b-a) )
  • {
  • x1=b;
  • x2 = b + C * (c - b);
  • }
  • else
  • {
  • x2 = b;
  • x1 = b - C * (b - a);
  • }
  • f1 = ff(x1);
  • f2 = ff(x2);
  • while( fabs(x3-x0) > Tol*(fabs(x1)+fabs(x2)))
  • {
  • if(f2 < f1)
  • {
  • x0 = x1;
  • x1 = x2;
  • x2 = R * x1 + C * x3;
  • f1 = f2;
  • f2 = ff(x2);
  • }
  • else
  • {
  • x3 = x2;
  • x2 = x1;
  • x1 = R * x2 + C * x0;
  • f2 = f1;
  • f1 = ff(x1);
  • }
  • if(n>=N){x3=x0;}
  • n++;
  • }
  • if(f1 < f2){return x1;}
  • else{return x2;}
  • }
  • };
  • #endif
#include "iostream.h"
#include "math.h"
#include "Opti.h"


int main()
{
	double bas, haut, mid;
	double * Tab;
	Tab = new double[3];
	*Tab=1;
	*(Tab+1)=2;
	*(Tab+2)=-3;

	//l'optimisation nécessite 3 "first guess" , la fourchette moyenne est ici la moyenne des deux autres...
	bas=-4;
	haut=2;
	mid=(bas+haut)/2;
	
	Opti K(bas, haut, mid, Tab);

	cout << endl
	<< K.Gsearch();
	cout << endl;

	delete [] Tab;
	
return 0;
}

//voici le Opti.h

#ifndef OPTI_H
#define OPTI_H

#include "math.h"
#define Tol 0.000000001
#define R 0.6180339 //golden section
#define C (1-R)
#define N 100	//max iter

class Opti
{
public: double a;
		double b;
		double c; //valeur initiale d'optimisation
		double * para; //paramêtre additionnelle de la fonction à optimiser

		Opti(double A, double B, double M, double * Para)
		{
			a=A;
			b=B;
			c=M;
			para=Para;
		}

		//fonction à optimiser et à editer (ici f(x)=1/(x^k) + g
		//on intégre par rapport à x, k et g sont des paramêtres additionnelles 		

		double ff(double i){return (*para)*pow(i,2)+ *(para+1) * i + *(para+2);}
		
		//fin de la fonction

		double Gsearch()
		{
			double f1, f2, x0, x1, x2, x3;
			int n;

			n=0;
			x0=a;
			x3=c;

			if( fabs(c-b)>fabs(b-a) )
			{
			x1=b;
			x2 = b + C * (c - b);
			}
			else
			{
			x2 = b;
			x1 = b - C * (b - a);
			}

			f1 = ff(x1);
			f2 = ff(x2);
			while( fabs(x3-x0) > Tol*(fabs(x1)+fabs(x2)))
			{
				if(f2 < f1)
				{
				x0 = x1;
				x1 = x2;
				x2 = R * x1 + C * x3;
				f1 = f2;
				f2 = ff(x2);
				}
				else
				{
				x3 = x2;
				x2 = x1;
				x1 = R * x2 + C * x0;
				f2 = f1;
				f1 = ff(x1);
				}
                        if(n>=N){x3=x0;}
			n++;
			}

		if(f1 < f2){return x1;}
		else{return x2;}
		}
};

#endif

Historique

09 février 2006 22:10:05 :
J'ai trouvé les erreurs qui empêchaient la compilation...
09 mai 2006 22:33:57 :
La condition d'arrêt sur le nombre maximum d'itération a été déboggué.

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Optimisation... :) [ par CodeNeo ] Hello tout le monde !!Question ! Est ce que quelqu'un saurait comment raccourcir le code suivant ?bool __fastcall TForm1::InitBouton ( void ) { Spe [C++] Optimisation de pile [ par guiguikun ] optimisation [ par ifren ] Comment est ce que je peux optimiser le temps d'execution de mon application, quel sont les differents type de pistesmerci soyant heureux faisant fort optimisation affichage opengl [ par xian240482 ] J'ai reussis a affiché un fichier .ASE , mais c'est lent! En cherchant un peu partout, j'ai trouvé plusieur voie :Les gll optimisation de code [ par yakalelo ] Salut J' aimerais optimiser un programme en langage C pour le faire tourner plus vite. Il est constitue principalement de conditions if-else. est ce optimisation d un code asm [ par sajid_morad ] salut tout le monde j aimerai bien savoir comment optimiser un code en assembleur ( le temps d execution des instruction le plus optimal ), et esqu il systeme non lineaire+optimisation d'une fonction non lineaire [ par correcte ] Bonjour,Je cherche un programme ecrit en c++ qui permet de resoudre un systeme d'equations non lineaire.Je cherche egalement un programme qui fait le optimisation [ par arf63 ] Salut j aimerai savoir s il y a moyen d optimiser ca avec un switch case je le maitrise moyenement si quelqu un pourait m aider if (iMat[iPosy][iPosx] pb d'optimisation [ par pipow1 ] Bonjour &#224; tous Je recherche la m&#233;thode la plus rapide pour copier un tableau 3D dans un tableau 1D, en &#233;vitant bien sur de passer par u optimisation de la memoire en c++ [ par ebooserge ] salut a tous,voila j'ai une question un peu bete mais je me lance quand meme.lorsqu'on declare une variable a l'interieur d'une fonction qui appartien


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.