thieu1995 / mealpy

A Collection Of The State-of-the-art Metaheuristic Algorithms In Python (Metaheuristic/Optimizer/Nature-inspired/Biology)
https://mealpy.readthedocs.io
GNU General Public License v3.0
895 stars 184 forks source link

[FEAT]: Change Minimum pop_size? #101

Closed TianningGao closed 1 year ago

TianningGao commented 1 year ago

Description

I want to use several algorithms in this package with population size 8. I find out that the pop_size is limited by "validator.check_int()" function. If I change the range from [10, 10000] to [8, 10000], there would be other errors. For example, if I change the minimum pop_size from 10 to 8 in GA.py and run GA with pop_size set to 8, there will be errors like this:

File "/home/idwwwoqq808/workspace/chipyard/.conda-env/lib/python3.9/site-packages/mealpy/optimizer.py", line 283, in solve self.evolve(epoch) File "/home/idwwwoqq808/workspace/chipyard/.conda-env/lib/python3.9/site-packages/mealpy/evolutionary_based/GA.py", line 298, in evolve child1, child2 = self.selection_process__(list_fitness) File "/home/idwwwoqq808/workspace/chipyard/.conda-env/lib/python3.9/site-packages/mealpy/evolutionary_based/GA.py", line 132, in selection_process__ id_c1, id_c2 = self.get_index_kway_tournament_selection(self.pop, k_way=self.k_way, output=2) ValueError: not enough values to unpack (expected 2, got 1)

Is there a proper way to set pop_size to some value smaller than 10?

Additional Information

Here's my code to run GA:

def HyperSphere(x): print('*',end='') return np.sum(np.power(x,2))

problem_dict = { 'fit_func': HyperSphere, 'lb': [-5] 2, 'ub': [5] 2, 'minmax': 'min', 'log_to': None, 'save_population': True } ga_opt = GA.BaseGA(epoch=5, pop_size=8, pc=0.85, pm=0.1) best_X, best_Y = ga_opt.solve(problem_dict)

thieu1995 commented 1 year ago

Hi @TianningGao ,

My question is: what kind of problem are you trying to solve? Why would you use meta-heuristic algorithms (MHAs) to solve your problem? Which features of MHA make you think it is beneficial for solving your problem?

The population size (pop_size) limit that I designed here is 10 because it should be the minimum an algorithm needs to solve a problem. If your problem is too big (>1000 dimensions), there is no way you can solve it with a pop_size of 50, or even smaller than 10. If your problem is normal (3-1000 dimensions), using 10 solutions in each generation may be able to solve it. If you want fewer than 10 solutions, you need to increase the number of generations. If your problem is too small (1 or 2 dimensions), why would you use MHAs to solve it? Just use an exact algorithm.

Another reason is that several algorithms divide the population into clusters/groups/teams, and each team should have at least 3 members. Populations smaller than 10 solutions will not work with these algorithms.

Finally, some algorithms use k-way to select the solutions for the next generations. If 50% of 10 solutions is 5, and k_way is 0.4, then there will be 2 solutions to compare and select the best one. That sounds reasonable, right?

I recommend you set pop_size=10, and reduce the number of generations. Like in your example, epoch=5, pop_size=8 ==> Number of function evalutions can be 5x8=40. so you can set up like this epoch=4, pop_size=10 ==> NFE can be 4x10=40.

TianningGao commented 1 year ago

I'm trying to tune parameters of a software. The projected black-box function has 53 dimensions.

I'm researching on a new optimization method which restarts a given heuristic algorithm frequently. Currently, our new method would run 32 function evaluations, do something else, then set new starting points and restart optimization from beginning. I want the heuristic algorithm to run for not too few of generations so that I set the pop_size to 8.

Anyway, thank you so much for your explanation and advice. I'll give it a try with less generations.

thieu1995 commented 1 year ago

@TianningGao ,

Your problem has 53 dimensions so there is no way you can obtain good results with a pop_size of 8 and only a few generations. Don't fall into the trap; the results you get are actually just random solutions. You need more generations and a larger pop_size to take advantage of swarm intelligence in each algorithm.

TianningGao commented 1 year ago

OK, I see. Thank you so much.