-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathLABS.c
79 lines (57 loc) · 1.39 KB
/
LABS.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
* LABS.c
*
* @ José E. Gallardo, Carlos Cotta & Antonio J. Fernández, 2012
* Finding Low Autocorrelation Binary Sequences with Memetic Algorithms.
* Applied Soft Computing. 9(4): 1252-1262 (2009).
*/
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "LABS.h"
#include "random.h"
Fitness autocorrelation(Gene *seq, int N) {
Fitness s, f = 0;
for(int i=0; i<N-1; i++) {
s = 0;
for(int j=0; j<N-1-i; j ++)
s += seq[j]*seq[i+1+j];
f += (SQR(s));
}
return f;
}
double meritFactor(Fitness f, int N) {
return SQR(N) / (2.0 * f);
}
double seqMeritFactor(Gene *seq, int N) {
return meritFactor(autocorrelation(seq,N), N);
}
void LABSRandomSeq(Gene *seq, int N, Random rnd) {
for(int i=0; i<N; i++) {
seq[i] = RandomNextBool(rnd) ? 1 : (-1);
}
}
void fprintSeq(FILE *fp, Gene *seq, int N) {
for(int i=0; i<N; i++)
fprintf(fp, "%c", seq[i] == 1 ? '+' : '-');
fprintf(fp, " %d %.2f", autocorrelation(seq, N), seqMeritFactor(seq, N));
}
#define MAX_OPTS 60
Fitness labsOpts[1+MAX_OPTS];
void readLABSOpts(char* fileName) {
FILE* f;
f = fopen(fileName, "rt");
if(!f) {
printf("\nCan't open %s file for reading", fileName);
exit(1);
}
int size, opt;
while(fscanf(f, "%d %d", &size, &opt) != EOF) {
labsOpts[size] = opt;
}
fclose(f);
}
Fitness knownOptimum(int N) {
return ((N <= MAX_OPTS) ? labsOpts[N] : 0);
}