Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <thread>
- #include <vector>
- #include <chrono>
- #include <fstream>
- #include <cstdlib>
- #include <time.h>
- #include <math.h>
- #define pi 3.141592f
- #define epsilon 0.001f
- using namespace std;
- float Rastrigin(int dim, float v[30])
- {
- float result = 10*dim;
- for (int i = 0; i < dim; i++)
- result = result + (v[i] * v[i] - 10 * cos(2 * pi * v[i]));
- return result;
- }
- void random_search_Rastrigin(int dimensiuni)
- {
- float v[30];
- float minimum = INT_MAX;
- float m;
- fstream output, output_time;
- clock_t tStart = clock();
- output.open("Random_Rastrigin_Dim5.txt",std::fstream::out | std::fstream::app);
- output_time.open("Random_Rastrigin_Dim5_Time.txt",std::fstream::out | std::fstream::app);
- for (int i = 0; i < 10000; i++)
- {
- for (int j = 0; j < dimensiuni; j++)
- {
- v[j] = float((rand() % 51201)) / 10000.0f;
- if (rand() % 2 == 1) v[j] *= -1;
- }
- if((m=Rastrigin(dimensiuni,v) < minimum))
- minimum = m;
- }
- double timp = (double)(clock() - tStart)/CLOCKS_PER_SEC;
- output << minimum<< ' ';
- output_time<<timp<<' ';
- output.close();
- output_time.close();
- }
- float greedy_HillClimbing_Rastrigin_Recurssive(int dim, float v[30], float minim) //ar trebui sa returneze minimul accesibil din acel punct
- {
- for(int i=0;i< dim;i++)
- {
- if(v[i]>-5.12 && v[i]<5.12)
- {v[i] = v[i]+ epsilon;
- if(Rastrigin(dim,v)< minim)
- {
- minim = Rastrigin(dim,v);
- return greedy_HillClimbing_Rastrigin_Recurssive(dim,v, minim);
- }
- v[i] = v[i] - 2*epsilon;
- if(Rastrigin(dim,v)< minim)
- {
- minim = Rastrigin(dim,v);
- return greedy_HillClimbing_Rastrigin_Recurssive(dim,v, minim);
- }
- }
- else return float(INT_MAX);
- }
- return minim;
- }
- void greedy_HillClimbing_Rastrigindim2(int dimensiuni)
- {
- clock_t tStart = clock();
- float v[30];
- float minimum=INT_MAX;
- float m=INT_MAX, neigh_min;
- fstream output;
- float saved_val[30];
- float copie[30];
- output.open("GreedyHillClimbing_Rastrigin_Dim2.txt",std::fstream::out);
- for(int i=0;i<dimensiuni;i++)
- v[i] = -5.12;
- for(int i=0;i<20;i++)
- {
- for(int j=0; j<dimensiuni;j++)
- {
- v[j] =v[j] + 0.5;
- neigh_min= INT_MAX;
- for(int i=0;i<dimensiuni;i++)
- copie[i]=v[i];
- if( (m=greedy_HillClimbing_Rastrigin_Recurssive(dimensiuni,copie,neigh_min)) < minimum )
- {minimum=m; for(int h=0;h<dimensiuni;h++) saved_val[h]=copie[h];}
- }
- }
- double timp = (double)(clock() - tStart)/CLOCKS_PER_SEC;
- output <<"Minim: "<< minimum<< ' ';
- output<<"Timp: "<<timp<<endl;
- for(int h=0;h<dimensiuni;h++)
- output<<saved_val[h]<<' ';
- output.close();
- }
- void greedy_HillClimbing_Rastrigindim5(int dimensiuni)
- {
- float v[30];
- float minimum=INT_MAX;
- float m=INT_MAX, neigh_min;
- fstream output;
- float copie[30];
- float saved_val[30];
- clock_t tStart = clock();
- output.open("GreedyHillClimbing_Rastrigin_Dim5.txt",std::fstream::out);
- for(int i=0;i<dimensiuni;i++)
- v[i] = -5.12;
- for(int i=0;i<10;i++)
- {
- for(int j=0; j<dimensiuni;j++)
- {
- v[j] = v[j] + 1;
- neigh_min= INT_MAX;
- for(int i=0;i<dimensiuni;i++)
- copie[i]=v[i];
- if( (m=greedy_HillClimbing_Rastrigin_Recurssive(dimensiuni,copie,neigh_min)) < minimum )
- {minimum=m; for(int h=0;h<dimensiuni;h++) saved_val[h]=copie[h];}
- }
- }
- double timp = (double)(clock() - tStart)/CLOCKS_PER_SEC;
- output <<"Minim: "<< minimum<< ' ';
- output<<"Timp: "<<timp<<endl;
- for(int h=0;h<dimensiuni;h++)
- output<<saved_val[h]<<' ';
- output.close();
- }
- void greedy_HillClimbing_Rastrigindim20(int dimensiuni)
- {
- float v[30];
- float minimum=INT_MAX;
- float m=INT_MAX, neigh_min;
- fstream output;
- float copie[30];
- clock_t tStart = clock();
- float saved_val[30];
- output.open("GreedyHillClimbing_Rastrigin_Dim20.txt",std::fstream::out);
- for(int i=0;i<dimensiuni;i++)
- v[i] = -5.12;
- for(int i=0;i<10;i++)
- {
- for(int j=0; j<dimensiuni;j++)
- {
- v[j] =v[j] + 1;
- neigh_min= INT_MAX;
- for(int i=0;i<dimensiuni;i++)
- copie[i]=v[i];
- if( (m=greedy_HillClimbing_Rastrigin_Recurssive(dimensiuni,copie,neigh_min)) < minimum )
- {minimum=m; for(int h=0;h<dimensiuni;h++) saved_val[h]=copie[h];}
- }
- }
- double timp = (double)(clock() - tStart)/CLOCKS_PER_SEC;
- output <<"Minim: "<< minimum<< ' ';
- output<<"Timp: "<<timp<<endl;
- for(int h=0;h<dimensiuni;h++)
- output<<saved_val[h]<<' ';
- output.close();
- }
- int main()
- {
- srand(time(NULL));
- /*for(int i=0; i<50;i++)
- {
- thread Rastrigin_Run(random_search_Rastrigin, 5);
- Rastrigin_Run.join();
- }
- */
- thread Rastrigin_Greedy_Dim2(greedy_HillClimbing_Rastrigindim2,2);
- thread Rastrigin_Greedy_Dim5(greedy_HillClimbing_Rastrigindim5,5);
- thread Rastrigin_Greedy_Dim20(greedy_HillClimbing_Rastrigindim20,20);
- Rastrigin_Greedy_Dim2.join();
- Rastrigin_Greedy_Dim5.join();
- Rastrigin_Greedy_Dim20.join();
- float v[30] = {0.935229, -0.000999818, -0.00199982, -0.00299982, -0.00599982, -0.0109998, -0.0219998, -0.0439999, -0.0909998, -0.121, -0.121, -0.121, -0.121, -0.121, -0.121, -0.121, -0.121, -0.121, -0.121, -0.121 };
- cout<<Rastrigin(20,v)<<' ';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement