Calibrate Delft3D-FLOW Problem with PODSΒΆ
This is an demo to use the PODS in parallel for the calibraiton of the Delft3D problem with Single Objective Problem. The experiment setting is the same with example in Calibrate Delft3D-FLOW Problem with DYCORS in serial. Users just need to change the parameter nthreads to be the number of parallel processors that users want to use.
def main():
# -----------Initilizae logging-----------------#
if not os.path.exists("./logfiles"):
os.makedirs("logfiles")
if os.path.exists("./logfiles/test_simple.log"):
os.remove("./logfiles/test_simple.log")
logging.basicConfig(filename="./logfiles/test_simple.log",
level=logging.INFO)
# -----------Initilizae result saving-----------------#
if not os.path.exists("./result"):
os.makedirs("result")
""" histroy_data folder is needed when you need to
save the simultion output of each evaluation"""
if os.path.exists("./result/history_data"):
os.rmdir("./result/history_data")
if not os.path.exists("./result/history_data"):
os.makedirs("./result/history_data")
""" pysot_tesult.txt file is for saving the objective
function value and parameter vector of each evaluations"""
if os.path.exists("./result/pysot_result.txt"):
os.remove("./result/pysot_result.txt")
fp = open("./result/pysot_result.txt", "a")
fp.write("Iteration\tSimID\tObj\tParmaters\n")
fp.close()
# -----------set the threads and budget-----------------#
nthreads = 4 # set this to the nubmer of parallel processors that users want to use.
maxeval = 80
nsamples = nthreads
# (1) Initilize the Optimization problem
data = delft3d_flow(dim=4)
logging.info(data.info)
data.home_dir = '/Users/xiawei/Desktop/opdelft/examples/'
# (2) Experimental design
# Use a symmetric Latin hypercube with 2d + 1 samples
exp_des = SymmetricLatinHypercube(dim=data.dim, npts=12)
# (3) Surrogate model
# Use a cubic RBF interpolant with a linear tail
surrogate = RBFInterpolant(kernel=CubicKernel, tail=LinearTail, maxp=maxeval)
# (4) Adaptive sampling
adapt_samp = CandidateDYCORS(data=data, numcand=1000 * data.dim)
# (5) Use the multiprocessing-based sychronous strategy without non-bound constraints
strategy = SyncStrategyNoConstraintsMutipro(obj_func,
worker_id=0, data=data, maxeval=maxeval, nsamples=nsamples,
exp_design=exp_des, response_surface=surrogate,
sampling_method=adapt_samp)
# (6) Use the multiprocessing-based sychronous controller
controller = MultiproController()
controller.strategy = strategy
# Run the optimization strategy
result = controller.run()
print "result", result
if __name__ == "__main__":
main()