Passed
Push — master ( 684e9e...246d84 )
by
unknown
01:04
created

GreyWolfOptimizer.eval_true()   A

Complexity

Conditions 2

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
1
"""Grey wolf optimizer.
2
3
Date: 11.2.2018
4
5
Author : Iztok Fister Jr.
6
7
License: MIT
8
9
Reference paper: Mirjalili, Seyedali, Seyed Mohammad Mirjalili, and Andrew Lewis.
10
"Grey wolf optimizer." Advances in engineering software 69 (2014): 46-61.
11
#& Grey Wold Optimizer (GWO) source codes version 1.0 (MATLAB)
12
13
TODO: Validation must be conducted! More tests are required!
14
"""
15
16
import random
17
from NiaPy.benchmarks.utility import Utility
18
19
__all__ = ['GreyWolfOptimizer']
20
21
22
class GreyWolfOptimizer(object):
23
24
    # pylint: disable=too-many-instance-attributes
25
26
    def __init__(self, D, NP, nFES, benchmark):
27
        self.benchmark = Utility().get_benchmark(benchmark)
28
        self.D = D  # dimension of the problem
29
        self.NP = NP  # population size; number of search agents
30
        self.nFES = nFES  # number of function evaluations
31
        self.Lower = self.benchmark.Lower  # lower bound
32
        self.Upper = self.benchmark.Upper  # upper bound
33
        self.Fun = self.benchmark.function()
34
35
        self.Positions = [[0 for _i in range(self.D)]  # positions of search agents
36
                          for _j in range(self.NP)]
37
38
        self.eval_flag = True  # evaluations flag
39
        self.evaluations = 0  # evaluations counter
40
41
        # TODO: "-inf" is in the case of maximization problems
42
        self.Alpha_pos = [0] * self.D  # init of alpha
43
        self.Alpha_score = float("inf")
44
45
        self.Beta_pos = [0] * self.D  # init of beta
46
        self.Beta_score = float("inf")
47
48
        self.Delta_pos = [0] * self.D  # init of delta
49
        self.Delta_score = float("inf")
50
51
    def initialization(self):
52
        # initialization of positions
53
        for i in range(self.NP):
54
            for j in range(self.D):
55
                self.Positions[i][j] = random.random(
56
                ) * (self.Upper - self.Lower) + self.Lower
57
58
    def eval_true(self):
59
        """Check evaluations."""
60
61
        if self.evaluations == self.nFES:
62
            self.eval_flag = False
63
64
    def bounds(self, position):
65
        for i in range(self.D):
66
            if position[i] < self.Lower:
67
                position[i] = self.Lower
68
            if position[i] > self.Upper:
69
                position[i] = self.Upper
70
        return position
71
72
    # pylint: disable=too-many-locals
73
    def move(self):
74
75
        self.initialization()
76
77
        while self.eval_flag is not False:
78
79
            for i in range(self.NP):
80
                self.Positions[i] = self.bounds(self.Positions[i])
81
82
                self.eval_true()
83
                if self.eval_flag is not True:
84
                    break
85
86
                Fit = self.Fun(self.D, self.Positions[i])
87
                self.evaluations = self.evaluations + 1
88
89
                if Fit < self.Alpha_score:
90
                    self.Alpha_score = Fit
91
                    self.Alpha_pos = self.Positions[i]
92
93
                if ((Fit > self.Alpha_score) and (Fit < self.Beta_score)):
94
                    self.Beta_score = Fit
95
                    self.Beta_pos = self.Positions[i]
96
97
                if ((Fit > self.Alpha_score) and (Fit > self.Beta_score) and
98
                        (Fit < self.Delta_score)):
99
                    self.Delta_score = Fit
100
                    self.Delta_pos = self.Positions[i]
101
102
            a = 2 - self.evaluations * ((2) / self.nFES)
103
104
            for i in range(self.NP):
105
                for j in range(self.D):
106
107
                    r1 = random.random()
108
                    r2 = random.random()
109
110
                    A1 = 2 * a * r1 - a
111
                    C1 = 2 * r2
112
113
                    D_alpha = abs(
114
                        C1 * self.Alpha_pos[j] - self.Positions[i][j])
115
                    X1 = self.Alpha_pos[j] - A1 * D_alpha
116
117
                    r1 = random.random()
118
                    r2 = random.random()
119
120
                    A2 = 2 * a * r1 - a
121
                    C2 = 2 * r2
122
123
                    D_beta = abs(C2 * self.Beta_pos[j] - self.Positions[i][j])
124
                    X2 = self.Beta_pos[j] - A2 * D_beta
125
126
                    r1 = random.random()
127
                    r2 = random.random()
128
129
                    A3 = 2 * a * r1 - a
130
                    C3 = 2 * r2
131
132
                    D_delta = abs(
133
                        C3 * self.Delta_pos[j] - self.Positions[i][j])
134
                    X3 = self.Delta_pos[j] - A3 * D_delta
135
136
                    self.Positions[i][j] = (X1 + X2 + X3) / 3
137
138
        return self.Alpha_score
139
140
    def run(self):
141
        return self.move()
142