Code Duplication    Length = 47-47 lines in 2 locations

NiaPy/algorithms/other/mts.py 2 locations

@@ 64-110 (lines=47) @@
61
		else: grade, improve, Xk_fit = grade + BONUS2, True, Xk_fit_new
62
	return Xk, Xk_fit, Xb, Xb_fit, improve, grade, SR
63
64
def MTS_LS1v1(Xk, Xk_fit, Xb, Xb_fit, improve, SR, task, BONUS1=10, BONUS2=1, sr_fix=0.4, rnd=rand, **ukwargs):
65
	r"""Multiple trajectory local search one version two.
66
67
	Args:
68
		Xk (numpy.ndarray): Current solution.
69
		Xk_fit (float): Current solutions fitness/function value.
70
		Xb (numpy.ndarray): Global best solution.
71
		Xb_fit (float): Global best solutions fitness/function value.
72
		improve (bool): Has the solution been improved.
73
		SR (numpy.ndarray): Search range.
74
		task (Task): Optimization task.
75
		BONUS1 (int): Bonus reward for improving global best solution.
76
		BONUS2 (int): Bonus reward for improving solution.
77
		sr_fix (numpy.ndarray): Fix when search range is to small.
78
		rnd (mtrand.RandomState): Random number generator.
79
		**ukwargs (Dict[str, Any]): Additional arguments.
80
81
	Returns:
82
		Tuple[numpy.ndarray, float, numpy.ndarray, float, bool, numpy.ndarray]:
83
			1. New solution.
84
			2. New solutions fitness/function value.
85
			3. Global best if found else old global best.
86
			4. Global bests function/fitness value.
87
			5. If solution has improved.
88
			6. Search range.
89
	"""
90
	if not improve:
91
		SR /= 2
92
		ifix = where(SR < 1e-15)
93
		SR[ifix] = task.bRange[ifix] * sr_fix
94
	improve, D, grade = False, rnd.uniform(-1, 1, task.D), 0.0
95
	for i in range(len(Xk)):
96
		Xk_i_old = Xk[i]
97
		Xk[i] = Xk_i_old - SR[i] * D[i]
98
		Xk = task.repair(Xk, rnd)
99
		Xk_fit_new = task.eval(Xk)
100
		if Xk_fit_new < Xb_fit: grade, Xb, Xb_fit = grade + BONUS1, Xk, Xk_fit_new
101
		elif Xk_fit_new == Xk_fit: Xk[i] = Xk_i_old
102
		elif Xk_fit_new > Xk_fit:
103
			Xk[i] = Xk_i_old + 0.5 * SR[i]
104
			Xk = task.repair(Xk, rnd)
105
			Xk_fit_new = task.eval(Xk)
106
			if Xk_fit_new < Xb_fit: grade, Xb, Xb_fit = grade + BONUS1, Xk, Xk_fit_new
107
			if Xk_fit_new >= Xk_fit: Xk[i] = Xk_i_old
108
			else: grade, improve, Xk_fit = grade + BONUS2, True, Xk_fit_new
109
		else: grade, improve, Xk_fit = grade + BONUS2, True, Xk_fit_new
110
	return Xk, Xk_fit, Xb, Xb_fit, improve, grade, SR
111
112
def genNewX(x, r, d, SR, op):
113
	r"""Move solution to other position based on operator.
@@ 16-62 (lines=47) @@
13
14
__all__ = ['MultipleTrajectorySearch', 'MultipleTrajectorySearchV1', 'MTS_LS1', 'MTS_LS1v1', 'MTS_LS2', 'MTS_LS3', 'MTS_LS3v1']
15
16
def MTS_LS1(Xk, Xk_fit, Xb, Xb_fit, improve, SR, task, BONUS1=10, BONUS2=1, sr_fix=0.4, rnd=rand, **ukwargs):
17
	r"""Multiple trajectory local search one.
18
19
	Args:
20
		Xk (numpy.ndarray): Current solution.
21
		Xk_fit (float): Current solutions fitness/function value.
22
		Xb (numpy.ndarray): Global best solution.
23
		Xb_fit (float): Global best solutions fitness/function value.
24
		improve (bool): Has the solution been improved.
25
		SR (numpy.ndarray): Search range.
26
		task (Task): Optimization task.
27
		BONUS1 (int): Bonus reward for improving global best solution.
28
		BONUS2 (int): Bonus reward for improving solution.
29
		sr_fix (numpy.ndarray): Fix when search range is to small.
30
		rnd (mtrand.RandomState): Random number generator.
31
		**ukwargs (Dict[str, Any]): Additional arguments.
32
33
	Returns:
34
		Tuple[numpy.ndarray, float, numpy.ndarray, float, bool, numpy.ndarray]:
35
			1. New solution.
36
			2. New solutions fitness/function value.
37
			3. Global best if found else old global best.
38
			4. Global bests function/fitness value.
39
			5. If solution has improved.
40
			6. Search range.
41
	"""
42
	if not improve:
43
		SR /= 2
44
		ifix = where(SR < 1e-15)
45
		SR[ifix] = task.bRange[ifix] * sr_fix
46
	improve, grade = False, 0.0
47
	for i in range(len(Xk)):
48
		Xk_i_old = Xk[i]
49
		Xk[i] = Xk_i_old - SR[i]
50
		Xk = task.repair(Xk, rnd)
51
		Xk_fit_new = task.eval(Xk)
52
		if Xk_fit_new < Xb_fit: grade, Xb, Xb_fit = grade + BONUS1, Xk, Xk_fit_new
53
		if Xk_fit_new == Xk_fit: Xk[i] = Xk_i_old
54
		elif Xk_fit_new > Xk_fit:
55
			Xk[i] = Xk_i_old + 0.5 * SR[i]
56
			Xk = task.repair(Xk, rnd)
57
			Xk_fit_new = task.eval(task.repair(Xk, rnd))
58
			if Xk_fit_new < Xb_fit: grade, Xb, Xb_fit = grade + BONUS1, copy(Xk), Xk_fit_new
59
			if Xk_fit_new >= Xk_fit: Xk[i] = Xk_i_old
60
			else: grade, improve, Xk_fit = grade + BONUS2, True, Xk_fit_new
61
		else: grade, improve, Xk_fit = grade + BONUS2, True, Xk_fit_new
62
	return Xk, Xk_fit, Xb, Xb_fit, improve, grade, SR
63
64
def MTS_LS1v1(Xk, Xk_fit, Xb, Xb_fit, improve, SR, task, BONUS1=10, BONUS2=1, sr_fix=0.4, rnd=rand, **ukwargs):
65
	r"""Multiple trajectory local search one version two.