Начало работы

Начало работы
Начало работы

Пошаговая инструкция для начала работы

  1. Новая задача в виде указателя на функцию
    1. Реализовать собственную тестовую задачу с известным решением по аналогии с примером в файле SimpleMain.cpp проекта GlobalizerSimpleMain, отличную от представленных тестовых задач.
    1.1: В папке examples создать новый файл с исходным кодом (например, SimpleMain_15_12_2025.cpp).
    1.2: Пример новой задачи:
    #include "Globalizer.h"
    
    double MishrasBirdFunctionals(const double* y, int fNumber){
        double sin1 = sin(y[1]), cos0 = cos(y[0]);
        double result = 0.0;
    
        if (fNumber == 1)
            result = sin1 * exp(pow(1 - cos0, 2)) + cos0 * exp(pow(1 - sin1, 2)) + pow(y[0] - y[1], 2);
        else
            result = pow(y[0] + 5, 2) + pow(y[1] + 5, 2) - 25;
        return result;
    }
    
    int main(int argc, char* argv[]){
        GlobalizerInitialization(argc, argv);
        parameters.Dimension = 2;
        IProblem* problem = new ProblemFromFunctionPointers(
            parameters.Dimension,
            { -10.0, -6.5 },
            { 0.0, 0.0 },
            MishrasBirdFunctionals,
            2,
            true,
            -106.765,
            { -3.1302468, -1.5821422 }
        );
        problem->Initialize();
        Solver solver(problem);
        if (solver.Solve() != SYSTEM_OK)
            throw EXCEPTION("Error: solver.Solve crash!!!");
        return 0;
    }
    2. Собрать пример с новой задачей используя конфигурационные файлы программной системы Globalizer:
    cd ../BuildGlobalizer/
    CC=icc CXX=icpc cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc 
    -DGLOBALIZER_BUILD_PROBLEMS=ON -DGLOBALIZER_BUILD_GCGEN=ON 
    -DBUILD_ALL_TASK=ON -DGLOBALIZER_MAX_DIMENSION=130 -DGLOBALIZER_MAX_Number_Of_Function=70 
    -DGLOBALIZER_BUILD_TESTS=ON -DGLOBALIZER_USE_MPI=ON -DGLOBALIZER_MPI=intel -DGLOBALIZER_PYTHON=ON 
    -DGLOBALIZER_BENCHMARKS_PYTHON=ON -DGLOBALIZER_BENCHMARKS_PYTHON_PATH="../BuildGlobalizer/Globalizer_env" ..
    make
    cd ../_bin
    3. Запустить решение задачи, настроив параметры запуска:
    3.1: Windows:
    GlobalizerSimpleMain_15_12_2025


    3.2: Linux:
    ./GlobalizerSimpleMain_15_12_2025

  2. Новая задача в виде динамической библиотеки
    1. Реализовать собственную тестовую задачу по аналогии с примером в файлах stronginc3_problem.h, stronginc3_problem.cpp проекта stronginc3, отличную от представленных тестовых задач.
    1.1: В папке third_party\Problems\Problems создать новый каталог с исходным кодом задачи (например, SampleProblem_15_12_2025).
    1.2: В CMakeLists.txt указать как собрать задачу с использованием конфигурационных настроек программной системы Globalizer, например:
    GLOBALIZER_BENCHMARKS_define_problem(SampleProblem_15_12_2025)

    1.3: Написать код заголовочного файла задачи (например, SampleProblem_15_12_2025.h). Пример заголовочного файла задачи приведен в Листинге ниже.
    1.4: Написать файл исходного кода задачи (например, SampleProblem_15_12_2025.cpp). Пример файла исходного кода задачи приведен в Листинге ниже.
    2. Собрать пример с новой задачей используя конфигурационные файлы программной системы Globalizer:
    cd ../BuildGlobalizer/
    CC=icc CXX=icpc cmake -DCMAKE_C_COMPILER=icc 
    -DCMAKE_CXX_COMPILER=icpc -DGLOBALIZER_BUILD_PROBLEMS=ON -DGLOBALIZER_BUILD_GCGEN=ON 
    -DBUILD_ALL_TASK=ON -DGLOBALIZER_MAX_DIMENSION=130 -DGLOBALIZER_MAX_Number_Of_Function=70 
    -DGLOBALIZER_BUILD_TESTS=ON -DGLOBALIZER_USE_MPI=ON -DGLOBALIZER_MPI=intel -DGLOBALIZER_PYTHON=ON 
    -DGLOBALIZER_BENCHMARKS_PYTHON=ON 
    -DGLOBALIZER_BENCHMARKS_PYTHON_PATH="../BuildGlobalizer/Globalizer_env" ..
    make
    cd ../_bin

    3. Запустить решение задачи, настроив параметры запуска:
    3.1: Windows:
    GlobalizerSampleMain -lib SampleProblem_15_12_2025.dll

    3.2: Linux:
    ./GlobalizerSampleMain -lib ../third_party/Problems/_bin/libSampleProblem_15_12_2025.so

    Пример возможного файла исходного кода:
    #include "SampleProblem_15_12_2025.h"
    
    #define _USE_MATH_DEFINES
    
    #include <math.h>
    #include <iostream>
    
    // ------------------------------------------------------------------------------------------------
    SampleProblem_15_12_2025::SampleProblem_15_12_2025() {}
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::GetOptimumValue(double& value) const
    {
    value = 4.5796;
    return IGlobalOptimizationProblem::PROBLEM_OK;
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::GetOptimumPoint(std::vector<double>& point,
    std::vector<std::string>& u) const
    {
    point.resize(GetDimension() - GetNumberOfDiscreteVariable());
    u.resize(GetNumberOfDiscreteVariable());
    point[0] = 0.2;
    point[1] = 0.8;
    point[2] = 1.908;
    u[0] = "1";
    u[1] = "1";
    u[2] = "0";
    u[3] = "1";
    return IGlobalOptimizationProblem::PROBLEM_OK;
    }
    
    // ------------------------------------------------------------------------------------------------
    double SampleProblem_15_12_2025::CalculateFunctionals(const std::vector<double>& x,
    std::vector<std::string>& u, int fNumber)
    {
    double res = 0.0;
    double x1 = x[0], x2 = x[1], x3 = x[2];
    double y1 = u[0].c_str()[0] - '0', y2 = u[1].c_str()[0] - '0',
    y3 = u[2].c_str()[0] - '0', y4 = u[3].c_str()[0] - '0';
    
    switch (fNumber)
    {
    case 0: // constraint 1
    res = y1 + y2 + y3 + x1 + x2 + x3 - 5.0;
    break;
    case 1: // constraint 2
    res = y3 * y3 + x1 * x1 + x2 * x2 + x3 * x3 - 5.5;
    break;
    case 2: // constraint 3
    res = y1 + x1 - 1.2;
    break;
    case 3: // constraint 4
    res = y2 + x2 - 1.8;
    break;
    case 4: // constraint 5
    res = y3 + x3 - 2.5;
    break;
    case 5: // constraint 6
    res = y4 + x1 - 1.2;
    break;
    case 6: // constraint 7
    res = y2 * y2 + x2 * x2 - 1.64;
    break;
    case 7: // constraint 8
    res = y3 * y3 + x3 * x3 - 4.25;
    break;
    case 8: // constraint 9
    res = y2 * y2 + x3 * x3 - 4.64;
    break;
    case 9: // criterion
    res = (y1 - 1.0) * (y1 - 1.0) + (y2 - 2.0) * (y2 - 2.0) + (y3 - 1.0) * (y3 - 1.0) - log(y4 + 1.0) + (x1 - 1.0) * (x1 - 1.0) + (x2 - 2.0) * (x2 - 2.0) + (x3 - 3.0) * (x3 - 3.0);
    break;
    }
    return res;
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::SetDimension(int dimension)
    {
    if (dimension == 3)
    return IGlobalOptimizationProblem::PROBLEM_OK;
    return IGlobalOptimizationProblem::PROBLEM_ERROR;
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::GetDimension() const
    {
    return 7;
    }
    
    // ------------------------------------------------------------------------------------------------
    void SampleProblem_15_12_2025::GetBounds(std::vector<double>& lower,
    std::vector<double>& upper)
    {
    lower.resize(GetDimension() - GetNumberOfDiscreteVariable());
    upper.resize(GetDimension() - GetNumberOfDiscreteVariable());
    
    for (int i = 0; i < GetDimension() - GetNumberOfDiscreteVariable(); i++)
    {
    lower[i] = 0;
    upper[i] = 3;
    }
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::GetNumberOfFunctions() const
    {
    return GetNumberOfConstraints() + GetNumberOfCriterions();
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::GetNumberOfConstraints() const
    {
    return 9;
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::GetNumberOfCriterions() const
    {
    return 1;
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::Initialize()
    {
    return IGlobalOptimizationProblem::PROBLEM_OK;
    }
    
    // ------------------------------------------------------------------------------------------------
    int SampleProblem_15_12_2025::GetNumberOfDiscreteVariable() const
    {
    return 4;
    }
    
    // ------------------------------------------------------------------------------------------------
    inline int SampleProblem_15_12_2025::GetDiscreteVariableValues(std::vector<std::vector<std::string>>& values) const
    {
    values.resize(GetNumberOfDiscreteVariable());
    
    for (int i = 0; i < GetNumberOfDiscreteVariable(); i++)
    {
    values[i].resize(2);
    for (int j = 0; j < 2; j++)
    {
    values[i][j] = std::string(1, '0' + j);
    }
    }
    return IGlobalOptimizationProblem::PROBLEM_OK;
    }
    
    // ------------------------------------------------------------------------------------------------
    LIB_EXPORT_API IGlobalOptimizationProblem* create()
    {
    return new SampleProblem_15_12_2025();
    }
    
    // ------------------------------------------------------------------------------------------------
    LIB_EXPORT_API void destroy(IGlobalOptimizationProblem* ptr)
    {
    delete ptr;
    }
    // - end of file ----------------------------------------------------------------------------------

  3. Визуализация
    1. Windows:
    GlobalizerSampleMain -lib SampleProblem_15_12_2025.dll -N 2 -sip search_data.txt 
                                -PlotFileName search_data.png -PLOT

    2. Linux:
    GlobalizerSampleMain -lib ../third_party/Problems/_bin/libSampleProblem_15_12_2025.so 
                                -N 2 -sip search_data.txt -PlotFileName search_data.png -PLOT