Minimum Finder  1.0
Find the minimum of one multi-dimss function
Loading...
Searching...
No Matches
main.cpp File Reference

Entry point for the Optimization Algorithms Solver project. More...

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <limits>
#include <iomanip>
#include "methods.h"
#include "utils.h"
+ Include dependency graph for main.cpp:

Go to the source code of this file.

Functions

int main ()
 

Detailed Description

Entry point for the Optimization Algorithms Solver project.

Author
Gilbert Young
Date
2024/09/19

Definition in file main.cpp.

Function Documentation

◆ main()

int main ( )

Definition at line 49 of file main.cpp.

50{
51 srand(static_cast<unsigned int>(time(0)));
52 char choice;
53 DefaultParameters params;
54
55 do
56 {
57 std::cout << "\nOptimization Algorithms Menu:\n";
58 std::cout << "1. Steepest Descent Method\n";
59 std::cout << "2. Conjugate Gradient Method\n";
60 std::cout << "3. Simulated Annealing\n";
61 std::cout << "4. Genetic Algorithm\n";
62 std::cout << "5. Compare All Methods\n";
63 std::cout << "Enter your choice (1-5): ";
64 int option;
65 std::cin >> option;
66
67 if (option >= 1 && option <= 4)
68 {
69 displayDefaultParameters(params, option);
70 std::cout << "\n1. Use default parameters\n";
71 std::cout << "2. Customize parameters\n";
72 std::cout << "Enter your choice (1-2): ";
73 int subOption;
74 std::cin >> subOption;
75
76 Result res;
77 if (subOption == 1)
78 {
79 // Run method with default parameters
80 if (option == 1)
81 res = steepestDescent(params.x0, params.y0, params.alpha_sd, params.maxIter_sd, params.tol_sd);
82 else if (option == 2)
83 res = conjugateGradient(params.x0, params.y0, params.maxIter_cg, params.tol_cg);
84 else if (option == 3)
85 res = simulatedAnnealing(params.x0, params.y0, params.T0_sa, params.Tmin_sa, params.alpha_sa, params.maxIter_sa);
86 else if (option == 4)
88
89 // Display results
90 std::cout << "\nResults:\n";
91 std::cout << "Minimum at (" << std::fixed << std::setprecision(4) << res.x << ", " << res.y << ")\n";
92 std::cout << "Minimum value: " << std::fixed << std::setprecision(4) << res.f << "\n";
93 std::cout << "Total iterations: " << res.iterations << "\n";
94 std::cout << "Execution Time: " << std::scientific << std::setprecision(3) << res.duration << " seconds\n";
95 }
96 else if (subOption == 2)
97 {
98 // Customize parameters
99 std::cout << "Enter initial x (default " << std::fixed << std::setprecision(4) << params.x0 << "): ";
100 std::cin >> params.x0;
101 std::cout << "Enter initial y (default " << std::fixed << std::setprecision(4) << params.y0 << "): ";
102 std::cin >> params.y0;
103
104 if (option == 1)
105 {
106 std::cout << "Enter learning rate alpha (default " << std::fixed << std::setprecision(4) << params.alpha_sd << "): ";
107 std::cin >> params.alpha_sd;
108 std::cout << "Enter maximum iterations (default " << params.maxIter_sd << "): ";
109 std::cin >> params.maxIter_sd;
110 std::cout << "Enter tolerance (default " << std::scientific << std::setprecision(3) << params.tol_sd << "): ";
111 std::cin >> params.tol_sd;
112 res = steepestDescent(params.x0, params.y0, params.alpha_sd, params.maxIter_sd, params.tol_sd);
113 }
114 else if (option == 2)
115 {
116 std::cout << "Enter maximum iterations (default " << params.maxIter_cg << "): ";
117 std::cin >> params.maxIter_cg;
118 std::cout << "Enter tolerance (default " << std::scientific << std::setprecision(3) << params.tol_cg << "): ";
119 std::cin >> params.tol_cg;
120 res = conjugateGradient(params.x0, params.y0, params.maxIter_cg, params.tol_cg);
121 }
122 else if (option == 3)
123 {
124 std::cout << "Enter initial temperature T0 (default " << std::fixed << std::setprecision(4) << params.T0_sa << "): ";
125 std::cin >> params.T0_sa;
126 std::cout << "Enter minimum temperature Tmin (default " << std::scientific << std::setprecision(6) << params.Tmin_sa << "): ";
127 std::cin >> params.Tmin_sa;
128 std::cout << "Enter cooling rate alpha (default " << std::fixed << std::setprecision(4) << params.alpha_sa << "): ";
129 std::cin >> params.alpha_sa;
130 std::cout << "Enter maximum iterations (default " << params.maxIter_sa << "): ";
131 std::cin >> params.maxIter_sa;
132 res = simulatedAnnealing(params.x0, params.y0, params.T0_sa, params.Tmin_sa, params.alpha_sa, params.maxIter_sa);
133 }
134 else if (option == 4)
135 {
136 std::cout << "Enter population size (default " << params.populationSize_ga << "): ";
137 std::cin >> params.populationSize_ga;
138 std::cout << "Enter number of generations (default " << params.generations_ga << "): ";
139 std::cin >> params.generations_ga;
140 std::cout << "Enter mutation rate (default " << std::fixed << std::setprecision(4) << params.mutationRate_ga << "): ";
141 std::cin >> params.mutationRate_ga;
142 std::cout << "Enter crossover rate (default " << std::fixed << std::setprecision(4) << params.crossoverRate_ga << "): ";
143 std::cin >> params.crossoverRate_ga;
145 }
146
147 // Display results
148 std::cout << "\nResults:\n";
149 std::cout << "Minimum at (" << std::fixed << std::setprecision(4) << res.x << ", " << res.y << ")\n";
150 std::cout << "Minimum value: " << std::fixed << std::setprecision(4) << res.f << "\n";
151 std::cout << "Total iterations: " << res.iterations << "\n";
152 std::cout << "Execution Time: " << std::scientific << std::setprecision(3) << res.duration << " seconds\n";
153 }
154 else
155 {
156 std::cout << "Invalid sub-option. Please select 1 or 2.\n";
157 }
158 }
159 else if (option == 5)
160 {
161 // Compare all methods with default parameters
162 compareMethods(params);
163 }
164 else
165 {
166 std::cout << "Invalid option. Please select 1-5.\n";
167 }
168
169 // Ask user if they want to run again
170 std::cout << "\nDo you want to run the program again? (y/n): ";
171 std::cin >> choice;
172 } while (choice == 'y' || choice == 'Y');
173
174 // Wait for user input before exiting
175 std::cout << "\nPress Enter to exit...";
176 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Clear input buffer
177 std::cin.get(); // Wait for Enter key
178 return 0;
179}
Result simulatedAnnealing(double x0, double y0, double T0, double Tmin, double alpha, int maxIter)
Definition methods.cpp:100
Result steepestDescent(double x0, double y0, double alpha, int maxIter, double tol)
Definition methods.cpp:22
Result conjugateGradient(double x0, double y0, int maxIter, double tol)
Definition methods.cpp:53
Result geneticAlgorithm(int populationSize, int generations, double mutationRate, double crossoverRate)
Definition methods.cpp:138
double crossoverRate_ga
Definition structs.h:54
int populationSize_ga
Definition structs.h:51
double alpha_sd
Definition structs.h:36
double alpha_sa
Definition structs.h:47
double mutationRate_ga
Definition structs.h:53
double duration
Definition structs.h:64
double f
Definition structs.h:62
double y
Definition structs.h:61
double x
Definition structs.h:60
int iterations
Definition structs.h:63
void compareMethods(const DefaultParameters &params)
Definition utils.cpp:56
void displayDefaultParameters(const DefaultParameters &params, int option)
Definition utils.cpp:16