{"id":12568,"date":"2019-02-19T11:30:19","date_gmt":"2019-02-19T11:30:19","guid":{"rendered":"http:\/\/stblog.lunaeme.com\/?p=12568"},"modified":"2023-09-20T15:33:04","modified_gmt":"2023-09-20T15:33:04","slug":"swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization","status":"publish","type":"post","link":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/","title":{"rendered":"Swarm Intelligence Metaheuristics, part 2: Particle Swarm Optimization"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization! In <\/span><a href=\"http:\/\/blog.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-1-ant-colony-optimization\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">part 1<\/span><\/a><span style=\"font-weight: 400;\">, we talked about a family of metaheuristic algorithms known generically as Ant Colony Optimization (ACO), which were specially well-suited for combinatorial optimization problems, i.e. finding the best combination of values of many categorical variables. Recall we define Metaheuristics as a class of optimization algorithms which turn out to be very useful when the function being optimized is non-differentiable or does not have an analytical expression at all.<\/span><\/p>\n<p><!--more--><\/p>\n<p><span style=\"font-weight: 400;\">We had framed ACO in the broader context of Swarm Intelligence, a yet-more-general family of algorithms able to solve hard optimization problems by a set of very simple cooperative agents and the appropriate communication rules between them, which together exhibit intelligent behaviour. In this post, we focus on another subclass of Swarm Intelligence algorithms, known as Particle Swarm Optimization (PSO), <\/span><a href=\"https:\/\/www.cs.tufts.edu\/comp\/150GA\/homeworks\/hw3\/_reading6%201995%20particle%20swarming.pdf\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">first published in 1995<\/span><\/a><span style=\"font-weight: 400;\"> at Univ. of Washington and Indianapolis [1]. <\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Particle Swarm Optimization<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Like ants, birds are another example of social animals which rely on each other to solve problems. But differently from ants, they are not blind so they can see each other and interact directly: a flying bird knows the position of its nearest birds. When searching for food, a bird does not know the exact location of the food but can perceive the distance to it. Ideally every bird would trust its neighbour birds if they are closer to the food.<\/span><\/p>\n<figure id=\"attachment_12577\" aria-describedby=\"caption-attachment-12577\" style=\"width: 1080px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-12577 size-full\" src=\"http:\/\/blog.stratio.com\/wp-content\/uploads\/2019\/02\/Flock-of-birds.jpg\" alt=\"\" width=\"1080\" height=\"600\" \/><figcaption id=\"caption-attachment-12577\" class=\"wp-caption-text\">Figure 1. Flock of birds showing a curved trajectory generated by following the neighbours<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">In a function optimization context, each bird is represented by a particle moving along the optimization space (which we assume either \u211d<\/span><span style=\"font-weight: 400;\"><sup>n<\/sup> <\/span><span style=\"font-weight: 400;\"> with <\/span><i><span style=\"font-weight: 400;\">n <\/span><\/i><span style=\"font-weight: 400;\">the number of variables being optimized, or a bounded subset of it). We initialize a number of particles (this number is problem-dependent and has to be tuned) spread along the space (Fig. 2), either randomly placed or following a uniform grid covering the feasible space in case it is bounded. Each particle is located at some point, which is a solution to the problem (not necessarily optimal) and it is in continuous movement during the algorithm, always exploring other solutions.<\/span><\/p>\n<figure id=\"attachment_12698\" aria-describedby=\"caption-attachment-12698\" style=\"width: 1080px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-12698 size-full\" src=\"http:\/\/blog.stratio.com\/wp-content\/uploads\/2019\/02\/imag-3.jpg\" alt=\"\" width=\"1080\" height=\"600\" \/><figcaption id=\"caption-attachment-12698\" class=\"wp-caption-text\">Figure 2. Particle initialization: spread along the search space<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">While ACO algorithms follow a constructive approach (each ant needs several steps to build a solution, which consists of a sequence of decisions of candidate values, one for each variable), each particle in PSO represents already a full solution in \u211d<sup>n<\/sup><\/span><span style=\"font-weight: 400;\">. In contrast with classical techniques like gradient descent, the particles do not use an analytical expression of the function to decide where to move next (as such expression might not even exist), but only the quality of the solutions of their neighbours. Such neighbour solutions are known to the particle. In addition, PSO is used mainly for continuous optimization problems, while ACO works best in combinatorial optimization (although continuous variants also exist).<\/span><\/p>\n<p><b><br \/>\nParticles initialization and movement in PSO<\/b><\/p>\n<p><span style=\"font-weight: 400;\">We could somehow assume that a bird\u2019s movement is guided by its current velocity (as it cannot turn suddenly), the position of its neighbours and how desirable each of the neighbour positions are, which is the analogy of the quality of the solutions found by such neighbours.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">More formally, each particle <\/span><i><span style=\"font-weight: 400;\">i<\/span><\/i><span style=\"font-weight: 400;\"> stores:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">A position <\/span><i><span style=\"font-weight: 400;\">x<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i<\/sub><\/span><\/i><span style=\"font-weight: 400;\"> \u2208 \u211d<sup>n<\/sup><\/span><span style=\"font-weight: 400;\">\u00a0<\/span><span style=\"font-weight: 400;\">which represents a solution<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">A velocity vector <\/span><i><span style=\"font-weight: 400;\">v<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i\u00a0<\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u2208 \u211d<sup>n<\/sup><\/span>\u00a0<span style=\"font-weight: 400;\">representing its movement<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">A real value <\/span><i><span style=\"font-weight: 400;\">fitness<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i\u00a0<\/sub><\/span><\/i><span style=\"font-weight: 400;\">representing the value of the function at this point: <\/span><i><span style=\"font-weight: 400;\">fitness<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i<\/sub><\/span><\/i><i><\/i>\u00a0<span style=\"font-weight: 400;\">= f(<\/span><i><span style=\"font-weight: 400;\">x<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i<\/sub><\/span><\/i><i><\/i><span style=\"font-weight: 400;\">). Recall f does not need to have a mathematical expression, it could be just a procedural function written in some programming language.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Its best solution found so far, <\/span><i><span style=\"font-weight: 400;\">pBest<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i<\/sub><\/span><\/i><i><\/i><span style=\"font-weight: 400;\">\u00a0\u2208 \u211d<sup>n<\/sup><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">The fitness of its best solution, <\/span><i><span style=\"font-weight: 400;\">pBest_fitness<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i<\/sub><\/span><\/i><i><\/i>\u00a0<span style=\"font-weight: 400;\">= f(<\/span><i><span style=\"font-weight: 400;\">pBest<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i<\/sub><\/span><\/i><i><\/i><span style=\"font-weight: 400;\">)<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Therefore, for <\/span><i><span style=\"font-weight: 400;\">i <\/span><\/i><span style=\"font-weight: 400;\">= 1 \u2026 M (where M is the number of particles), the initial positions x<\/span><i><span style=\"font-weight: 400;\"><sub>i\u00a0<\/sub><\/span><\/i><span style=\"font-weight: 400;\">and the initial velocities <\/span><i><span style=\"font-weight: 400;\">v<\/span><\/i><i><span style=\"font-weight: 400;\"><sub>i\u00a0\u00a0<\/sub><\/span><\/i><i><\/i><span style=\"font-weight: 400;\">of the particles are randomly initialized. Velocities should belong to an interval [-Vmax, Vmax]. The algorithm then updates the positions of the particles iteratively by applying the formulas:<\/span><\/p>\n<p style=\"text-align: left;\"><i><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 v<sub>i<sup>(t+1)<\/sup><\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0= <\/span><i><span style=\"font-weight: 400;\">v<sub>i<sup>(t)<\/sup><\/sub><\/span><\/i>\u00a0<span style=\"font-weight: 400;\">+ ?<i><sub>1<\/sub><\/i><\/span>\u00a0<span style=\"font-weight: 400;\">rand(n) .* (<\/span><i><span style=\"font-weight: 400;\">pBest<sub>i<\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0&#8211; <\/span><i><span style=\"font-weight: 400;\">x<sub>i<\/sub><\/span><\/i><i><span style=\"font-weight: 400;\"><sub><sup>(t)<\/sup><\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0) + ?<i><sub>2<\/sub><\/i><\/span>\u00a0<span style=\"font-weight: 400;\">rand(n) .* (<\/span><i><span style=\"font-weight: 400;\">iBest<sub>i<\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0&#8211; <\/span><i><span style=\"font-weight: 400;\">x<sub>i<\/sub><\/span><\/i><i><span style=\"font-weight: 400;\"><sub><sup>(t)<\/sup><\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0)<br \/>\n<\/span><i><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 x<sub>i<\/sub><\/span><\/i> <i><span style=\"font-weight: 400;\"><sub><sup>(t+1)<\/sup><\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0= <\/span><i><span style=\"font-weight: 400;\">x<sub>i<\/sub><\/span><\/i><i><span style=\"font-weight: 400;\"><sub><sup>(t)<\/sup><\/sub><\/span><\/i>\u00a0<span style=\"font-weight: 400;\">+ <\/span><i><span style=\"font-weight: 400;\">v<sub>i<sup>(t+1)<\/sup><\/sub><\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">Here, rand(n) \u2208 [0,1]<sup>n<\/sup><\/span><span style=\"font-weight: 400;\">\u00a0is a random vector of <\/span><i><span style=\"font-weight: 400;\">n<\/span><\/i><span style=\"font-weight: 400;\"> dimensions drawn from <\/span><i><span style=\"font-weight: 400;\">n <\/span><\/i><span style=\"font-weight: 400;\">uniform distributions U[0,1], and .* represents element-wise vector multiplication. Coefficients ?<span style=\"font-size: 11.6667px;\"><i><sub>1<\/sub><\/i><\/span><\/span><span style=\"font-weight: 400;\">\u00a0and ?<span style=\"font-size: 11.6667px;\"><i><sub>2<\/sub><\/i><\/span><\/span><span style=\"font-weight: 400;\">\u00a0are constant and stand for the weights given to the <\/span><b>cognitive<\/b><span style=\"font-weight: 400;\"> and the <\/span><b>social<\/b><span style=\"font-weight: 400;\"> component, respectively, whereas <\/span><i><span style=\"font-weight: 400;\">iBest<sub>i<\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0represents the <\/span><i><span style=\"font-weight: 400;\">best solution found by the neighbourhood of i<\/span><\/i><span style=\"font-weight: 400;\">. Another variant of the algorithm uses <\/span><i><span style=\"font-weight: 400;\">gBest <\/span><\/i><span style=\"font-weight: 400;\">instead, which stands for the <\/span><i><span style=\"font-weight: 400;\">global best solution<\/span><\/i><span style=\"font-weight: 400;\"> found so far by the whole population. In that case, <\/span><i><span style=\"font-weight: 400;\">iBest <\/span><\/i><span style=\"font-weight: 400;\">would be replaced by <\/span><i><span style=\"font-weight: 400;\">gBest<\/span><\/i><span style=\"font-weight: 400;\"> in the first equation. The diagram below represents the above equations as a graphical sum of vectors.\u00a0<\/span><\/p>\n<figure id=\"attachment_12700\" aria-describedby=\"caption-attachment-12700\" style=\"width: 1080px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-12700 size-full\" src=\"http:\/\/blog.stratio.com\/wp-content\/uploads\/2019\/02\/img-5.jpg\" alt=\"\" width=\"1080\" height=\"600\" \/><figcaption id=\"caption-attachment-12700\" class=\"wp-caption-text\">Figure 3. The update of a particle\u2019s position as a sum of vectors<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Finally, the particle must update <\/span><i><span style=\"font-weight: 400;\">iBest<sub>i<\/sub><\/span><\/i>\u00a0<span style=\"font-weight: 400;\">after each iteration (or alternatively, every particle must update the global variable <\/span><i><span style=\"font-weight: 400;\">gBest<\/span><\/i><span style=\"font-weight: 400;\"> whenever they find a better <\/span><i><span style=\"font-weight: 400;\">pBest<sub>i<\/sub><\/span><\/i><span style=\"font-weight: 400;\">, in case we are using the global variant). The algorithm repeats this process until a maximum number of calls to the fitness function f() is reached.<\/span><\/p>\n<p><b><br \/>\nPSO pseudocode (local neighbourhood variant)<\/b><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0INPUT:<br \/>\n<\/span><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0M: number of particles of the swarm<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 OUTPUT:<br \/>\n<\/span><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 best solution found by any particle of the swarm<\/span><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\">Initialization step:<br \/>\n<\/span>For t := 0 to M<br \/>\nInitialize <i>x<sub>i<\/sub><\/i>\u00a0and <i>v<sub>i<\/sub><\/i>\u00a0randomly<\/li>\n<li><span style=\"font-weight: 400;\">While(there are fitness evaluations remaining)<br \/>\n<\/span><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0a) t := t+1<br \/>\n<\/span><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0b) For i :=1 to M<br \/>\n<\/span><i>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0fitness<sub>i<\/sub><\/i>\u00a0= <i>f <\/i>(<i>x<sub>i<\/sub><\/i>)\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0# evaluate <i>x<sub>i<br \/>\n<\/sub><\/i>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0IF <i>fitness<sub>i<\/sub><\/i>\u00a0IS BETTER THAN <i>pBest_fitness<sub>i<\/sub><\/i>\u00a0THEN<br \/>\n<i>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0pBest<sub>i<\/sub><\/i>\u00a0:= <i>x<sub>i<br \/>\n<\/sub><\/i><i>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0pBest_fitness<sub>i<\/sub><\/i>\u00a0:= <i>fitness<sub>i<\/sub><\/i><\/li>\n<li><span style=\"font-weight: 400;\">For i := 1 to M<br \/>\n<i>v<sub>i<\/sub><\/i> <i><sub><sup>(t+1)<\/sup><\/sub><\/i>\u00a0:= <i>v<sub>i<sup>(t)<\/sup><\/sub><\/i>\u00a0+ ?<i><sub>1<\/sub><\/i>\u00a0rand(n) .* (<i>pBest<sub>i<\/sub><\/i>\u00a0&#8211; <i>x<sub>i<sup>(t)<\/sup><\/sub><\/i>\u00a0) + ?<\/span><span style=\"font-weight: 400;\"><i><sub>2\u00a0<\/sub><\/i><\/span><span style=\"font-weight: 400;\">rand(n) .* (<i>gBest<\/i> &#8211; <i>x<sub>i<sup>(t)<\/sup><\/sub><\/i>\u00a0)<br \/>\n<\/span><i><span style=\"font-weight: 400;\">x<sub>i<\/sub><\/span><\/i> <i><span style=\"font-weight: 400;\"><sub><sup>(t+1)<\/sup><\/sub><\/span><\/i><span style=\"font-weight: 400;\">\u00a0:= <\/span><i><span style=\"font-weight: 400;\">x<sub>i<\/sub><\/span><\/i><i><span style=\"font-weight: 400;\"><sub><sup>(t)<\/sup><\/sub><\/span><\/i>\u00a0<span style=\"font-weight: 400;\">+ <\/span><i><span style=\"font-weight: 400;\">v<sub>i<\/sub><\/span><\/i><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><i><sub><sup>(t+1)<\/sup><\/sub><\/i>\u00a0<\/span><\/span><\/li>\n<li><span style=\"font-weight: 400;\">RETURN <i><i>gBest<\/i><\/i><\/span><\/li>\n<\/ol>\n<h2><span style=\"font-weight: 400;\">PSO parameter tuning<\/span><i><i><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/i><\/i><\/h2>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Swarm size M: between 20 and 40 particles. 10 particles for simple problems, and between 100 and 200 for very complex ones.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Maximum velocity: Vmax is set according to the range of each variable<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Update ratios: generally ?<i><sub>1<\/sub><\/i><\/span><span style=\"font-weight: 400;\">\u00a0= ?<i><sub>2<\/sub><\/i><\/span><span style=\"font-weight: 400;\">\u00a0= 2<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Local vs Global PSO: the global version converges faster but tends to get trapped in local optima more easily.<\/span><\/li>\n<\/ul>\n<p><b><br \/>\nA note on the neighbourhoods for the local variant<\/b><\/p>\n<p><span style=\"font-weight: 400;\">We have to define which particles are part of the neighbourhood. In the above pseudocode, this is represented by the call to best_particle_in_neighbourhood(i). There are two options (Fig. 4):<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Geographic neighbourhood: compute the distance to all the other particles and take the closest ones. This means the neighbourhood changes between iterations as the particles move during the algorithm.<\/span><\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Social neighbourhood: a list of neighbours is defined for each particle at the beginning of the algorithm, and the lists do not change during the algorithm, no matter the relative positions of the particles. It is the most common neighbourhood. Very often, a ring structure is formed as a social neighbourhood. Particles are numbered just after initialization according to their positions, and a particle is assigned the particles that are consecutively before or after it in the numbered list.<br \/>\n<\/span><\/li>\n<\/ul>\n<figure id=\"attachment_12696\" aria-describedby=\"caption-attachment-12696\" style=\"width: 1080px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-12696 size-full\" src=\"http:\/\/blog.stratio.com\/wp-content\/uploads\/2019\/02\/post-image2.jpg\" alt=\"\" width=\"1080\" height=\"600\" \/><figcaption id=\"caption-attachment-12696\" class=\"wp-caption-text\">Figure 4. Examples of geographic and social neighbourhoods<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Neighbourhood size: usually 3 or 5 particles is enough. It is not a very important parameter.<\/span><\/p>\n<p><b><br \/>\nOther PSO variants proposed<\/b><\/p>\n<p><span style=\"font-weight: 400;\">It is very common that velocities grow too large and lead to a very fast movement along the space, missing good areas. It is important to set Vmax properly. Two variants have been proposed to remedy this problem: <\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Setting an explicit inertial factor<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Setting a coefficient K that reduces the velocity after each update:<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">K = 2 \/ | 2 &#8211; ? &#8211; sqrt(?<i><sub><sup>2<\/sup><\/sub><\/i><\/span><span style=\"font-weight: 400;\">\u00a0&#8211; 4?) | \u00a0where ? = ?<i><sub>1<\/sub><\/i><\/span><span style=\"font-weight: 400;\">\u00a0+ ?<i><sub>2<\/sub><\/i><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Another parameter for which variants have been proposed is the swarm size. It can be dynamically adapted as follows:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">If the quality of the neighbourhood has improved but the particle is the worst of its neighbourhood, the particle is destroyed (it dies).<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">If the particle is the best of its neighbourhood and there has been no improvement on the neighbourhood, a new particle is created from that particle.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">The decisions are made in a probabilistic way as a function of the current swarm size.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The neighbourhood size could also be adapted as a function of the swarm size. Finally, the weights ?<i><sub>1<\/sub><\/i><\/span><span style=\"font-weight: 400;\">\u00a0and ?<i><sub>2<\/sub><\/i><\/span><span style=\"font-weight: 400;\">\u00a0may also vary dynamically along the execution of the algorithm: the better the particle\u2019s personal best, the larger the weight of the cognitive component, and analogously, the better the neighbourhood best solution, the larger the weight to go towards it.<\/span><\/p>\n<h2>Applications of PSO<\/h2>\n<p><span style=\"font-weight: 400;\">PSO has been applied to a lot of optimization problems in engineering [2]. Many of them deal with finding the optimal distribution (positions) or setting for a device, for instance:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Optimal placement of electronic components in VLSI (integrated) circuits to minimize the manufacturing cost<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Job scheduling problems [3]<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Power plant and power systems optimization<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Power and water demand estimation [4]<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Radar and antenna optimization [5]<\/span><\/li>\n<\/ul>\n<h1><span style=\"font-weight: 400;\">References<\/span><\/h1>\n<p><span style=\"font-weight: 400;\">[1] Kennedy, J. and Eberhart, R. <\/span><a href=\"https:\/\/www.cs.tufts.edu\/comp\/150GA\/homeworks\/hw3\/_reading6%201995%20particle%20swarming.pdf\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Particle Swarm Optimization<\/span><\/a><span style=\"font-weight: 400;\">. Proc. of the IEEE International Conference on Neural Networks, 4:1942-1948 (1995).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">[2] Erdogmus, P. (Editor). <\/span><a href=\"https:\/\/www.intechopen.com\/books\/particle-swarm-optimization-with-applications\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Particle Swarm Optimization with Applications<\/span><\/a><span style=\"font-weight: 400;\">. IntechOpen (2018).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">[3] <\/span><span style=\"font-weight: 400;\">Ma, R. J., Yu, N. Y., and Hu, J.Y. <\/span><a href=\"https:\/\/www.hindawi.com\/journals\/tswj\/2013\/718345\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Application of Particle Swarm Optimization Algorithm in the Heating System Planning Problem<\/span><\/a><span style=\"font-weight: 400;\">. The Scientific World Journal, vol. 2013, Article ID 718345 (2013).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">[4] SaberChenari, K., Abghari, H., and Tabari, H. <\/span><a href=\"https:\/\/link.springer.com\/article\/10.1007\/s10661-016-5689-1\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Application of PSO algorithm in short-term optimization of reservoir operation<\/span><\/a><span style=\"font-weight: 400;\">. Environmental Monitoring and Assessment 188 (12):667 (2016). 10.1007\/s10661-016-5689-1. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">[5] Golbon-Haghighi, M.-H., Saeidi-Manesh, H., Zhang, G., and Zhang, Y. <\/span><a href=\"http:\/\/www.jpier.org\/PIERM\/pierm66\/09.18011016.pdf\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Pattern Synthesis for the Cylindrical Polarimetric Phased Array Radar (CPPAR)<\/span><\/a><span style=\"font-weight: 400;\">.<\/span> <span style=\"font-weight: 400;\">Progress In Electromagnetics Research M, 66:87-98 (2018).<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization. On this post, we will focus on Particle Swarm Optimization. Recall we define Metaheuristics as a class of optimization algorithms which turn out to be very useful when the function being optimized is non-differentiable or does not have an analytical expression at all.<\/p>\n","protected":false},"author":2,"featured_media":13503,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[686],"tags":[19],"ppma_author":[794],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.9 (Yoast SEO v22.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Metaheuristics - Swarm Intelligence - Part 2<\/title>\n<meta name=\"description\" content=\"Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization. On this post, we will focus on Particle Swarm Optimization.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Swarm Intelligence Metaheuristics, part 2: Particle Swarm Optimization\" \/>\n<meta property=\"og:description\" content=\"Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization. On this post, we will focus on Particle Swarm Optimization.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/\" \/>\n<meta property=\"og:site_name\" content=\"Stratio\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-19T11:30:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-20T15:33:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1300\" \/>\n\t<meta property=\"og:image:height\" content=\"820\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@stratiobd\" \/>\n<meta name=\"twitter:site\" content=\"@stratiobd\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/www.stratio.com\/blog\/#\/schema\/person\/af4f5fbbeb95bd7d55f79d9a677e615d\"},\"headline\":\"Swarm Intelligence Metaheuristics, part 2: Particle Swarm Optimization\",\"datePublished\":\"2019-02-19T11:30:19+00:00\",\"dateModified\":\"2023-09-20T15:33:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/\"},\"wordCount\":1579,\"publisher\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg\",\"keywords\":[\"Big Data\"],\"articleSection\":[\"Product\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/\",\"url\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/\",\"name\":\"Metaheuristics - Swarm Intelligence - Part 2\",\"isPartOf\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg\",\"datePublished\":\"2019-02-19T11:30:19+00:00\",\"dateModified\":\"2023-09-20T15:33:04+00:00\",\"description\":\"Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization. On this post, we will focus on Particle Swarm Optimization.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage\",\"url\":\"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg\",\"contentUrl\":\"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg\",\"width\":1300,\"height\":820},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.stratio.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Swarm Intelligence Metaheuristics, part 2: Particle Swarm Optimization\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.stratio.com\/blog\/#website\",\"url\":\"https:\/\/www.stratio.com\/blog\/\",\"name\":\"Stratio Blog\",\"description\":\"Corporate blog\",\"publisher\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.stratio.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.stratio.com\/blog\/#organization\",\"name\":\"Stratio\",\"url\":\"https:\/\/www.stratio.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.stratio.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/stratio.com\/blog\/wp-content\/uploads\/2020\/06\/stratio-web-logo-1.png\",\"contentUrl\":\"https:\/\/stratio.com\/blog\/wp-content\/uploads\/2020\/06\/stratio-web-logo-1.png\",\"width\":260,\"height\":55,\"caption\":\"Stratio\"},\"image\":{\"@id\":\"https:\/\/www.stratio.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/stratiobd\",\"https:\/\/es.linkedin.com\/company\/stratiobd\",\"https:\/\/www.youtube.com\/c\/StratioBD\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.stratio.com\/blog\/#\/schema\/person\/af4f5fbbeb95bd7d55f79d9a677e615d\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.stratio.com\/blog\/#\/schema\/person\/image\/589aaf4b404b1fe099b09564062c4563\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9b181ae4395243dccaf1c3e3a4749d81?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9b181ae4395243dccaf1c3e3a4749d81?s=96&d=mm&r=g\",\"caption\":\"admin\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Metaheuristics - Swarm Intelligence - Part 2","description":"Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization. On this post, we will focus on Particle Swarm Optimization.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/","og_locale":"en_US","og_type":"article","og_title":"Swarm Intelligence Metaheuristics, part 2: Particle Swarm Optimization","og_description":"Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization. On this post, we will focus on Particle Swarm Optimization.","og_url":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/","og_site_name":"Stratio","article_published_time":"2019-02-19T11:30:19+00:00","article_modified_time":"2023-09-20T15:33:04+00:00","og_image":[{"width":1300,"height":820,"url":"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_creator":"@stratiobd","twitter_site":"@stratiobd","twitter_misc":{"Written by":"admin","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#article","isPartOf":{"@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/"},"author":{"name":"admin","@id":"https:\/\/www.stratio.com\/blog\/#\/schema\/person\/af4f5fbbeb95bd7d55f79d9a677e615d"},"headline":"Swarm Intelligence Metaheuristics, part 2: Particle Swarm Optimization","datePublished":"2019-02-19T11:30:19+00:00","dateModified":"2023-09-20T15:33:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/"},"wordCount":1579,"publisher":{"@id":"https:\/\/www.stratio.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg","keywords":["Big Data"],"articleSection":["Product"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/","url":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/","name":"Metaheuristics - Swarm Intelligence - Part 2","isPartOf":{"@id":"https:\/\/www.stratio.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage"},"image":{"@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg","datePublished":"2019-02-19T11:30:19+00:00","dateModified":"2023-09-20T15:33:04+00:00","description":"Welcome back to our series on Swarm Intelligence Metaheuristics for Optimization. On this post, we will focus on Particle Swarm Optimization.","breadcrumb":{"@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#primaryimage","url":"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg","contentUrl":"https:\/\/www.stratio.com\/blog\/wp-content\/uploads\/2019\/02\/swarm.jpg","width":1300,"height":820},{"@type":"BreadcrumbList","@id":"https:\/\/www.stratio.com\/blog\/swarm-intelligence-metaheuristics-part-2-particle-swarm-optimization\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.stratio.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Swarm Intelligence Metaheuristics, part 2: Particle Swarm Optimization"}]},{"@type":"WebSite","@id":"https:\/\/www.stratio.com\/blog\/#website","url":"https:\/\/www.stratio.com\/blog\/","name":"Stratio Blog","description":"Corporate blog","publisher":{"@id":"https:\/\/www.stratio.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.stratio.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.stratio.com\/blog\/#organization","name":"Stratio","url":"https:\/\/www.stratio.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.stratio.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/stratio.com\/blog\/wp-content\/uploads\/2020\/06\/stratio-web-logo-1.png","contentUrl":"https:\/\/stratio.com\/blog\/wp-content\/uploads\/2020\/06\/stratio-web-logo-1.png","width":260,"height":55,"caption":"Stratio"},"image":{"@id":"https:\/\/www.stratio.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/stratiobd","https:\/\/es.linkedin.com\/company\/stratiobd","https:\/\/www.youtube.com\/c\/StratioBD"]},{"@type":"Person","@id":"https:\/\/www.stratio.com\/blog\/#\/schema\/person\/af4f5fbbeb95bd7d55f79d9a677e615d","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.stratio.com\/blog\/#\/schema\/person\/image\/589aaf4b404b1fe099b09564062c4563","url":"https:\/\/secure.gravatar.com\/avatar\/9b181ae4395243dccaf1c3e3a4749d81?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9b181ae4395243dccaf1c3e3a4749d81?s=96&d=mm&r=g","caption":"admin"}}]}},"authors":[{"term_id":794,"user_id":2,"is_guest":0,"slug":"admin","display_name":"admin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/9b181ae4395243dccaf1c3e3a4749d81?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/posts\/12568"}],"collection":[{"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/comments?post=12568"}],"version-history":[{"count":40,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/posts\/12568\/revisions"}],"predecessor-version":[{"id":15714,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/posts\/12568\/revisions\/15714"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/media\/13503"}],"wp:attachment":[{"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/media?parent=12568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/categories?post=12568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/tags?post=12568"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.stratio.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=12568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}