22
33import numpy as np
44
5+ from typing import Literal
6+
57from .sce_ua import SCE_UA
68from ..base import AlgorithmABC , Verbose
79from ..population import Population
@@ -19,10 +21,10 @@ class ASMO(AlgorithmABC):
1921
2022 Attributes:
2123 problem: Problem
22- The problem to solve, which includes attributes like n_input , ub, lb, and evaluate.
24+ The problem to solve, which includes attributes like nInput , ub, lb, and evaluate.
2325 surrogate: Surrogate
2426 The surrogate model to use for optimization.
25- n_init : int, default=50
27+ nInit : int, default=50
2628 Number of initial samples for surrogate modeling.
2729
2830 Methods:
@@ -41,6 +43,7 @@ class ASMO(AlgorithmABC):
4143 def __init__ (self , nInit : int = 50 ,
4244 surrogate : SurrogateABC = None ,
4345 optimizer : AlgorithmABC = None ,
46+ euclidThres : float = 1e-5 ,
4447 maxFEs : int = 1000 ,
4548 maxIters : int = 1000 ,
4649 maxTolerates : int = None ,
@@ -52,6 +55,7 @@ def __init__(self, nInit: int = 50,
5255 :param surrogate: Surrogate model to use. Defaults to Kriging if None.
5356 :param optimizer: Optimizer to use. Defaults to SCE_UA if None.
5457 :param maxFEs: Maximum number of function evaluations.
58+ :param euclidThres: Threshold for euclidean distance. Defaults to 1e-6.
5559 :param maxTolerateTimes: Maximum number of tolerated iterations without improvement.
5660 :param verbose: Flag to enable verbose output.
5761 :param verboseFreq: Frequency of verbose output.
@@ -63,6 +67,7 @@ def __init__(self, nInit: int = 50,
6367 verboseFlag = verboseFlag , verboseFreq = verboseFreq , logFlag = logFlag , saveFlag = saveFlag )
6468
6569 self .setParaVal ('nInit' , nInit )
70+ self .setParaVal ('euclidThres' , euclidThres )
6671
6772 if surrogate is None :
6873 # Default surrogate model is Kriging with standard scaling
@@ -73,7 +78,7 @@ def __init__(self, nInit: int = 50,
7378
7479 if optimizer is None :
7580 # Default optimizer is SCE_UA
76- optimizer = SCE_UA (maxFEs = 5000 , verboseFlag = False , saveFlag = False , logFlag = False )
81+ optimizer = SCE_UA (maxFEs = 5000 , verboseFlag = False , saveFlag = False , logFlag = False )
7782
7883 self .optimizer = optimizer
7984 self .optimizer .verboseFlag , self .optimizer .logFlag , self .optimizer .saveFlag = False , False , False
@@ -100,6 +105,7 @@ def run(self, problem, xInit = None, yInit = None, seed = None, oneStep = False)
100105
101106 # Initialization
102107 nInit = self .getParaVal ('nInit' )
108+ euclidThres = self .getParaVal ('euclidThres' )
103109
104110 # Define a subproblem using the surrogate model
105111 subProblem = Problem (objFunc = self .surrogate .predict , nInput = problem .nInput ,
@@ -132,7 +138,16 @@ def run(self, problem, xInit = None, yInit = None, seed = None, oneStep = False)
132138
133139 # Evaluate the offspring
134140 bestDecs = np .asarray (res ["result" ]["bestDecs" ].data )
135- offSpring = Population (decs = bestDecs )
141+
142+ euclidDist = np .linalg .norm (bestDecs - pop .decs , axis = 1 )
143+ minEuclidDist = np .min (euclidDist )
144+
145+ if minEuclidDist < euclidThres :
146+ decs = np .random .uniform (problem .lb , problem .ub , size = (1 , problem .nInput ))
147+ else :
148+ decs = bestDecs
149+
150+ offSpring = Population (decs = decs )
136151
137152 self .evaluate (offSpring )
138153
0 commit comments