看完了粒子群算法,模拟退火算法和遗传算法,那么,传统的一维搜索方法应该怎么样呢?我们来看看斐波拉契算法和黄金分割算法,大概20次以内就能算出来
#include <stdio.h>
#include <time.h>
#include <math.h>
#define f(x) (-(x + 10*sin(5*x) + 7*cos(4*x)))
#define Q 0.382
float goldsearch(float a, float b, int n)
{
float x, y;
for (int i = n; i > 0; i--) {
float x = a + Q*(b - a);
float y = a + (1 - Q)*(b - a);
if (f(x) < f(y)) {
a = a;
b = y;
}
else {
a = x;
b = b;
}
}
if (f(a) < f(b)){
return a; }
else{
return b;
}
}
float fibonacci_num(int n)
{
if (n <= 2) return 1;
else return fibonacci_num(n - 1) + fibonacci_num(n - 2);
}
float fibonacci_search(float a, float b, int n)
{
float q[255] = {0};
for(int i = n; i >= 0; i--) {
q[n-i+1] =1- (fibonacci_num(i + 2) / fibonacci_num(i + 3));
// printf("q[%d] = %f\n", n - i + 1, q[n - i + 1]);
}
float x, y;
for (int i = 1; i <= n; i++) {
float x = a + q[i]*(b - a);
float y = a + (1 - q[i])*(b - a);
if (f(x) < f(y)) {
a = a;
b = y;
}
else {
a = x;
b = b;
}
}
if (f(a) < f(b)) {
return a;
}
else {
return b;
}
}
double* CallBack_GetTime(float a, float b, int n,float (*search)(float , float , int ))
{
double start, end, delta_time, ans[2] = {0};
start = clock();
ans[0] = (*search)(a, b, n);
end = clock();
delta_time = (end - start)/ CLOCKS_PER_SEC;
ans[1] = delta_time;
return ans;
}
int main()
{
double *gold_ans = CallBack_GetTime(0, 9, 20, goldsearch);
printf("黄金分割法——在X = %f 时取得最小值,搜索花费时间为%f\n\n", gold_ans[0],gold_ans[1]);
double *fibo_ans = CallBack_GetTime(0, 9, 20, fibonacci_search);
printf("斐波拉契法——在X = %f 时取得最小值,搜索花费时间为%f\n\n", fibo_ans[0],fibo_ans[1]);
while (1);
return 0;
}