⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asa.h

📁 模拟退火的源代码。关于matlab的大家好好学习以下吧
💻 H
字号:
#ifndef _ASA_H_
#define _ASA_H_

/***********************************************************************
* Adaptive Simulated Annealing (ASA)
* Lester Ingber <ingber@ingber.com>
* Copyright (c) 1993-2004 Lester Ingber.  All Rights Reserved.
* The LICENSE file must be included with ASA code.
***********************************************************************/

 /* $Id: asa.h,v 25.15 2004/09/23 18:10:48 ingber Exp ingber $ */

 /* asa.h for Adaptive Simulated Annealing */

#include "asa_usr_asa.h"

#define ZERO			((double) 0.0)
#define ONE			((double) 1.0)
#define TWO			((double) 2.0)
#define TEN			((double) 10.0)
#define HALF			((double) 0.5)

#define NORMAL_EXIT			((int) 0)
#define P_TEMP_TOO_SMALL		((int) 1)
#define C_TEMP_TOO_SMALL		((int) 2)
#define COST_REPEATING			((int) 3)
#define TOO_MANY_INVALID_STATES		((int) 4)
#define IMMEDIATE_EXIT			((int) 5)
#define INVALID_USER_INPUT		((int) 7)
#define INVALID_COST_FUNCTION		((int) 8)
#define INVALID_COST_FUNCTION_DERIV	((int) 9)
#define CALLOC_FAILED			((int) -1)

#ifndef TIME_STD
#define TIME_STD FALSE
#endif

#ifndef TIME_GETRUSAGE
#define TIME_GETRUSAGE TRUE
#endif

#if TIME_CALC
#if TIME_GETRUSAGE
#include <sys/time.h>
#include <sys/resource.h>
#if TIME_STD
#include <sys/syscall.h>
#endif /* TIME_STD */
#else /* TIME_GETRUSAGE */
#if TRUE                        /* change to FALSE for SunOS 4.1.x */
#include <time.h>
#else
#include </usr/5include/time.h>
#endif
#endif /* TIME_GETRUSAGE */
#endif /* TIME_CALC */

 /* Set this to TRUE to override the P_TEMP_TOO_SMALL test */
#ifndef NO_PARAM_TEMP_TEST
#define NO_PARAM_TEMP_TEST FALSE
#endif

 /* Set this to TRUE to override the C_TEMP_TOO_SMALL test */
#ifndef NO_COST_TEMP_TEST
#define NO_COST_TEMP_TEST FALSE
#endif

#ifndef SYSTEM_CALL
#define SYSTEM_CALL TRUE
#endif

 /* Printing Options */

#ifndef ASA_PRINT
#define ASA_PRINT TRUE
#endif

#if ASA_PRINT
#else
#if ASA_SAMPLE
#define ASA_PRINT TRUE
#endif
#endif

#ifndef ASA_OUT
#define ASA_OUT "asa_out"
#endif

#ifndef DROPPED_PARAMETERS
#define DROPPED_PARAMETERS FALSE
#endif

 /* You can set ASA_PRINT_INTERMED to TRUE to print out
    intermediate data when SELF_OPTIMIZE is set to TRUE */
#ifndef ASA_PRINT_INTERMED
#if SELF_OPTIMIZE
#define ASA_PRINT_INTERMED FALSE
#else
#define ASA_PRINT_INTERMED TRUE
#endif
#endif

#ifndef ASA_PRINT_MORE
#define ASA_PRINT_MORE FALSE
#endif

char exit_msg[160];             /* temp storage for exit messages */

 /* The state of the system in terms of parameters and function value */
typedef struct {
  double cost;
  double *parameter;
#if ASA_PARALLEL
#if USER_ACCEPTANCE_TEST
  int par_user_accept_flag;
  int par_cost_accept_flag;
#endif
#endif
} STATE;

#if ASA_PARALLEL
  /* parallel generated states */
STATE *gener_block_state_qsort;
#endif

 /* essential MACROS */

#if USER_REANNEAL_PARAMETERS
#else
 /* FUNCTION_REANNEAL_PARAMS(temperature, tangent, max_tangent)
    determines the reannealed temperature. */
#define FUNCTION_REANNEAL_PARAMS(temperature, tangent, max_tangent) \
 (temperature * (max_tangent / tangent))
#endif

 /* IABS(i)
    absolute value for integers, in stdlib.h on _some_ machines */
#define IABS(i) ((i) < 0? -(i) : (i))

 /*  NO_REANNEAL(x)
    can determine whether to calculate derivatives. */
#define NO_REANNEAL(x)	(IABS(parameter_type[x]) == 2)

 /* VFOR
    is a simple macro to iterate on each parameter index. */

#define VFOR(index_v) \
 for (index_v = 0; index_v < *number_parameters; ++index_v)

#if CHECK_EXPONENT
 /* EXPONENT_CHECK
    checks that an exponent x is within a valid range and,
    if not, adjusts its magnitude to fit in the range. */
#define MIN_EXPONENT (0.9 * F_LOG ((double) MIN_DOUBLE))
#define MAX_EXPONENT (0.9 * F_LOG ((double) MAX_DOUBLE))
#define EXPONENT_CHECK(x) \
 ((x) < MIN_EXPONENT ? MIN_EXPONENT : \
 ((x) > MAX_EXPONENT ? MAX_EXPONENT : (x)))
#else
#define EXPONENT_CHECK(x) (x)
#endif /* CHECK_EXPONENT */

 /* PARAMETER_RANGE_TOO_SMALL(x)
    checks if the range of parameter x is too small to work with.
    If user_cost_function changes the parameter ranges,
    this test could be used to adaptively bypass
    some parameters, e.g., depending on constraints. */
#define PARAMETER_RANGE_TOO_SMALL(x) \
 (fabs(parameter_minimum[x] - parameter_maximum[x]) < (double) EPS_DOUBLE)

 /* INTEGER_PARAMETER(x)
    determines if the parameter is an integer type. */
#define INTEGER_PARAMETER(x) (parameter_type[x] > 0)

 /* ROW_COL_INDEX(i, j)
    converts from row i, column j to an index. */
#define ROW_COL_INDEX(i, j) ((i) + *number_parameters * (j))

#if HAVE_ANSI

 /* asa function prototypes */
void accept_new_state (double (*user_random_generator) (LONG_INT *),
                       LONG_INT * seed,
                       double *parameter_minimum,
                       double *parameter_maximum,
                       double *current_cost_temperature,
#if ASA_SAMPLE
                       double *current_user_parameter_temp,
#endif
                       ALLOC_INT * number_parameters,
                       LONG_INT * recent_number_acceptances,
                       LONG_INT * number_accepted,
                       LONG_INT * index_cost_acceptances,
                       LONG_INT * number_acceptances_saved,
                       LONG_INT * recent_number_generated,
                       LONG_INT * number_generated,
                       LONG_INT * index_parameter_generations,
                       STATE * current_generated_state,
                       STATE * last_saved_state,
#if ASA_SAMPLE
                       FILE * ptr_asa_out,
#endif
                       USER_DEFINES * OPTIONS);

void generate_new_state (double (*user_random_generator) (LONG_INT *),
                         LONG_INT * seed,
                         double *parameter_minimum,
                         double *parameter_maximum,
                         double *current_parameter_temperature,
#if USER_GENERATING_FUNCTION
                         double *initial_user_parameter_temp,
                         double *temperature_scale_parameters,
#endif
                         ALLOC_INT * number_parameters,
                         int *parameter_type,
                         STATE * current_generated_state,
                         STATE * last_saved_state, USER_DEFINES * OPTIONS);

void reanneal (double *parameter_minimum,
               double *parameter_maximum,
               double *tangents,
               double *maximum_tangent,
               double *current_cost_temperature,
               double *initial_cost_temperature,
               double *temperature_scale_cost,
               double *current_user_parameter_temp,
               double *initial_user_parameter_temp,
               double *temperature_scale_parameters,
               ALLOC_INT * number_parameters,
               int *parameter_type,
               LONG_INT * index_cost_acceptances,
               LONG_INT * index_parameter_generations,
               STATE * last_saved_state,
               STATE * best_generated_state, USER_DEFINES * OPTIONS);

void
  cost_derivatives (double (*user_cost_function)

                     
                    (double *, double *, double *, double *, double *,
                     ALLOC_INT *, int *, int *, int *, USER_DEFINES *),
                    double *parameter_minimum, double *parameter_maximum,
                    double *tangents, double *curvature,
                    double *maximum_tangent, ALLOC_INT * number_parameters,
                    int *parameter_type, int *exit_status,
                    int *curvature_flag, int *valid_state_generated_flag,
                    LONG_INT * number_invalid_generated_states,
                    STATE * current_generated_state,
                    STATE * best_generated_state, FILE * ptr_asa_out,
                    USER_DEFINES * OPTIONS);

double generate_asa_state (double (*user_random_generator) (LONG_INT *),
                           LONG_INT * seed, double *temp);

int
  asa_exit (double (*user_cost_function)

             
            (double *, double *, double *, double *, double *, ALLOC_INT *,
             int *, int *, int *, USER_DEFINES *), double *final_cost,
            double *parameter_initial_final, double *parameter_minimum,
            double *parameter_maximum, double *tangents, double *curvature,
            double *maximum_tangent, double *current_cost_temperature,
            double *initial_user_parameter_temp,
            double *current_user_parameter_temp,
            double *accepted_to_generated_ratio,
            ALLOC_INT * number_parameters, int *parameter_type,
            int *valid_state_generated_flag, int *exit_status,
            ALLOC_INT * index_exit_v, ALLOC_INT * start_sequence,
            LONG_INT * number_accepted, LONG_INT * best_number_accepted_saved,
            LONG_INT * index_cost_acceptances, LONG_INT * number_generated,
            LONG_INT * number_invalid_generated_states,
            LONG_INT * index_parameter_generations,
            LONG_INT * best_number_generated_saved,
            STATE * current_generated_state, STATE * last_saved_state,
            STATE * best_generated_state, FILE * ptr_asa_out,
            USER_DEFINES * OPTIONS);

void Exit_ASA (char *statement);

int asa_test_asa_options (LONG_INT * seed,
                          double *parameter_initial_final,
                          double *parameter_minimum,
                          double *parameter_maximum,
                          double *tangents,
                          double *curvature,
                          ALLOC_INT * number_parameters,
                          int *parameter_type,
                          int *valid_state_generated_flag,
                          int *exit_status,
                          FILE * ptr_asa_out, USER_DEFINES * OPTIONS);

int cost_function_test (double cost,
                        double *parameter,
                        double *parameter_minimum,
                        double *parameter_maximum,
                        ALLOC_INT * number_parameters,
                        double *xnumber_parameters);

void print_string (FILE * ptr_asa_out, char *string);
void print_string_index (FILE * ptr_asa_out, char *string, ALLOC_INT index);

#if ASA_PRINT
void print_state (double *parameter_minimum,
                  double *parameter_maximum,
                  double *tangents,
                  double *curvature,
                  double *current_cost_temperature,
                  double *current_user_parameter_temp,
                  double *accepted_to_generated_ratio,
                  ALLOC_INT * number_parameters,
                  int *curvature_flag,
                  LONG_INT * number_accepted,
                  LONG_INT * index_cost_acceptances,
                  LONG_INT * number_generated,
                  LONG_INT * number_invalid_generated_states,
                  STATE * last_saved_state,
                  STATE * best_generated_state,
                  FILE * ptr_asa_out, USER_DEFINES * OPTIONS);

void print_asa_options (FILE * ptr_asa_out, USER_DEFINES * OPTIONS);
#endif /* ASA_PRINT */

#if TIME_CALC
#if TIME_GETRUSAGE
void aux_print_time (struct timeval *time, char *message, FILE * ptr_asa_out);
#if TIME_STD
int syscall (int sys_option, int who, struct rusage *usage);
#else
int getrusage (int who, struct rusage *usage);
#endif /* TIME_STD */
#else /* TIME_GETRUSAGE */
void aux_print_time (clock_t time, char *message, FILE * ptr_asa_out);
#if FALSE                       /* change to TRUE for SunOS 4.1.x */
clock_t clock ();
#endif
#endif /* TIME_GETRUSAGE */
#endif /* TIME_CALC */

#if MULTI_MIN
static int multi_compare (const void *cost_ii, const void *cost_jj);
double *multi_cost_qsort;
#endif

#if ASA_PARALLEL
static int sort_parallel (const void *cost_ii, const void *cost_jj);
#endif

#else /* HAVE_ANSI */

void accept_new_state ();
void generate_new_state ();
void reanneal ();
void cost_derivatives ();
double generate_asa_state ();
int asa_exit ();
void Exit_ASA ();
int asa_test_asa_options ();
int cost_function_test ();
void print_string ();
void print_string_index ();

#if ASA_PRINT
void print_state ();
void print_asa_options ();
#endif /* ASA_PRINT */

#if TIME_CALC
void aux_print_time ();
#if TIME_GETRUSAGE
#if TIME_STD
int syscall ();
#else
int getrusage ();
#endif /* TIME_STD */
#else /* TIME_GETRUSAGE */
#if FALSE                       /* change to TRUE for SunOS 4.1.x */
clock_t clock ();
#endif
#endif /* TIME_GETRUSAGE */
#endif /* TIME_CALC */

#if MULTI_MIN
static int multi_compare ();
double *multi_cost_qsort;
#endif

#if ASA_PARALLEL
static int sort_parallel ();
#endif

#endif /* HAVE_ANSI */
static int asa_recursive_max = 0;       /* record of max recursions */

#endif /* _ASA_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -