
نواصل دراسة طرق التحسين متعدد الأبعاد ، والخط التالي هو طريقة سرب الجسيمات ، التي تبحث عن حد أدنى عالمي.
النظرية
الخوارزمية بسيطة جدًا:

يتم حساب موضع كل جسيم في لحظة معينة بواسطة المعادلة:
أين - تنسيق أفضل حل لجسيم معين ، - تنسيق أفضل حل لجميع الجسيمات لهذا العصر ، و - عوامل الترجيح (مختارة لنموذج معين) ، هو معامل القصور الذاتي ، ويمكن جعله يعتمد على عدد الحقبة ، ثم سرعات الجسيمات سوف تتغير بسلاسة.
وظائف الاختبار
نظرًا لأنه من الجيد جدًا إلقاء نظرة على عمل الطريقة ، فسنحصل على المزيد من وظائف الاختبار:
مدسوس بعيداparabol(x) = sum(u->u*u, x)
وفي الواقع ، فإن مركز موارد المهاجرين نفسه:
function mdpso(; nparts = 50, ndimes = 2, ages = 50,
مع ذلك ، مع الحساب ، يستغرق الحساب وقتًا أطول ، لكنه أجمل:
using Plots pyplot() function ploter(l, u, xy, z, n_age ) contour(Xs, Ys, Zs, fill = true);

mdpso(C1 = [1.2 1.2], C2 = [1.1 1.1], Ac = [0.08 0.08], lower = [-4 -4], upper = [4 4], ages = 30)

fun = ekly mdpso(C1 = [1.7 1.7], C2 = [1.7 1.7], Ac = [0.07 0.07], lower = [-5 -5], upper = [5 5], ages = 15)


fun = himmelblau mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-5 -5], upper = [5 5], ages = 20, parts = 50)


fun = holdertable mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-10 -10], upper = [10 10], ages = 20, parts = 50)


fun = levy13 mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-10 -10], upper = [10 10], ages = 20, parts = 50)


fun = shaffer4 mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-100 -100], upper = [100 100], ages = 20, parts = 50)


إن ما يخفف حقًا هو التركيز على المعلمات وعنصر العشوائية: إن لم يكن الذباب يطير بالقرب من الحد الأدنى العالمي ، فإن هذا الأمر برمته قد يقع في محيط محلي:
fun = rastrigin mdpso(mdpso(C1 = [0.1 0.1], C2 = [1 1], Ac = [0.08 0.08], lover = low, upper = up, ages = 30))


نعم وقديم ليس جدا جيد روزنبروك لا يزال لا يسمح لفهم نفسه:
fun = rosenbrok mdpso(C1 = [1.7 1.7], C2 = [1.5 1.5], Ac = [0.15 0.15], lover = low, upper = up, ages = 20, nparts = 50) ... Age № 20 xbest: 0.37796421341886866 0.12799160066705667 Fmin: 0.409026370833564


ولكن كما قلت سابقًا ، يمكنك استخدام FDM للبحث عن تقريب جيد للحد الأدنى العالمي ، ثم تحديد ، على سبيل المثال ، Nelder-Mead:
طريقة البسيط vecl(x) = sqrt( sum(u -> u*u, x) ) function sortcoord(Mx) N = size(Mx,2) f = [fun(Mx[:,i]) for i in 1:N]
ofNelderMid(fit = [0.37796 0.127992]) ... 92 0.00022610400555036366 [1.0, 1.0] 93 0.00015987967588703512 [1.0, 1.0] 94 0.00011305200343052599 [1.0, 1.0] 2-element Array{Float64,1}: 0.9999999996645973 0.9999999995466575
بالنسبة إلى MFC الكلاسيكي ، ليس كل شيء واضحًا مع معيار التوقف: يمكن أن تكون النقطة الأفضل هي موضع عدة عصور ، كما لا يمكن تغيير المسافات بين بعض الجزيئات لفترة طويلة. لذلك ، يتم استخدام حد لعدد العصور. لزيادة فرص العثور على الحد الأدنى العالمي ، من الضروري زيادة عدد الجسيمات والعهود ، وهي مكلفة للغاية من حيث الذاكرة والوقت الإضافي (لا نكتة ، 50 مكالمة من الوظيفة الهدف لكل بعد في كل تكرار).
الأخلاقية
- إذا كنت لا تريد أو لا يمكنك استخدام الأساليب المعقدة والحديثة ، يمكنك استخدام تركيبات طريقة أكثر بساطة
- في كثير من الأحيان للمشكلة هناك طريقة شحذ ضيق (على سبيل المثال ، لوظائف الوديان)
- من المستحسن أن يكون هناك العديد من المكاتب الإدارية المختلفة من أجل مقارنة متسقة
- ليس من الممكن دائمًا وضع مهمتك في الطريقة والحصول على الإجابة الصحيحة فورًا - يجب أن تقضي وقتًا في البحث ، وتغيير المعلمات ، إذا لم تتمكن من عرض الإغاثة ، فيجب عليك على الأقل طباعة الحسابات الوسيطة من أجل تتبع التقارب.
هذا كل شيء لهذا اليوم ، شكرا لك على اهتمامك وأتمنى لكم كل التوفيق!