/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P T I M I S A T I O N   E N   C O O R D O N N E E S   C A R T E S I E N N E S                                            */
/*        D E S   D I S T A N C E S   E N T R E   D E S   P O I N T S                                                                */
/*        P A R   U N I F O R M I S A T I O N   D E   L A   D I S T A N C E   M I N I M A L E  :                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/optimise.23$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20150617150031).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L E U R S   I M P L I C I T E S   D E S   P A R A M E T R E S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER                                                                                     \
                    CENT_MILLE                                                                                                          \
                                        /* Definition du nombre maximal d'elements dans un fichier.                                  */

#define   SORTIR_LES_COORDONNEES_OPTIMISEES                                                                                             \
                    VRAI

#define   NOMBRE_D_ITERATIONS_D_OPTIMISATION                                                                                            \
                    CENT_MILLE                                                                                                          \
                                        /* Nombre d'iterations maximum...                                                            */

#define   UTILISER_UNE_DISTANCE_DE_REFERENCE                                                                                            \
                    VRAI
#define   EVALUER_LA_DISTANCE_DE_REFERENCE                                                                                              \
                    VRAI
#define   DISTANCE_DE_REFERENCE                                                                                                         \
                    FU
                                        /* Definition de la distance dite "de reference" vers laquelle doivent converger les         */
                                        /* extrema de toutes les distances. Si elle est evaluee automatiquement, sa valeur est       */
                                        /* moyenne des extrema de toutes les distances.                                              */
                                        /*                                                                                           */
                                        /* La possibilite de ne pas employer de distance de reference a ete introduite le            */
                                        /* 20150730121008...                                                                         */

#define   X_MINIMUM                                                                                                                     \
                    F_MOINS_L_INFINI
#define   X_MAXIMUM                                                                                                                     \
                    F_INFINI
#define   X_DELTA_INITIAL                                                                                                               \
                    NEGA(GRO5(FRA10(FRA10(FU))))
#define   X_DELTA_FINAL                                                                                                                 \
                    NEUT(GRO5(FRA10(FRA10(FU))))
                                        /* Definition de la coordonnee cartesienne 'X'.                                              */
#define   Y_MINIMUM                                                                                                                     \
                    F_MOINS_L_INFINI
#define   Y_MAXIMUM                                                                                                                     \
                    F_INFINI
#define   Y_DELTA_INITIAL                                                                                                               \
                    NEGA(GRO5(FRA10(FRA10(FU))))
#define   Y_DELTA_FINAL                                                                                                                 \
                    NEUT(GRO5(FRA10(FRA10(FU))))
                                        /* Definition de la coordonnee cartesienne 'Y'.                                              */
#define   Z_MINIMUM                                                                                                                     \
                    F_MOINS_L_INFINI
#define   Z_MAXIMUM                                                                                                                     \
                    F_INFINI
#define   Z_DELTA_INITIAL                                                                                                               \
                    NEGA(GRO5(FRA10(FRA10(FU))))
#define   Z_DELTA_FINAL                                                                                                                 \
                    NEUT(GRO5(FRA10(FRA10(FU))))
                                        /* Definition de la coordonnee cartesienne 'Z'.                                              */

#define   PROBABILITE_DE_PERTURBER_UN_POINT                                                                                             \
                    FRA1(FRA10(FU))                                                                                                     \
                                        /* Probabilite de perturber le point courant...                                              */
#define   PROBABILITE_DE_REFUSER_UNE_BONNE_SOLUTION                                                                                     \
                    FRA2(FRA10(FU))                                                                                                     \
                                        /* Probabilite de refuser une bonne solution...                                              */
#define   PROBABILITE_D_ACCEPTER_UNE_MAUVAISE_SOLUTION                                                                                  \
                    FZERO                                                                                                               \
                                        /* Probabilite d'accepter une mauvaise solution...                                           */

#define   EDITER_LE_MESSAGE_DE_RISQUE_DE_NON_PERTURBATION                                                                               \
                    FAUX                                                                                                                \
                                        /* Afin de pouvoir inhiber le message de risque de non perturbation...                       */

#define   PONDERATION_MINIMALE_DE_L_INTERPOLATION_DE_PERTURBATION_D_UNE_COORDONNEE                                                      \
                    FZERO
#define   PONDERATION_MAXIMALE_DE_L_INTERPOLATION_DE_PERTURBATION_D_UNE_COORDONNEE                                                      \
                    FZERO
                                        /* Afin de calculer aleatoirement la ponderation utilisee dans le 'BARY(...)' de             */
                                        /* 'PERTURBATION_D_UNE_COORDONNEE(...)'.                                                     */

#define   EPSILON_DE_CONVERGENCE                                                                                                        \
                    igEPSILON                                                                                                           \
                                        /* Epsilon permettant d'arreter le processus lorsque le minimum et le maximum des            */ \
                                        /* des distances minimales sont proches l'un de l'autre...                                   */

#define   EDITER_TOUTES_LES_DISTANCES_EXTREMALES                                                                                        \
                    FAUX                                                                                                                \
                                        /* Doit-on editer toutes les distances extremales pour voir l'amelioration comment converge  */ \
                                        /* le processus ?                                                                            */
#define   EDITER_LES_DISTANCES_EXTREMALES_INITIALES_ET_FINALES                                                                          \
                    FAUX                                                                                                                \
                                        /* Doit-on editer les distances extremales initiale et finale pour voir l'amelioration ?     */
#define   EDITER_TOUTES_LES_DISTANCES_INITIALES_ET_FINALES                                                                              \
                    FAUX                                                                                                                \
                                        /* Doit-on editer toutes les distances pour valider le processu ? Ceci a ete introduit le    */ \
                                        /* 20150801091712...                                                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   F I C H I E R S  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.41.I"
#include  xrq/nucleon.LB.I"

#define   X_IMPLICITE                                                                                                                   \
                    FZERO
#define   Y_IMPLICITE                                                                                                                   \
                    FZERO
#define   Z_IMPLICITE                                                                                                                   \
                    FZERO

gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Z,liste_initiale_des_Z);
                                        /* Definition en memoire des fichiers de coordonnees cartesiennes.                           */

#define   ELEMENT_DU_FICHIER_LISTE_X(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_X,index)
#define   ELEMENT_DU_FICHIER_LISTE_Y(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Y,index)
#define   ELEMENT_DU_FICHIER_LISTE_Z(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Z,index)
                                        /* Acces a un element courant des fichiers de coordonnees cartesiennes.                      */

gGENERATION_D_UN_FICHIER_liste(sauvegarde_liste_initiale_des_X);
gGENERATION_D_UN_FICHIER_liste(sauvegarde_liste_initiale_des_Y);
gGENERATION_D_UN_FICHIER_liste(sauvegarde_liste_initiale_des_Z);
                                        /* Definition en memoire des fichiers de sauvegarde des coordonnees cartesiennes.            */

#define   ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_X(index)                                                                                  \
                    gELEMENT_DU_FICHIER(sauvegarde_liste_initiale_des_X,index)
#define   ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_Y(index)                                                                                  \
                    gELEMENT_DU_FICHIER(sauvegarde_liste_initiale_des_Y,index)
#define   ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_Z(index)                                                                                  \
                    gELEMENT_DU_FICHIER(sauvegarde_liste_initiale_des_Z,index)
                                        /* Acces a un element courant des fichiers sauvegarde des coordonnees cartesiennes.          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   F I C H I E R S   D E   C O N N E X I O N  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION                                                                                   \
                    CENT_MILLE                                                                                                          \
                                        /* Definition du nombre d'elements de chacun des treize vecteurs suivants...                 */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : evidemment 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION' est en fait le       */ \
                                        /* nombre maximal de substitutions et non pas un nombre maximal de periodes qui n'a pas      */ \
                                        /* de sens ici...                                                                            */
#include  xrq/particle.M2.I"
#include  xrq/nucleon.L3.I"
#include  xrq/nucleon.Lf.2.I"

dfTRANSFORMAT_31(liste_pA_X,fichier_LISTE_XA,LISTE_XA_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_pA_Y,fichier_LISTE_YA,LISTE_YA_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_pA_Z,fichier_LISTE_ZA,LISTE_ZA_IMPLICITE,FZERO)

#define   ELEMENT_DU_FICHIER_LISTE_XA(index)                                                                                            \
                    sTRANSFORMAT_31(index,liste_pA_X)
#define   ELEMENT_DU_FICHIER_LISTE_YA(index)                                                                                            \
                    sTRANSFORMAT_31(index,liste_pA_Y)
#define   ELEMENT_DU_FICHIER_LISTE_ZA(index)                                                                                            \
                    sTRANSFORMAT_31(index,liste_pA_Z)

dfTRANSFORMAT_31(liste_pB_X,fichier_LISTE_XB,LISTE_XB_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_pB_Y,fichier_LISTE_YB,LISTE_YB_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_pB_Z,fichier_LISTE_ZB,LISTE_ZB_IMPLICITE,FZERO)

#define   ELEMENT_DU_FICHIER_LISTE_XB(index)                                                                                            \
                    sTRANSFORMAT_31(index,liste_pB_X)
#define   ELEMENT_DU_FICHIER_LISTE_YB(index)                                                                                            \
                    sTRANSFORMAT_31(index,liste_pB_Y)
#define   ELEMENT_DU_FICHIER_LISTE_ZB(index)                                                                                            \
                    sTRANSFORMAT_31(index,liste_pB_Z)

dTRANSFORMAT_31(liste_des_points_A);
dTRANSFORMAT_31(liste_des_points_B);
                                        /* Listes permettant de passer des index des points 'A' et 'B' a leurs coordonnees {X,Y,Z}   */
                                        /* contenues dans les listes {LISTE_X,LISTE_Y,LISTE_Z}...                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   RECHERCHE_DES_CONNEXIONS(indice,point)                                                                                        \
                    Bblock                                                                                                              \
                    DoIn(index`indice,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)                                      \
                                        /* Parcours de la liste des points (tous differents) :                                       */ \
                         Bblock                                                                                                         \
                         Test(IFEQ_Rpoints3D(ELEMENT_DU_FICHIER_LISTE_X(index`indice)                                                   \
                                            ,ELEMENT_DU_FICHIER_LISTE_Y(index`indice)                                                   \
                                            ,ELEMENT_DU_FICHIER_LISTE_Z(index`indice)                                                   \
                                            ,sTRANSFORMAT_31(index_c,liste`point`X)                                                     \
                                            ,sTRANSFORMAT_31(index_c,liste`point`Y)                                                     \
                                            ,sTRANSFORMAT_31(index_c,liste`point`Z)                                                     \
                                             )                                                                                          \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              Test(EST_FAUX(index`indice`est_valide))                                                                   \
                                   Bblock                                                                                               \
                                   EGAL(save_index`indice,index`indice);                                                                \
                                   EGAL(index`indice`est_valide,VRAI);                                                                  \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   PRINT_ATTENTION("un point est present plusieurs fois");                                              \
                                   CAL1(Prer1("(son index est %d)\n",index`indice));                                                    \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Etablissement partiel de la liste des connexions...                                       */

#define   NOMBRE_MAXIMAL_DE_TENTATIVES_DE_PERTURBATION                                                                                  \
                    CENT
#define   EDITER_LE_MESSAGE_DE_DEPASSEMENT_DES_TENTATIVES_DE_PERTURBATION                                                               \
                    VRAI
#define   PERTURBATION_D_UNE_COORDONNEE(Coordonnee,delta_initial,delta_final,minimum,maximum)                                           \
                    Bblock                                                                                                              \
                    DEFV(Int,INIT(compteur_de_tentatives_de_perturbation,ZERO));                                                        \
                    DEFV(Logical,INIT(perturber,VRAI));                                                                                 \
                    DEFV(Float,INIT(Coordonnee_perturbee,FLOT__UNDEF));                                                                 \
                                                                                                                                        \
                    Tant(IL_FAUT(perturber))                                                                                            \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(perturbation_aleatoire_de_la_Coordonnee,FLOT__UNDEF));                                         \
                                                                                                                                        \
                         GENERATION_D_UNE_VALEUR(perturbation_aleatoire_de_la_Coordonnee,delta_initial,delta_final);                    \
                                        /* Generation de la perturbation aleatoire de la coordonnee courante...                      */ \
                                                                                                                                        \
                         EGAL(Coordonnee_perturbee                                                                                      \
                             ,ADD2(Coordonnee                                                                                           \
                                  ,perturbation_aleatoire_de_la_Coordonnee                                                              \
                                   )                                                                                                    \
                              );                                                                                                        \
                                        /* Perturbation...                                                                           */ \
                                                                                                                                        \
                         Test(IFET(IFEXff(Coordonnee_perturbee,minimum,maximum)                                                         \
                                  ,IFLT(compteur_de_tentatives_de_perturbation,nombre_maximal_de_tentatives_de_perturbation)            \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                                        /* Les coordonnees hors du segment [minimum,maximum] sont rejetees.                          */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFGE(compteur_de_tentatives_de_perturbation,nombre_maximal_de_tentatives_de_perturbation))           \
                                   Bblock                                                                                               \
                                   Test(IL_FAUT(editer_le_message_de_depassement_des_tentatives_de_perturbation))                       \
                                        Bblock                                                                                          \
                                        PRINT_ATTENTION("trop de tentatives de perturbation d'une coordonnee");                         \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              EGAL(Coordonnee,Coordonnee_perturbee);                                                                    \
                              EGAL(perturber,FAUX);                                                                                     \
                                        /* On s'arrete sur la premiere coordonnee perturbee situee dans l'ecran...                   */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ETan                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Perturbation isotrope d'une coordonnee...                                                 */

#define   NUMERO_DE_LA_PREMIERE_CONNEXION                                                                                               \
                    NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION
#define   nombre_de_connexions                                                                                                          \
                    nombre_de_periodes_de_la_simulation
#define   DISTANCE_NON_DEFINIE                                                                                                          \
                    F_INFINI

#define   ETUDE_DES_DISTANCES_EXTREMALES(minimum_distances,maximum_distances)                                                           \
                    Bblock                                                                                                              \
                    DEFV(Int,INIT(index_c,UNDEF));                                                                                      \
                                                                                                                                        \
                    EGAL(minimum_distances,F_INFINI);                                                                                   \
                    EGAL(maximum_distances,F_MOINS_L_INFINI);                                                                           \
                                                                                                                                        \
                    DoIn(index_c,NUMERO_DE_LA_PREMIERE_CONNEXION,LSTX(NUMERO_DE_LA_PREMIERE_CONNEXION,nombre_de_connexions),I)          \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(distance_courante                                                                              \
                                        ,RdisF3D(ELEMENT_DU_FICHIER_LISTE_X(INTE(sTRANSFORMAT_31(index_c,liste_des_points_A)))          \
                                                ,ELEMENT_DU_FICHIER_LISTE_Y(INTE(sTRANSFORMAT_31(index_c,liste_des_points_A)))          \
                                                ,ELEMENT_DU_FICHIER_LISTE_Z(INTE(sTRANSFORMAT_31(index_c,liste_des_points_A)))          \
                                                ,ELEMENT_DU_FICHIER_LISTE_X(INTE(sTRANSFORMAT_31(index_c,liste_des_points_B)))          \
                                                ,ELEMENT_DU_FICHIER_LISTE_Y(INTE(sTRANSFORMAT_31(index_c,liste_des_points_B)))          \
                                                ,ELEMENT_DU_FICHIER_LISTE_Z(INTE(sTRANSFORMAT_31(index_c,liste_des_points_B)))          \
                                                 )                                                                                      \
                                         )                                                                                              \
                              );                                                                                                        \
                                                                                                                                        \
                         EGAL(minimum_distances,MIN2(minimum_distances,distance_courante));                                             \
                         EGAL(maximum_distances,MAX2(maximum_distances,distance_courante));                                             \
                                        /* Le minimum et le maximum sont calcules.                                                   */ \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Calcul des distances extremales a un instant donne.                                       */

#define   SAUVEGARDE_DE_L_ETAT_COURANT                                                                                                  \
                    Bblock                                                                                                              \
                    DEFV(Int,INIT(index,UNDEF));                                                                                        \
                                                                                                                                        \
                    DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)                                             \
                         Bblock                                                                                                         \
                         EGAL(ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_X(index),ELEMENT_DU_FICHIER_LISTE_X(index));                          \
                         EGAL(ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_Y(index),ELEMENT_DU_FICHIER_LISTE_Y(index));                          \
                         EGAL(ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_Z(index),ELEMENT_DU_FICHIER_LISTE_Z(index));                          \
                                        /* Sauvegarde de l'etat courant des points {X,Y,Z}.                                          */ \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                                                                                                                                        \
                    EGAL(sauvegarde_de_minimum_distances_avant_la_perturbation,minimum_distances_avant_la_perturbation);                \
                    EGAL(sauvegarde_de_maximum_distances_avant_la_perturbation,maximum_distances_avant_la_perturbation);                \
                    Eblock

#define   RESTAURATION_DE_L_ETAT_COURANT                                                                                                \
                    Bblock                                                                                                              \
                    DEFV(Int,INIT(index,UNDEF));                                                                                        \
                                                                                                                                        \
                    DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)                                             \
                         Bblock                                                                                                         \
                         EGAL(ELEMENT_DU_FICHIER_LISTE_X(index),ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_X(index));                          \
                         EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index),ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_Y(index));                          \
                         EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index),ELEMENT_DU_FICHIER_SAUVEGARDE_LISTE_Z(index));                          \
                                        /* Restauration de l'etat anterieur {X,Y,Z}.                                                 */ \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                                                                                                                                        \
                    EGAL(minimum_distances_avant_la_perturbation,sauvegarde_de_minimum_distances_avant_la_perturbation);                \
                    EGAL(maximum_distances_avant_la_perturbation,sauvegarde_de_maximum_distances_avant_la_perturbation);                \
                    Eblock

#define   EDITION_DES_DISTANCES_EXTREMALES(condition)                                                                                   \
                    Bblock                                                                                                              \
                    Test(condition)                                                                                                     \
                         Bblock                                                                                                         \
                         CAL3(Prme1("MinimumDistances=%+.^^^",minimum_distances_avant_la_perturbation));                                \
                         CAL3(Prme1(" MaximumDistances=%+.^^^",maximum_distances_avant_la_perturbation));                               \
                         CAL3(Prme1(" MaximumDistances-MinimumDistances=%+.^^^"                                                         \
                                   ,SOUS(maximum_distances_avant_la_perturbation                                                        \
                                        ,minimum_distances_avant_la_perturbation                                                        \
                                         )                                                                                              \
                                    )                                                                                                   \
                              );                                                                                                        \
                         CALS(Fsauts_de_lignes(UN));                                                                                    \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock
#define   EDITION_DE_TOUTES_LES_DISTANCES_INITIALES_ET_FINALES                                                                          \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_toutes_les_distances_initiales_et_finales))                                                     \
                         Bblock                                                                                                         \
                         DEFV(Int,INIT(index,UNDEF));                                                                                   \
                                                                                                                                        \
                         DoIn(index,NUMERO_DE_LA_PREMIERE_CONNEXION,LSTX(NUMERO_DE_LA_PREMIERE_CONNEXION,nombre_de_connexions),I)       \
                              Bblock                                                                                                    \
                              DEFV(Float,INIT(distance_courante                                                                         \
                                             ,RdisF3D(ELEMENT_DU_FICHIER_LISTE_X(INTE(sTRANSFORMAT_31(index,liste_des_points_A)))       \
                                                     ,ELEMENT_DU_FICHIER_LISTE_Y(INTE(sTRANSFORMAT_31(index,liste_des_points_A)))       \
                                                     ,ELEMENT_DU_FICHIER_LISTE_Z(INTE(sTRANSFORMAT_31(index,liste_des_points_A)))       \
                                                     ,ELEMENT_DU_FICHIER_LISTE_X(INTE(sTRANSFORMAT_31(index,liste_des_points_B)))       \
                                                     ,ELEMENT_DU_FICHIER_LISTE_Y(INTE(sTRANSFORMAT_31(index,liste_des_points_B)))       \
                                                     ,ELEMENT_DU_FICHIER_LISTE_Z(INTE(sTRANSFORMAT_31(index,liste_des_points_B)))       \
                                                      )                                                                                 \
                                              )                                                                                         \
                                   );                                                                                                   \
                              CAL3(Prme1("Iteration=%d",iteration_courante));                                                           \
                              CAL3(Prme1(" Index=%d",index));                                                                           \
                              CAL3(Prme1(" Distance=%+.^^^",distance_courante));                                                        \
                              CALS(Fsauts_de_lignes(UN));                                                                               \
                              Eblock                                                                                                    \
                         EDoI                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P T I M I S A T I O N   E N   C O O R D O N N E E S   C A R T E S I E N N E S                                            */
/*        D E S   D I S T A N C E S   E N T R E   D E S   P O I N T S                                                                */
/*        P A R   U N I F O R M I S A T I O N   D E   L A   D I S T A N C E   M I N I M A L E  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrv/ARITHMET.22.I"
#include  xci/valeurs.03.I"

     DEFV(Logical,INIT(sortir_les_coordonnees_optimisees,SORTIR_LES_COORDONNEES_OPTIMISEES));

     DEFV(Int,INIT(nombre_d_iterations_d_optimisation,NOMBRE_D_ITERATIONS_D_OPTIMISATION));
                                        /* Nombre d'iterations maximum...                                                            */
     DEFV(Int,INIT(nombre_maximal_de_tentatives_de_perturbation,NOMBRE_MAXIMAL_DE_TENTATIVES_DE_PERTURBATION));
     DEFV(Logical,INIT(editer_le_message_de_depassement_des_tentatives_de_perturbation
                      ,EDITER_LE_MESSAGE_DE_DEPASSEMENT_DES_TENTATIVES_DE_PERTURBATION
                       )
          );

     DEFV(Logical,INIT(utiliser_une_distance_de_reference,UTILISER_UNE_DISTANCE_DE_REFERENCE));
     DEFV(Logical,INIT(evaluer_la_distance_de_reference,EVALUER_LA_DISTANCE_DE_REFERENCE));
     DEFV(Float,INIT(distance_de_reference,DISTANCE_DE_REFERENCE));
                                        /* Definition de la distance dite "de reference" vers laquelle doivent converger les         */
                                        /* extrema de toutes les distances. Si elle est evaluee automatiquement, sa valeur est       */
                                        /* moyenne des extrema de toutes les distances.                                              */
                                        /*                                                                                           */
                                        /* La possibilite de ne pas employer de distance de reference a ete introduite le            */
                                        /* 20150730121008...                                                                         */

     DEFV(Float,INIT(X_minimum,X_MINIMUM));
     DEFV(Float,INIT(X_maximum,X_MAXIMUM));
     DEFV(Float,INIT(X_delta_initial,X_DELTA_INITIAL));
     DEFV(Float,INIT(X_delta_final,X_DELTA_FINAL));
                                        /* Definition de la coordonnee cartesienne 'X'.                                              */
     DEFV(Float,INIT(Y_minimum,Y_MINIMUM));
     DEFV(Float,INIT(Y_maximum,Y_MAXIMUM));
     DEFV(Float,INIT(Y_delta_initial,Y_DELTA_INITIAL));
     DEFV(Float,INIT(Y_delta_final,Y_DELTA_FINAL));
                                        /* Definition de la coordonnee cartesienne 'Y'.                                              */
     DEFV(Float,INIT(Z_minimum,Z_MINIMUM));
     DEFV(Float,INIT(Z_maximum,Z_MAXIMUM));
     DEFV(Float,INIT(Z_delta_initial,Z_DELTA_INITIAL));
     DEFV(Float,INIT(Z_delta_final,Z_DELTA_FINAL));
                                        /* Definition de la coordonnee cartesienne 'Z'.                                              */

     DEFV(Float,INIT(probabilite_de_perturber_un_point,PROBABILITE_DE_PERTURBER_UN_POINT));
                                        /* Probabilite de perturber le point courant...                                              */
     DEFV(Float,INIT(probabilite_de_refuser_une_bonne_solution,PROBABILITE_DE_REFUSER_UNE_BONNE_SOLUTION));
                                        /* Probabilite de refuser une bonne solution...                                              */
     DEFV(Float,INIT(probabilite_d_accepter_une_mauvaise_solution,PROBABILITE_D_ACCEPTER_UNE_MAUVAISE_SOLUTION));
                                        /* Probabilite d'accepter une mauvaise solution...                                           */

     DEFV(Logical,INIT(editer_le_message_de_risque_de_non_perturbation,EDITER_LE_MESSAGE_DE_RISQUE_DE_NON_PERTURBATION));
                                        /* Afin de pouvoir inhiber le message de risque de non perturbation...                       */

     DEFV(Float,INIT(ponderation_minimale_de_l_interpolation_de_perturbation_d_une_coordonnee
                    ,PONDERATION_MINIMALE_DE_L_INTERPOLATION_DE_PERTURBATION_D_UNE_COORDONNEE
                     )
          );
     DEFV(Float,INIT(ponderation_maximale_de_l_interpolation_de_perturbation_d_une_coordonnee
                    ,PONDERATION_MAXIMALE_DE_L_INTERPOLATION_DE_PERTURBATION_D_UNE_COORDONNEE
                     )
          );
                                        /* Afin de calculer aleatoirement la ponderation utilisee dans le 'BARY(...)' de             */
                                        /* 'PERTURBATION_D_UNE_COORDONNEE(...)'.                                                     */

     DEFV(Float,INIT(epsilon_de_convergence,EPSILON_DE_CONVERGENCE));
                                        /* Epsilon permettant d'arreter le processus lorsque le minimum et le maximum des            */
                                        /* des distances minimales sont proches l'un de l'autre...                                   */

     DEFV(Logical,INIT(editer_toutes_les_distances_extremales,EDITER_TOUTES_LES_DISTANCES_EXTREMALES));
                                        /* Doit-on editer toutes les distances extremales pour voir l'amelioration comment converge  */
                                        /* le processus ?                                                                            */
     DEFV(Logical,INIT(editer_les_distances_extremales_initiales_et_finales,EDITER_LES_DISTANCES_EXTREMALES_INITIALES_ET_FINALES));
                                        /* Doit-on editer les distances extremales initiale et finale pour voir l'amelioration ?     */
     DEFV(Logical,INIT(editer_toutes_les_distances_initiales_et_finales,EDITER_TOUTES_LES_DISTANCES_INITIALES_ET_FINALES));
                                        /* Doit-on editer toutes les distances pour valider le processu ? Ceci a ete introduit le    */
                                        /* 20150801091712...                                                                         */

     DEFV(Logical,INIT(iterer,VRAI));
     DEFV(Int,INIT(iteration_courante,PREMIERE_ITERATION_D_UN_Komp));
                                        /* Controle des iterations...                                                                */
     DEFV(Float,INIT(minimum_distances_avant_la_perturbation,FLOT__UNDEF));
     DEFV(Float,INIT(maximum_distances_avant_la_perturbation,FLOT__UNDEF));
     DEFV(Float,INIT(sauvegarde_de_minimum_distances_avant_la_perturbation,FLOT__UNDEF));
     DEFV(Float,INIT(sauvegarde_de_maximum_distances_avant_la_perturbation,FLOT__UNDEF));
     DEFV(Float,INIT(minimum_distances_apres_la_perturbation,FLOT__UNDEF));
     DEFV(Float,INIT(maximum_distances_apres_la_perturbation,FLOT__UNDEF));
                                        /* Distances minimales avant et apres une tentative de perturbation...                       */
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"

     iTRANSFORMAT_31(liste_pA_X,LISTE_XA_IMPLICITE);
     iTRANSFORMAT_31(liste_pA_Y,LISTE_YA_IMPLICITE);
     iTRANSFORMAT_31(liste_pA_Z,LISTE_ZA_IMPLICITE);

     iTRANSFORMAT_31(liste_pB_X,LISTE_XB_IMPLICITE);
     iTRANSFORMAT_31(liste_pB_Y,LISTE_YB_IMPLICITE);
     iTRANSFORMAT_31(liste_pB_Z,LISTE_ZB_IMPLICITE);

     iTRANSFORMAT_31(liste_des_points_A,UNDEF);
     iTRANSFORMAT_31(liste_des_points_B,UNDEF);

     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
                                                 Eblock
                                                 )
                                            );

                         PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;

                         GET_ARGUMENT_L("sortir=",sortir_les_coordonnees_optimisees);
                         GET_ARGUMENT_N("pas_sortir=",sortir_les_coordonnees_optimisees);

                         PROKESF_ARGUMENT_FICHIER("LISTE_X="
                                                 ,fichier_LISTE_X
                                                 ,liste_initiale_des_X
                                                 ,X_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Y="
                                                 ,fichier_LISTE_Y
                                                 ,liste_initiale_des_Y
                                                 ,Y_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Z="
                                                 ,fichier_LISTE_Z
                                                 ,liste_initiale_des_Z
                                                 ,Z_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         PROCESS_ARGUMENT_I("nombre_connexions=""nc=",nombre_de_connexions
                                           ,BLOC(VIDE;)
                                           ,BLOC(
                                                 Bblock
                                                 PRINT_AVERTISSEMENT("'ns=' doit etre defini avant tout fichier");
                                                 Eblock
                                                 )
                                            );

                         PROCESS_ARGUMENT_FICHIER("CONNEXION_XA="
                                                 ,fichier_LISTE_XA
                                                 ,liste_pA_X
                                                 ,LISTE_XA_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("CONNEXION_YA="
                                                 ,fichier_LISTE_YA
                                                 ,liste_pA_Y
                                                 ,LISTE_YA_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("CONNEXION_ZA="
                                                 ,fichier_LISTE_ZA
                                                 ,liste_pA_Z
                                                 ,LISTE_ZA_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("CONNEXION_XB="
                                                 ,fichier_LISTE_XB
                                                 ,liste_pB_X
                                                 ,LISTE_XB_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("CONNEXION_YB="
                                                 ,fichier_LISTE_YB
                                                 ,liste_pB_Y
                                                 ,LISTE_YB_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("CONNEXION_ZB="
                                                 ,fichier_LISTE_ZB
                                                 ,liste_pB_Z
                                                 ,LISTE_ZB_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         GET_ARGUMENT_I("graine=""g=",graine_du_generateur_d_evenements);
                         GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation);
                         GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation);

                         GET_ARGUMENT_I("iterations=",nombre_d_iterations_d_optimisation);

                         GET_ARGUMENT_I("tentatives_de_perturbation=""tp=",nombre_maximal_de_tentatives_de_perturbation);
                         GET_ARGUMENT_L("message_trop_de_perturbations=""mtp="
                                       ,editer_le_message_de_depassement_des_tentatives_de_perturbation
                                        );

                         GET_ARGUMENT_L("utiliser_distance_reference=""udr=",utiliser_une_distance_de_reference);
                         GET_ARGUMENT_L("evaluer_distance_reference=""edr=",evaluer_la_distance_de_reference);
                         GET_ARGUMENT_F("distance_reference=""dr=",distance_de_reference);

                         GET_ARGUMENT_F("Xm=",X_minimum);
                         GET_ARGUMENT_F("XM=",X_maximum);
                         GET_ARGUMENT_F("X_delta_initial=""Xdi=",X_delta_initial);
                         GET_ARGUMENT_F("X_delta_final=""Xdf=",X_delta_final);

                         GET_ARGUMENT_F("Ym=",Y_minimum);
                         GET_ARGUMENT_F("YM=",Y_maximum);
                         GET_ARGUMENT_F("Y_delta_initial=""Ydi=",Y_delta_initial);
                         GET_ARGUMENT_F("Y_delta_final=""Ydf=",Y_delta_final);

                         GET_ARGUMENT_F("Zm=",Z_minimum);
                         GET_ARGUMENT_F("ZM=",Z_maximum);
                         GET_ARGUMENT_F("Z_delta_initial=""Zdi=",Z_delta_initial);
                         GET_ARGUMENT_F("Z_delta_final=""Zdf=",Z_delta_final);

                         GET_ARGUMENT_F("probabilite_perturber_point=""ppp=",probabilite_de_perturber_un_point);
                         GET_ARGUMENT_F("probabilite_refuser_bonne_solution=""prbs=",probabilite_de_refuser_une_bonne_solution);
                         GET_ARGUMENT_F("probabilite_accepter_mauvaise_solution=""pams=",probabilite_d_accepter_une_mauvaise_solution);

                         GET_ARGUMENT_L("message_risque_non_perturbation=""mrnp="
                                       ,editer_le_message_de_risque_de_non_perturbation
                                        );

                         GET_ARGUMENT_F("ponderation_minimale_interpolation=""pmi="
                                       ,ponderation_minimale_de_l_interpolation_de_perturbation_d_une_coordonnee
                                        );
                         GET_ARGUMENT_F("ponderation_maximale_interpolation=""pMi="
                                       ,ponderation_maximale_de_l_interpolation_de_perturbation_d_une_coordonnee
                                        );

                         GET_ARGUMENT_F("epsilon_convergence=""epscon=",epsilon_de_convergence);

                         GET_ARGUMENT_L("lister_all=""lia=""editer_all=""eda=",editer_toutes_les_distances_extremales);
                         GET_ARGUMENT_L("lister_initiale_finale=""liif=""editer_initiale_finale=""edif="
                                       ,editer_les_distances_extremales_initiales_et_finales
                                        );
                         GET_ARGUMENT_L("lister_distances=""ld=""editer_distances=""ed="
                                       ,editer_toutes_les_distances_initiales_et_finales
                                        );

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                         )
                    );

     Test(IFGT(nombre_de_connexions,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION))
                                        /* Test manquant introduit le 20150705005819...                                              */
          Bblock
          PRINT_ERREUR("la simulation demandee est trop longue");
          EGAL(nombre_de_connexions,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION);
                                        /* Et on seuille le nombre de periodes...                                                    */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     iGENERATION_D_UN_FICHIER(sauvegarde_liste_initiale_des_X,FLOT__UNDEF);
     iGENERATION_D_UN_FICHIER(sauvegarde_liste_initiale_des_Y,FLOT__UNDEF);
     iGENERATION_D_UN_FICHIER(sauvegarde_liste_initiale_des_Z,FLOT__UNDEF);

     Test(IFLT(probabilite_de_perturber_un_point,INVE(FLOT(nombre_d_elements))))
          Bblock
          Test(IL_FAUT(editer_le_message_de_risque_de_non_perturbation))
               Bblock
               PRINT_ATTENTION("lors de certaines iterations, aucun point ne sera perturbe");
                                        /* En effet, logiquement, il faut que cette probabilite soit superieure ou egale a           */
                                        /* l'inverse du nombre de particules...                                                      */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     begin_nouveau_block
          Bblock
          DEFV(Int,INIT(index_c,UNDEF));

          DoIn(index_c
              ,NUMERO_DE_LA_PREMIERE_CONNEXION
              ,LSTX(NUMERO_DE_LA_PREMIERE_CONNEXION,nombre_de_connexions)
              ,I
               )
                                        /* Parcours des listes de connexion ('A' --> 'B') :                                          */
               Bblock
               DEFV(Int,INIT(index_i,UNDEF));
               DEFV(Int,INIT(save_index_i,UNDEF));
               DEFV(Logical,INIT(index_i_est_valide,FAUX));

               DEFV(Int,INIT(index_j,UNDEF));
               DEFV(Int,INIT(save_index_j,UNDEF));
               DEFV(Logical,INIT(index_j_est_valide,FAUX));

               RECHERCHE_DES_CONNEXIONS(i,pA);
               RECHERCHE_DES_CONNEXIONS(j,pB);
                                        /* Etablissement de la liste des connexions entre les points 'pA' et 'pB'.                   */

               Test(IFET(EST_VRAI(index_i_est_valide),EST_VRAI(index_j_est_valide)))
                    Bblock
                    EGAL(sTRANSFORMAT_31(index_c,liste_des_points_A),FLOT(save_index_i));
                    EGAL(sTRANSFORMAT_31(index_c,liste_des_points_B),FLOT(save_index_j));
                                        /* Memorisation de la connexion {i,j}...                                                     */
                    Eblock
               ATes
                    Bblock
                    PRINT_ATTENTION("une connexion n'a pas ete recuperee");
                    CAL1(Prer7("(il s'agit de la connexion {%+.^^^,%+.^^^,%+.^^^} --> {%+.^^^,%+.^^^,%+.^^^} dont l'index est c=%d)\n"
                              ,sTRANSFORMAT_31(index_c,liste_pA_X)
                              ,sTRANSFORMAT_31(index_c,liste_pA_Y)
                              ,sTRANSFORMAT_31(index_c,liste_pA_Z)
                              ,sTRANSFORMAT_31(index_c,liste_pB_X)
                              ,sTRANSFORMAT_31(index_c,liste_pB_Y)
                              ,sTRANSFORMAT_31(index_c,liste_pB_Z)
                              ,index_c
                               )
                         );
                    Eblock
               ETes
               Eblock
          EDoI
          Eblock
     end_nouveau_block

     ETUDE_DES_DISTANCES_EXTREMALES(minimum_distances_avant_la_perturbation
                                   ,maximum_distances_avant_la_perturbation
                                    );
                                        /* Recherche des extrema des distances avant la perturbation.                                */
     EDITION_DE_TOUTES_LES_DISTANCES_INITIALES_ET_FINALES;

     SAUVEGARDE_DE_L_ETAT_COURANT;

     Test(IFET(IL_FAUT(utiliser_une_distance_de_reference),IL_FAUT(evaluer_la_distance_de_reference)))
          Bblock
          EGAL(distance_de_reference
              ,MOYE(minimum_distances_avant_la_perturbation,maximum_distances_avant_la_perturbation)
               );
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Tant(IL_FAUT(iterer))
          Bblock
          DEFV(Logical,INIT(on_a_trouve_une_bonne_perturbation,FAUX));

          EDITION_DES_DISTANCES_EXTREMALES(IFOU(IL_FAUT(editer_toutes_les_distances_extremales)
                                               ,IFET(IL_FAUT(editer_les_distances_extremales_initiales_et_finales)
                                                    ,IFEQ(iteration_courante,PREMIERE_ITERATION_D_UN_Komp)
                                                     )
                                                )
                                           );

          begin_nouveau_block
               Bblock
               DEFV(Int,INIT(index,UNDEF));
               DEFV(Float,INIT(probabilite_courante,FLOT__UNDEF));

               SAUVEGARDE_DE_L_ETAT_COURANT;

               DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
                    Bblock
                    GENERATION_D_UNE_VALEUR(probabilite_courante,PROBABILITE_NULLE,PROBABILITE_UNITE);

                    Test(IFLT(probabilite_courante,probabilite_de_perturber_un_point))
                         Bblock
                         DEFV(Float,INIT(X_perturbe,ELEMENT_DU_FICHIER_LISTE_X(index)));
                         DEFV(Float,INIT(Y_perturbe,ELEMENT_DU_FICHIER_LISTE_Y(index)));
                         DEFV(Float,INIT(Z_perturbe,ELEMENT_DU_FICHIER_LISTE_Z(index)));

                         PERTURBATION_D_UNE_COORDONNEE(X_perturbe
                                                      ,X_delta_initial
                                                      ,X_delta_final
                                                      ,X_minimum,X_maximum
                                                       );
                         PERTURBATION_D_UNE_COORDONNEE(Y_perturbe
                                                      ,Y_delta_initial
                                                      ,Y_delta_final
                                                      ,Y_minimum,Y_maximum
                                                       );
                         PERTURBATION_D_UNE_COORDONNEE(Z_perturbe
                                                      ,Z_delta_initial
                                                      ,Z_delta_final
                                                      ,Z_minimum,Z_maximum
                                                       );

                         EGAL(ELEMENT_DU_FICHIER_LISTE_X(index),X_perturbe);
                         EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index),Y_perturbe);
                         EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index),Z_perturbe);
                                        /* Perturbation aleatoire des points.                                                        */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               EDoI

               ETUDE_DES_DISTANCES_EXTREMALES(minimum_distances_apres_la_perturbation
                                             ,maximum_distances_apres_la_perturbation
                                              );
                                        /* Recherche de la distance minimale apres la perturbation.                                  */

               Test(IFOU(IFET(IL_FAUT(utiliser_une_distance_de_reference)
                             ,IFET(IFLE(SOUA(minimum_distances_apres_la_perturbation,distance_de_reference)
                                       ,SOUA(minimum_distances_avant_la_perturbation,distance_de_reference)
                                        )
                                  ,IFLE(SOUA(maximum_distances_apres_la_perturbation,distance_de_reference)
                                       ,SOUA(maximum_distances_avant_la_perturbation,distance_de_reference)
                                        )
                                   )
                              )
                        ,IFET(IL_NE_FAUT_PAS(utiliser_une_distance_de_reference)
                             ,IFLT(SOUS(maximum_distances_apres_la_perturbation
                                       ,minimum_distances_apres_la_perturbation
                                        )
                                  ,SOUS(maximum_distances_avant_la_perturbation
                                       ,minimum_distances_avant_la_perturbation
                                        )
                                   )
                              )
                         )
                    )
                    Bblock
                                        /* Cas ou les choses s'ameliorent (ce qui semble exceptionnel des qu'il y a beaucoup         */
                                        /* de points) :                                                                              */
                    GENERATION_D_UNE_VALEUR(probabilite_courante,PROBABILITE_NULLE,PROBABILITE_UNITE);

                    Test(IFGE(probabilite_courante,probabilite_de_refuser_une_bonne_solution))
                         Bblock
                         EGAL(on_a_trouve_une_bonne_perturbation,VRAI);
                                        /* On va pouvoir arreter la boucle courante 'Tant(...)' des tentatives...                    */
                         EGAL(minimum_distances_avant_la_perturbation,minimum_distances_apres_la_perturbation);
                         EGAL(maximum_distances_avant_la_perturbation,maximum_distances_apres_la_perturbation);
                                        /* Il y a une amelioration, on change donc les extrema de type "avant"...                    */
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou une bonne solution est refusee...                                                  */
                         Eblock
                    ETes
                    Eblock
               ATes
                                        /* Cas ou les choses se deteriorent :                                                        */
                    Bblock
                    GENERATION_D_UNE_VALEUR(probabilite_courante,PROBABILITE_NULLE,PROBABILITE_UNITE);

                    Test(IFLT(probabilite_courante,probabilite_d_accepter_une_mauvaise_solution))
                         Bblock
                         EGAL(on_a_trouve_une_bonne_perturbation,VRAI);
                                        /* Cas ou une mauvaise solution est malgre tout acceptee...                                  */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ETes
               Eblock
          end_nouveau_block

          Test(EST_VRAI(on_a_trouve_une_bonne_perturbation))
               Bblock
               Test(IZEQ_a_peu_pres(SOUS(maximum_distances_apres_la_perturbation
                                        ,minimum_distances_apres_la_perturbation
                                         )
                                   ,epsilon_de_convergence
                                    )
                    )
                    Bblock
                    EGAL(iterer,FAUX);
                                        /* On arrete le processus...                                                                 */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               RESTAURATION_DE_L_ETAT_COURANT;
               Eblock
          ETes

          Test(IFLT(iteration_courante,nombre_d_iterations_d_optimisation))
               Bblock
               INCR(iteration_courante,I);
               Eblock
          ATes
               Bblock
               EGAL(iterer,FAUX);
                                        /* On arrete le processus...                                                                 */
               Eblock
          ETes
          Eblock
     ETan

     EDITION_DES_DISTANCES_EXTREMALES(IL_FAUT(editer_les_distances_extremales_initiales_et_finales));
                                        /* ATTENTION : c'est la distance minimale a l'avant-derniere iteration qui est editee car,   */
                                        /* en effet, il n'est pas sur que 'distance_minimale_apres' etait maximale...                */
     EDITION_DE_TOUTES_LES_DISTANCES_INITIALES_ET_FINALES;

     Test(IL_FAUT(sortir_les_coordonnees_optimisees))
          Bblock
          DoIn(index
              ,PREMIER_ELEMENT_D_UN_FICHIER
              ,DERNIER_ELEMENT_D_UN_FICHIER
              ,I
               )
               Bblock
               CAL2(Prin0(" X="));
               EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_X(index));
               CAL2(Prin0(" Y="));
               EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_Y(index));
               CAL2(Prin0(" Z="));
               EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_Z(index));
                                        /* Edition du triplet {X,Y,Z}.                                                               */

               CAL2(Prin0("\n"));
                                        /* ATTENTION : on notera bien l'espace qui est mis en bout de ligne (de meme celui qui       */
                                        /* a ete mis en debut de ligne precedemment, devant le "X=" par exemple) ; ceci est destine  */
                                        /* a faciliter la recuperation et la manipulation du fichier ainsi produit (par exemple,     */
                                        /* 'v $xiirs/.PSPH.21.1.$U Xx')...                                                           */
               Eblock
          EDoI
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     lGENERATION_D_UN_FICHIER(sauvegarde_liste_initiale_des_Z,FLOT__UNDEF);
     lGENERATION_D_UN_FICHIER(sauvegarde_liste_initiale_des_Y,FLOT__UNDEF);
     lGENERATION_D_UN_FICHIER(sauvegarde_liste_initiale_des_X,FLOT__UNDEF);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_Z,Z_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_Y,Y_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_X,X_IMPLICITE);

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.