|
@@ 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. |