1 | % Simulated Annealing low-autocorrelation program
|
---|
2 | % BSDLicence
|
---|
3 | % Rick van der Zwet - 0433373 - <hvdzwet@liacs.nl>
|
---|
4 |
|
---|
5 | % Brute-force result of length 20
|
---|
6 | % best_20 = [-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1];
|
---|
7 | % autocorrelation(best_20);
|
---|
8 |
|
---|
9 | function number = randint(low,high)
|
---|
10 | number = round(rand() * (high - low)) + low;
|
---|
11 | endfunction
|
---|
12 |
|
---|
13 | function new = mutation(old)
|
---|
14 | loc = randint(1,length(old));
|
---|
15 | old(loc) = old(loc) * -1;
|
---|
16 | new = old;
|
---|
17 | endfunction
|
---|
18 |
|
---|
19 | function s = initseq(n)
|
---|
20 | % Generate a random column s={-1,1}^n
|
---|
21 | s = rand(n,1);
|
---|
22 | s = round(s);
|
---|
23 | s = s - (s == 0);
|
---|
24 | endfunction
|
---|
25 |
|
---|
26 | function [fitness,value] = sa(length, temperature, stopLimit)
|
---|
27 | best_fitness = 0;
|
---|
28 | s = initseq(length);
|
---|
29 | stopCounter = 0;
|
---|
30 |
|
---|
31 | while (stopCounter < stopLimit)
|
---|
32 | % Generate new mutation
|
---|
33 | newseq = mutation(s);
|
---|
34 |
|
---|
35 | % Better is always accept
|
---|
36 | fitness = autocorrelation(newseq);
|
---|
37 | if (fitness > best_fitness)
|
---|
38 | best_value = s;
|
---|
39 | best_fitness = fitness;
|
---|
40 | s = newseq;
|
---|
41 | fitness
|
---|
42 | disp(rot90(newseq,-1));
|
---|
43 | stopCounter = 0;
|
---|
44 | else
|
---|
45 | % Make the next 'move' less atractive
|
---|
46 | temperature =- 1;
|
---|
47 |
|
---|
48 | stopCounter += 1;
|
---|
49 | % Accept on an certain probability
|
---|
50 | if (temperature < 0)
|
---|
51 | break;
|
---|
52 | else
|
---|
53 | if(randint(0,temperature) > temperature / 4)
|
---|
54 | s = newseq;
|
---|
55 | endif
|
---|
56 | endif
|
---|
57 | endif
|
---|
58 | endwhile
|
---|
59 | value = best_value;
|
---|
60 | fitness = best_fitness;
|
---|
61 | endfunction
|
---|
62 |
|
---|
63 | %% Basic variables
|
---|
64 | iterations = [1:10:1000];
|
---|
65 | repetitions = 20;
|
---|
66 | length = 20;
|
---|
67 | temperature = 1000;
|
---|
68 |
|
---|
69 |
|
---|
70 | % Plot the stuff
|
---|
71 | fitnesses = [];
|
---|
72 | for iteration = iterations
|
---|
73 | fitness = [];
|
---|
74 | for rep = 1:repetitions
|
---|
75 | printf('Iter:%i, Rep:%i\n',iteration,rep);
|
---|
76 | [new_fitness, value] = sa(length,iteration,temperature);
|
---|
77 | fitness = [fitness, new_fitness];
|
---|
78 |
|
---|
79 | % Little hack to display output nicely
|
---|
80 | % disp(rot90(value,-1));
|
---|
81 | endfor
|
---|
82 |
|
---|
83 | fitnesses = [fitnesses,mean(fitness)];
|
---|
84 | endfor
|
---|
85 |
|
---|
86 | plot(iterations,fitnesses);
|
---|
87 | title(sprintf('Simulated Annealing on Low-Corretation set - repetitions %i',repetitions));
|
---|
88 | ylabel('fitness');
|
---|
89 | xlabel('iterations');
|
---|
90 | grid on;
|
---|
91 | legend(sprintf('Length %i',length));
|
---|
92 | print("sa-fitness.eps","-depsc2");
|
---|
93 |
|
---|