You are on page 1of 35

‫[‪/https://arabicprogrammer.

com/article/8747352747 ]1‬‬

‫شرح مفصل للخوارزمية الجينية‬


‫يتضمن‪  :‬الخوارزمية الجينية‬

‫‪‬‬
‫‪o‬‬ ‫المبدأ األساسي للخوارزمية الجينية ‪1.‬‬
‫‪‬‬

‫‪‬‬ ‫أساسيات الخوارزميات الجينية ‪1.1‬‬

‫‪‬‬ ‫خطوات تنفيذ الخوارزمية الجينية ‪1.2‬‬

‫‪‬‬ ‫الترميز ‪1.‬‬

‫‪‬‬ ‫فك التشفير ‪2.‬‬

‫‪‬‬ ‫التزاوج ‪3.‬‬

‫‪‬‬ ‫الطفرة ‪4.‬‬

‫‪‬‬ ‫االنقالب ‪5.‬‬

‫‪‬‬ ‫تقييم اللياقة الفردية ‪6.‬‬

‫‪‬‬ ‫نسخ ‪7.‬‬


‫‪o‬‬ ‫للخوارزمية الجينية ‪ MATLAB‬برمجة ‪2.‬‬
‫‪‬‬

‫‪‬‬ ‫عملية تصميم البرنامج واختيار المعلمات ‪2.1‬‬

‫‪‬‬ ‫الكود الزائف ‪1.‬‬


‫‪‬‬ ‫مبادئ تصميم المعلمات من الخوارزمية الجينية ‪2.‬‬

‫‪‬‬ ‫تصميم وظيفة الخوارزمية الجينية اللياقة البدنية? ‪3.‬‬


‫‪o‬‬ ‫حالة تطبيق الخوارزمية الجينية ‪3.‬‬

‫المبدأ األساسي للخوارزمية الجينية ‪1.‬‬


‫أساسيات الخوارزميات الجينية ‪1.1‬‬

‫السكان هو الوحدة األساسية للتطور البيولوجي ‪ ،‬وجوهر التطور البيولوجي هو تغيير التكرار األساسي للسكان‪ .‬إن‬
‫الطفرات الجينية وإعادة التركيب الجيني ‪ ،‬واالختيار الطبيعي والعزلة هي الروابط األساسية الثالثة في عملية تكوين‬
‫‪.‬األنواع‪.‬من خالل تأثيرها المشترك ‪ ،‬تميز المجموعات وتؤدي في النهاية إلى تكوين أنواع جديدة‬

‫خطوات تنفيذ الخوارزمية الجينية ‪1.2‬‬


‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫الترميز ‪1.‬‬

‫هناك نوعان من ترميز الخوارزمية الجينية‪ :‬ترميز النقطة العائمة والترميز الثنائي‪ .‬قدم هنا لمنع الترميز‪ .‬قم بتعيين نطاق‬
‫للتعبير عن المعلمات المتغيرة ‪ k ،‬استخدم الرمز الثنائي للطول ‪ (L,U) ( L , U ) ،‬قيمة المعلمة إلى‬
‫سهل المعرفة‪ Δ Δ ‬في الرموز المختلفة ‪ ،‬الفاصل الزمني بين رمزين لكل رمز مجاور هو‪k 2 k ‬ثم‪2 ‬‬

‫)‪Δ=(U−L)(2k−1) Δ = ( U − L ) ( 2 k − 1 ‬‬

‫فك التشفير ‪2.‬‬

‫‪.‬الغرض من فك التشفير هو استعادة سالسل البيانات الثنائية غير العشرية إلى عشري‬

‫يمكن أن يتوافق تشفير وفك تشفير الخوارزميات الجينية مع النمط الجيني والنمط الظاهري للكائنات الحية على المستوى‬
‫‪.‬الكلي ‪ ،‬ويمكن أن يتوافق مع عمليتي نسخ الحمض النووي والترجمة على المنظار‬

‫التزاوج ‪3.‬‬

‫عملية التزاوج" هي عامل ينفذ التقاطع باستخدام نقطة واحدة أو نقاط متعددة‪ .‬أوالً ‪ ،‬يتم إنشاء موضع واحد أو أكثر"‬
‫يسمى توزيع الطاقة بأرقام عشوائية ‪ ،‬ثم يتبادل سؤاالن جزءًا من رموز الجينات في المواضع التي تسمى توزيع الطاقة‬
‫‪:‬لتشكيل فردين فرعيين‪ .‬كما هو موضح أدناه‬

‫"‪ "/‬تم تبادل الجينين في‬

‫الطفرة ‪4.‬‬
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫عملية الطفرة" هي استخدام بتات أساسية لتحور الجينات‪ .‬على سبيل المثال ‪ ،‬تغيير ‪ 0‬في الموضع الثالث للكروموسوم"‬
‫‪ S.‬يمكن اعتباره كروموسوم ساللة األصل "‪ S = 11101101 = S ". S‬إلى ‪ ، 1‬أي ‪S = 11101101‬‬

‫االنقالب ‪5.‬‬

‫=' ‪ S‬بعد االنعكاس ‪: S = 100/1100/11 ،‬الجزء العكسي من جينات الكروموسوم‪ .‬على سبيل المثال‬
‫‪100/0011/11.‬‬

‫تقييم اللياقة الفردية ‪6.‬‬

‫تحدد الخوارزمية الجينية فرصة أن يرث كل فرد في المجموعة الحالية مجموعة الجيل التالي وف ًقا لالحتمالية التي تتناسب‬
‫مع لياقة الفرد‪ .‬تسعى عادة يمكن لمشكلة القيمة القصوى للدالة الهدفية أن تستخدم مباشرة الوظيفة الموضوعية كدالة‬
‫。للكشف عن حجم اللياقة الفردية‬

‫نسخ ‪7.‬‬

‫في عملية النسخ المتماثل ‪ ،‬يتم تحديد? إمكانية وراثة الجيل القادم وف ًقا لمدى مالءمة الفرد‪ .‬إذا كان العدد اإلجمالي لألفراد‬
‫‪:‬فإن احتمال اختيار الشخص هو ‪ i fi fi ،‬وكانت لياقة الفرد ‪ N ،‬في السكان الضعفاء هو‬
‫المجموع‪ ‬مناسب‪ ‬يجب‪ ‬الدرجة‪ P i = f i ‬المجموعمناسبيجبالدرجة‪Pi=fi‬‬

‫للخوارزمية الجينية ‪ MATLAB‬برمجة ‪2.‬‬


‫عملية تصميم البرنامج واختيار المعلمات ‪2.1‬‬

‫الكود الزائف ‪1.‬‬

‫كود زائف للخوارزمية الجينية ‪٪‬‬

‫‪BEGIN‬‬

‫;‪t = 0‬‬ ‫الجيل الجيني‬

‫؛‪ ٪‬تهيئة السكان أو الكروموسوم )‪ P (t‬تهيئة‬

‫؛ )‪ P (t‬حساب قيمة المالءمة من‬

‫‪ do‬بينما (ال يفي بمعيار التوقف)‬

‫‪begin‬‬

‫;‪t = t+1‬‬
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫‪٪ select‬؛ )‪ P (t-1‬من )‪ P (t‬حدد‬

‫؛ )‪ P (t‬إعادة تنظيم‬

‫؛ )‪ P (t‬حساب قيمة المالءمة من‬

‫‪end‬‬

‫‪end‬‬

‫‪END‬‬

‫‪‬‬ ‫‪1‬‬
‫‪‬‬ ‫‪2‬‬
‫‪‬‬ ‫‪3‬‬
‫‪‬‬ ‫‪4‬‬
‫‪‬‬ ‫‪5‬‬
‫‪‬‬ ‫‪6‬‬
‫‪‬‬ ‫‪7‬‬
‫‪‬‬ ‫‪8‬‬
‫‪‬‬ ‫‪9‬‬
‫‪‬‬ ‫‪10‬‬
‫‪‬‬ ‫‪11‬‬
‫‪‬‬ ‫‪12‬‬
‫‪‬‬ ‫‪13‬‬
‫‪‬‬ ‫‪14‬‬

‫مبادئ تصميم المعلمات من الخوارزمية الجينية ‪2.‬‬

‫حجم السكان ‪1.‬‬


‫。يجب أال يكون عدد السكان كبيرً ا ج ًدا أو صغيرً ا ج ًدا‪ .‬قيمة مقترحة لحجم السكان‪100-0‬‬

‫احتمال حدوث طفرة ‪2.‬‬


‫يجب أال يكون احتمال التغيير كبيرً ا ج ًدا أو صغيرً ا ً‬
‫جدا‪ .‬القيمة العامة‪0.2-0.0001‬‬

‫التزاوج االحتمالية ‪3.‬‬


‫مثل المذكور أعاله ‪ ،‬ليس كبيرً ا ج ًدا أو صغيرً ا ج ًدا‪ .‬القيمة العامة‪0.99-0.4‬‬

‫الجبر التطوري ‪4.‬‬


‫。مثل المذكور أعاله ‪ ،‬ليس كبيرً ا ج ًدا أو صغيرً ا ج ًدا‪ .‬القيمة العامة‪500-100‬‬
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫التهيئة? السكانية ‪5.‬‬


‫التوليد األولي للسكان عشوائي‪ .‬قبل إعطاء السكان ‪ ،‬حاول إجراء تقدير فاصل تقريبي لتجنب توزيع السكان األولي في‬
‫‪.‬مساحة التشفير بعي ًد ا عن الحل األمثل ‪ ،‬مما أدى إلى تحديد نطاق البحث للخوارزمية الجينية‬

‫تصميم وظيفة الخوارزمية الجينية اللياقة البدنية ‪3.‬‬

‫في الخوارزمية الجينية ومربع أدوات البحث المباشر هي القيمة الدنيا لحل الوظيفة الموضوعية ‪ ،‬لذلك إذا ‪ ga‬إن دالة ‪1.‬‬
‫كانت الوظيفة الهدف هي القيمة الدنيا للحل ‪ ،‬يمكن أن تكون الوظيفة الموضوعية مباشرة وظيفة اللياقة البدنية‪ .‬تتم كتابة‬
‫‪:‬دالة اللياقة في بناء الجملة التالي‬

‫)‪function f = fitnesscn(x‬‬

‫;)‪f = f(x‬‬

‫‪end‬‬

‫‪‬‬ ‫‪1‬‬
‫‪‬‬ ‫‪2‬‬
‫‪‬‬ ‫‪3‬‬
‫‪:‬إذا كانت هناك قيود (بما في ذلك نطاق قيم المتغيرات المستقلة) ‪ ،‬فإن بنية حل الحد األدنى لقيمة الوظيفة هي كما يلي ‪2.‬‬

‫)‪function f = fitnessfcx(x‬‬

‫‪if x<=-1||x>3‬‬

‫;‪f = inf‬‬

‫‪else‬‬

‫;)‪f = f(x‬‬

‫‪end‬‬

‫‪end‬‬

‫‪‬‬ ‫‪1‬‬
‫‪‬‬ ‫‪2‬‬
‫‪‬‬ ‫‪3‬‬
‫‪‬‬ ‫‪4‬‬
‫‪‬‬ ‫‪5‬‬
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫‪‬‬ ‫‪6‬‬
‫‪‬‬ ‫‪7‬‬
‫‪:‬إذا كانت هناك قيود (بما في ذلك نطاق قيم المتغيرات المستقلة) ‪ ،‬فإن بنية حل القيمة القصوى للوظيفة هي كما يلي ‪3.‬‬

‫)‪function f = fitnessfcx(x‬‬

‫‪if x<=-1||x>3‬‬

‫;‪f = inf‬‬

‫‪else‬‬

‫;)‪f = -f(x‬‬

‫‪end‬‬

‫‪end‬‬

‫‪‬‬ ‫‪1‬‬
‫‪‬‬ ‫‪2‬‬
‫‪‬‬ ‫‪3‬‬
‫‪‬‬ ‫‪4‬‬
‫‪‬‬ ‫‪5‬‬
‫‪‬‬ ‫‪6‬‬
‫‪‬‬ ‫‪7‬‬
‫‪ fval‬بدالً من ‪ -fval‬ملحوظة‪ :‬دالة الهدف النهائية التي تم حلها هي‬

‫حالة تطبيق الخوارزمية الجينية ‪3.‬‬


‫‪.‬يتم إعطاء ثالث حاالت هنا‬
‫الحالة ‪ :1‬القيمة القصوى لوظيفة الهدف غير المقيدة‬
‫‪ maxf(x)=200∗e(−0.05x)∗sinx;x∈[−2,2] m a x f ( x ) = 200 ∗ e ( − 0.05 x ) ∗ s i ‬حل‬
‫]‪n x ; x ∈ [ − 2 , 2 ‬‬

‫‪ y = 200 * exp (-0.05 * x). * Sin‬البرنامج الرئيسي‪ :‬حل القيمة القصوى لـ ‪٪‬‬
‫في الفاصل الزمني [‪(x) ]2 2-‬‬

‫;‪clc‬‬

‫; ‪clear‬‬
/https://arabicprogrammer.com/article/8747352747 ]1[

close all;

global BitLength

global boundsbegin

global boundsend

bounds=[-2 2];٪ ‫نطاق القيمة لمتغير مستقل أحادي البعد‬

precision=0.0001; ‫دقة العملية‬

boundsbegin=bounds(:,1);

boundsend=bounds(:,2);

٪ ‫احسب المدة المطلوبة للكروموسومات إذا تم استيفاء دقة المحلول‬

BitLength=ceil(log2((boundsend-boundsbegin)' ./ precision));

popsize = 50 ‫ الحجم األولي للسكان‬٪‫؛‬

Generationnmax = 12 ‫ الجيل األقصى‬٪‫؛‬

pcrossover = 0.90٪ ‫احتمال التزاوج‬

pmutation = 0.09 ‫ احتمالية الطفرة‬٪‫؛‬

٪ ‫توليد السكان األولي‬

population=round(rand(popsize,BitLength));

٪ ‫ واحتمال التراكمي‬، ‫ وعودة قيمة اللياقة البدنية‬، ‫احسب اللياقة‬

[Fitvalue,cumsump]=fitnessfun(population);

Generation=1;

while Generation<Generationnmax+1
/https://arabicprogrammer.com/article/8747352747 ]1[

for j=1:2:popsize

٪ ‫حدد العملية‬

seln=selection(population,cumsump);

٪ ‫عبر العملية‬

scro=crossover(population,seln,pcrossover);

scnew(j,:)=scro(1,:);

scnew(j+1,:)=scro(2,:);

٪ )‫عملية الطفرة (تتم الطفرة على أساس التقاطع األصلي‬

smnew(j,:)=mutation(scnew(j,:),pmutation);

smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);

end

‫ = السكان‬smnew ‫ السكان الجدد‬٪‫؛ أنتجت‬

‫احسب لياقة السكان الجدد‬

[Fitvalue,cumsump]=fitnessfun(population);

‫سجل أفضل لياقة ومتوسط للجيل الحالي‬

[fmax,nmax]=max(Fitvalue);

fmean=mean(Fitvalue);

ymax(Generation)=fmax;

ymean(Generation)=fmean;

‫سجل أفضل فرد كروموسوم من الجيل الحالي‬


/https://arabicprogrammer.com/article/8747352747 ]1[

x=transform2to10(population(nmax,:));

‫ ويجب دمج أفضل الكروموسوم بعد‬، ]2 2-[ ‫ هو‬٪‫نطاق المتغيرات المستقلة‬


]2 2-[ ‫الحساب الجيني في الفاصل الزمني‬

xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);

xmax(Generation)=xx;

Generation=Generation+1

end

Generation=Generation-1;

Bestpopulation=xx

Besttargetfunvalue=targetfun(xx)

‫ إذا كان متوسط‬، ‫ بشكل عام‬.‫رسم منحنى اللياقة البدنية بعد الحساب الجيني‬
‫اللياقة البدنية واللياقة القصوى للسكان أثناء التطور‬

‫ مما يشير إلى أن تقارب‬، ‫ له شكل من التقارب على المنحنى‬٪‫الضغط‬


‫الخوارزمية يسير بسالسة وال يوجد تذبذب ؛‬

٪ ، ‫يذكر أن الفرد الذي يتمتع بأعلى لياقة لم يتطور لعدة أجيال متتالية‬
‫مما يشير إلى أن السكان قد نضجوا‬.

figure(1);

hand1=plot(1:Generation,ymax);

set(hand1,'linestyle','-','linewidth',1.8,'marker','*','markersize',6)

hold on;

hand2=plot(1:Generation,ymean);

set(hand2,'color','r','linestyle','-','linewidth',1.8,...
/https://arabicprogrammer.com/article/8747352747 ]1[

'marker','h','markersize',6)

xlabel("‫;)"الجبر التطوري‬ylabel("‫ المتوسطة‬/ ‫;)"اللياقة القصوى‬xlim([1


Generationnmax]);

legend("‫"متوسط اللياقة‬,"‫;)"اللياقة القصوى‬

box off;hold off;

٪ Subroutine: ‫ يتم تخزين اسم الوظيفة على أنها‬، ‫عملية تقاطع جديدة للسكان‬
crossover.m

function scro=crossover(population,seln,pc)

BitLength=size(population,2);

pcc=IfCroIfMut(pc); ٪ ‫ قرر ما إذا كنت تريد إجراء‬، ‫ًا الحتمال التقاطع‬


‫وفق‬
‫ ال‬0 ، ‫ نعم‬1 ، ‫عملية متقاطعة‬

if pcc==1

chb=round(rand*(BitLength-2))+1; ٪ ‫ً بتة متداخلة في نطاق‬


‫يولد عشوائيا‬
[1، BitLength-1]

scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)];

scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)];

else

scro(1,:)=population(seln(1),:);

scro(2,:)=population(seln(2),:);

end
/https://arabicprogrammer.com/article/8747352747 ]1[

٪ Subroutine: ‫ يتم تخزين اسم الوظيفة كـ‬، ‫حساب وظيفة اللياقة البدنية‬
fitnessfun

function [Fitvalue,cumsump]=fitnessfun(population);

global BitLength

global boundsbegin

global boundsend

popsize=size(population,1); ٪ ‫يحتوي على أفراد‬

for i=1:popsize

x=transform2to10(population(i,:)); ٪ ‫تحويل ثنائي إلى عشري‬

]2،2-[ ‫ إلى رقم حقيقي في الفاصل الزمني‬٪‫يتم تحويل‬

xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);

Fitvalue(i)=targetfun(xx); ٪ ‫ أي اللياقة‬، ‫احسب قيمة الوظيفة‬

end

٪ ‫إضافة حجم معقول لوظيفة اللياقة البدنية للتأكد من أن قيمة اللياقة‬


‫البدنية للسكان إيجابية‬

Fitvalue=Fitvalue'+230;

٪ ‫احسب احتمال االختيار‬

fsum=sum(Fitvalue);

Pperpopulation=Fitvalue/fsum;

٪ ‫احسب االحتمال التراكمي‬

cumsump = cumsum(Pperpopulation);
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫;'‪cumsump=cumsump‬‬

‫عملية طفرة سكانية جديدة ‪ ،‬يتم تخزين اسم الوظيفة على أنها ‪٪ Subroutine:‬‬
‫‪mutation.m‬‬

‫)‪function snnew=mutation(snew,pmutation‬‬

‫;)‪BitLength=size(snew,2‬‬

‫;‪snnew=snew‬‬

‫;)‪pmm=IfCroIfMut(pmutation‬‬ ‫ًا الحتمالية الطفرة ‪ ،‬قرر ما إذا كنت تريد ‪٪‬‬


‫وفق‬
‫إجراء عملية طفرة ‪ 1 ،‬نعم ‪ 0 ،‬ال‬

‫‪if pmm==1‬‬

‫;‪chb=round(rand*(BitLength-1))+1‬‬ ‫ينشئ بشكل عشوائي بت طفرة ضمن النطاق ‪٪‬‬


‫]‪[1، BitLength‬‬

‫;)‪snnew(chb)=abs(snew(chb)-1‬‬ ‫يجعل االنعكاس ‪٪ 0-1 ، 1-0‬‬

‫‪end‬‬

‫لتحديد ما إذا كانت العمليات الجينية تحتاج إلى التقاطع أو ‪٪ Subroutine:‬‬


‫‪ IfCroIfMut.m‬التحور ‪ ،‬يتم تخزين اسم الوظيفة كـ‬

‫)‪function pcc=IfCroIfMut(mutORcro‬‬

‫قم بتوليد تسلسل بطول ‪ ، 100‬حدد نقطة بشكل عشوائي ‪ ،‬كل األرقام الموجودة ‪٪‬‬
‫‪ ،‬أمام النقطة هي ‪ ، 1‬والظهر هو ‪1‬‬

‫‪.‬ثم قم بإنشاء رقم بشكل عشوائي للحكم على ما إذا كان ‪ 1‬أو ‪٪ 0‬‬

‫;‪test(1:100)=0‬‬
/https://arabicprogrammer.com/article/8747352747 ]1[

l=round(100*mutORcro);

test(1:l)=1;

n=round(rand*99)+1;

pcc=test(n);

end

٪ Subroutine: ‫ يتم تخزين اسم الوظيفة على أنها‬، ‫عملية اختيار جديدة للسكان‬
select.m

function seln=selection(population,cumsump);

‫حدد شخصين من السكان‬

for i=1:2

r=rand; ٪ ‫يولد رقم عشوائي‬

prand=cumsump-r;

j=1;

while prand(j)<0

j=j+1;

end

seln(i)=j; ‫الرقم التسلسلي للفرد المحدد‬

end

٪ Subroutine: ‫ اسم وظيفة المخزن‬، ‫تحويل الرقم الثنائي إلى الرقم العشري‬
‫ على أنه‬transform2to10.m
/https://arabicprogrammer.com/article/8747352747 ]1[

function x=transform2to10(Population)

BitLength=size(Population,2);

x=Population(BitLength);

for i=1:BitLength-1

x=x+Population(BitLength-i)*power(2,i);

end

٪ Subroutine: ‫ يمكن استخدام الدالة‬، ‫لتحسين وظيفة القيمة القصوى أو القصوى‬


‫الهدف كوظيفة اللياقة البدنية‬

‫ على أنه‬٪‫ يتم تخزين اسم الوظيفة‬targetfun.m

function y=targetfun(x)‫ دالة موضوعية‬٪‫؛‬

y=200*exp(-0.05*x).*sin(x);

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
/https://arabicprogrammer.com/article/8747352747 ]1[

 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
/https://arabicprogrammer.com/article/8747352747 ]1[

 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
/https://arabicprogrammer.com/article/8747352747 ]1[

 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
/https://arabicprogrammer.com/article/8747352747 ]1[

 145
 146
‫نتائج البرنامج‬:

Bestpopulation =

1.575677119096666

Besttargetfunvalue =

1.848457326200009e+02

 1
 2
 3
 4
 5
 6
 7
 8
 9
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫الحالة ‪ :2‬مشكلة برمجة غير خطية متعددة القيود‬


‫‪f=ex∗(4∗x2+2∗y2+4∗x∗y+2∗y+1) f = e x ∗ ( 4 ∗ x 2 + 2 ∗ y 2 + 4 ∗ x ∗ y + 2 ∗ y ‬‬
‫)‪+ 1 ‬‬

‫‪ ،‬البرنامج الرئيسي‪ :‬يستخدم هذا البرنامج تطور تتابع الخوارزمية الجينية ‪٪‬‬

‫استخدم العدد النهائي الذي تم الحصول عليه بعد التطور األخير حيث تم ‪٪‬‬
‫إدخال المحتوى األولي في المرة القادمة‬

‫;‪clc‬‬

‫;‪close all‬‬

‫;‪clear all‬‬

‫الجبر التطوري‬
/https://arabicprogrammer.com/article/8747352747 ]1[

T=100;

optionsOrigin=gaoptimset('Generations',T/2);

[x,fval,reason,output,finnal_pop]=ga(@ch14_2f,2,optionsOrigin);

٪ ‫تنفيذ تطور التتابع الثاني‬

options1=gaoptimset('Generations',T/2,'InitialPopulation',finnal_pop,...

'PlotFcns',@gaplotbestf);

[x,fval,reason,output,finnal_pop]=ga(@ch14_2f,2,options1);

Bestx=x

BestFval=fval

٪ ‫ واسم‬، ‫ًا وظيفة موضوعية‬


‫ وظيفة اللياقة البدنية هي أيض‬:‫وظيفة فرعية‬
‫ تخزين الوظيفة هو‬ch14_2f.m

function f=ch14_2f(x)

g1=1.5+x(1)*x(2)-x(1)-x(2);

g2=-x(1)*x(2);

if(g1>0|g2>10)

f=100;

else

f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);

end
/https://arabicprogrammer.com/article/8747352747 ]1[

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
‫نتائج البرنامج‬:

Optimization terminated: maximum number of generations exceeded.

Optimization terminated: maximum number of generations exceeded.

Bestx =

-9.026449478668987 1.105769708316651
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫= ‪BestFval‬‬

‫‪0.035051699473142‬‬

‫>>‬

‫‪‬‬ ‫‪1‬‬
‫‪‬‬ ‫‪2‬‬
‫‪‬‬ ‫‪3‬‬
‫‪‬‬ ‫‪4‬‬
‫‪‬‬ ‫‪5‬‬
‫‪‬‬ ‫‪6‬‬
‫‪‬‬ ‫‪7‬‬
‫‪‬‬ ‫‪8‬‬
‫‪‬‬ ‫‪9‬‬
‫‪‬‬ ‫‪10‬‬
‫‪‬‬ ‫‪11‬‬
‫‪‬‬ ‫‪12‬‬
‫‪‬‬ ‫‪13‬‬
‫الكالسيكية ‪ TSP‬الحالة ‪ :3‬مشكلة‬
‫لنفترض أن هناك رجل أعمال مسافرً ا يرغب في زيارة المدن ‪ ،‬فيجب عليه اختيار المسار الذي يريد أن يسلكه‪ .‬ويقتصر‬
‫المسار على أن كل مدينة? يمكنها زيارتها مرة واحدة فقط ‪ ،‬وأخيرً ا العودة إلى مدينة المغادرة األصلية ‪ .‬هدف اختيار‬
‫‪.‬المسار هو أن مسافة المسار المطلوبة هي القيمة الدنيا بين جميع المسارات‬

‫‪ TSP‬استخدم الخوارزمية الجينية لحل قالب مشكلة ‪٪‬‬

‫‪tic‬‬

‫‪clc,clear‬‬

‫تحميل البيانات من ‪ 100‬هدف العدو ‪sj = load('yichuansuanfadata.txt'); ٪‬‬

‫;)‪x=sj(:,1:2:8);x=x(:‬‬
/https://arabicprogrammer.com/article/8747352747 ]1[

y=sj(:,2:2:8);y=y(:);

sj=[x y];

figure(1);

plot(x,y);

d1=[70,40];

sj0=[d1;sj;d1];

‫مصفوفة المسافة د‬

sj=sj0*pi/180;

d=zeros(102);

for i=1:101

for j=i+1:102

temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))
+sin(sj(i,2))*sin(sj(j,2));

d(i,j)=6370*acos(temp);

end

end

d=d+d';L=102;w=50;dai=100;

٪ ‫من خالل خوارزمية الدائرة المحسنة الختيار والد جيد أ‬

for k=1:w

c=randperm(100);

c1=[1,c+1,102];
/https://arabicprogrammer.com/article/8747352747 ]1[

flag=1;

while flag>0

flag=0;

for m=1:L-3

for n=m+2:L-1

if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))
+d(c1(n),c1(n+1))

flag=1;

c1(m+1:n)=c1(n:-1:m+1);

end

end

end

end

J(k,c1)=1:102;

end

J=J/102;

J(:,1)=0;J(:,102)=1;

rand('state',sum(clock));

٪ ‫عملية تنفيذ الخوارزمية الجينية‬

A=J;

for k=1:dai ٪ ‫ للترميز‬1 ‫ و‬0 ‫إنشاء أرقام عشوائية بين‬


/https://arabicprogrammer.com/article/8747352747 ]1[

B=A;

c=randperm(w);

٪ ‫ التزاوج ينتج ذرية‬B

for i=1:2:w

F=2+floor(100*rand(1));

temp=B(c(i),F:102);

B(c(i),F:102)=B(c(i+1),F:102);

B(c(i+1),F:102)=temp;

end

٪ ‫ طفرة تنتج ذرية‬C

by=find(rand(1,w)<0.1);

if length(by)==0

by=floor(w*rand(1))+1;

end

C=A(by,:);

L3=length(by);

for j=1:L3

bw=2+floor(100*rand(1,3));

bw=sort(bw);

C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);
/https://arabicprogrammer.com/article/8747352747 ]1[

end

G=[A;B;C];

TL=size(G,1);

٪ ‫حدد أصناف ممتازة كآباء جدد في الوالد والنسل‬

[dd,IX]=sort(G,2);temp(1:TL)=0;

for j=1:TL

for i=1:101

temp(j)=temp(j)+d(IX(j,i),IX(j,i+1));

end

end

[DZ,IZ]=sort(temp);

A=G(IZ(1:w),:);

end

path=IX(IZ(1),:)

long=DZ(1)

toc

xx=sj0(path,1);yy=sj0(path,2);

%plot(xx,yy,'-o',)

figure(2);

plot(xx,yy,'-o')
/https://arabicprogrammer.com/article/8747352747 ]1[

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
/https://arabicprogrammer.com/article/8747352747 ]1[

 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫‪‬‬ ‫‪85‬‬
‫هي إحداثيات خطوط الطول والعرض بين النقاط ‪ ،‬والبيانات هي على "‪ ، "yichuansuanfadata.txt‬من بينها‬
‫‪:‬النحو التالي‬

‫‪53.7121‬‬ ‫‪15.3046‬‬ ‫‪51.1758‬‬ ‫‪0.0322‬‬ ‫‪46.3253‬‬ ‫‪28.2753‬‬ ‫‪30.3313‬‬ ‫‪6.9348‬‬

‫‪56.5432‬‬ ‫‪21.4188‬‬ ‫‪10.8198‬‬ ‫‪16.2529‬‬ ‫‪22.7891‬‬ ‫‪23.1045‬‬ ‫‪10.1584‬‬ ‫‪12.4819‬‬

‫‪20.1050‬‬ ‫‪15.4562‬‬ ‫‪1.9451‬‬ ‫‪0.2057‬‬ ‫‪26.4951‬‬ ‫‪22.1221‬‬ ‫‪31.4847‬‬ ‫‪8.9640‬‬

‫‪26.2418‬‬ ‫‪18.1760‬‬ ‫‪44.0356‬‬ ‫‪13.5401‬‬ ‫‪28.9836‬‬ ‫‪25.9879‬‬ ‫‪38.4722‬‬ ‫‪20.1731‬‬

‫‪28.2694‬‬ ‫‪29.0011‬‬ ‫‪32.1910‬‬ ‫‪5.8699‬‬ ‫‪36.4863‬‬ ‫‪29.7284‬‬ ‫‪0.9718‬‬ ‫‪28.1477‬‬

‫‪8.9586‬‬ ‫‪24.6635‬‬ ‫‪16.5618‬‬ ‫‪23.6143‬‬ ‫‪10.5597‬‬ ‫‪15.1178‬‬ ‫‪50.2111‬‬ ‫‪10.2944‬‬

‫‪8.1519‬‬ ‫‪9.5325‬‬ ‫‪22.1075‬‬ ‫‪18.5569‬‬ ‫‪0.1215‬‬ ‫‪18.8726‬‬ ‫‪48.2077‬‬ ‫‪16.8889‬‬

‫‪31.9499‬‬ ‫‪17.6309‬‬ ‫‪0.7732‬‬ ‫‪0.4656‬‬ ‫‪47.4134‬‬ ‫‪23.7783‬‬ ‫‪41.8671‬‬ ‫‪3.5667‬‬

‫‪43.5474‬‬ ‫‪3.9061‬‬ ‫‪53.3524‬‬ ‫‪26.7256‬‬ ‫‪30.8165‬‬ ‫‪13.4595‬‬ ‫‪27.7133‬‬ ‫‪5.0706‬‬

‫‪23.9222‬‬ ‫‪7.6306‬‬ ‫‪51.9612‬‬ ‫‪22.8511‬‬ ‫‪12.7938‬‬ ‫‪15.7307‬‬ ‫‪4.9568‬‬ ‫‪8.3669‬‬

‫‪21.5051‬‬ ‫‪24.0909‬‬ ‫‪15.2548‬‬ ‫‪27.2111‬‬ ‫‪6.2070‬‬ ‫‪5.1442‬‬ ‫‪49.2430‬‬ ‫‪16.7044‬‬

‫‪17.1168‬‬ ‫‪20.0354‬‬ ‫‪34.1688‬‬ ‫‪22.7571‬‬ ‫‪9.4402‬‬ ‫‪3.9200‬‬ ‫‪11.5812‬‬ ‫‪14.5677‬‬

‫‪52.1181‬‬ ‫‪0.4088‬‬ ‫‪9.5559‬‬ ‫‪11.4219‬‬ ‫‪24.4509‬‬ ‫‪6.5634‬‬ ‫‪26.7213‬‬ ‫‪28.5667‬‬

‫‪37.5848‬‬ ‫‪16.8474‬‬ ‫‪35.6619‬‬ ‫‪9.9333‬‬ ‫‪24.4654‬‬ ‫‪3.1644‬‬ ‫‪0.7775‬‬ ‫‪6.9576‬‬

‫‪14.4703‬‬ ‫‪13.6368‬‬ ‫‪19.8660‬‬ ‫‪15.1224‬‬ ‫‪3.1616‬‬ ‫‪4.2428‬‬ ‫‪18.5245‬‬ ‫‪14.3598‬‬

‫‪58.6849‬‬ ‫‪27.1485‬‬ ‫‪39.5168‬‬ ‫‪16.9371‬‬ ‫‪56.5089‬‬ ‫‪13.7090‬‬ ‫‪52.5211‬‬ ‫‪15.7957‬‬

‫‪38.4300‬‬ ‫‪8.4648‬‬ ‫‪51.8181‬‬ ‫‪23.0159‬‬ ‫‪8.9983‬‬ ‫‪23.6440‬‬ ‫‪50.1156‬‬ ‫‪23.7816‬‬

‫‪13.7909‬‬ ‫‪1.9510‬‬ ‫‪34.0574‬‬ ‫‪23.3960‬‬ ‫‪23.0624‬‬ ‫‪8.4319‬‬ ‫‪19.9857‬‬ ‫‪5.7902‬‬


/https://arabicprogrammer.com/article/8747352747 ]1[

40.8801 14.2978 58.8289 14.5229 18.6635 6.7436 52.8423 27.2880

39.9494 29.5114 47.5099 24.0664 10.1121 27.2662 28.7812 27.6659

8.0831 27.6705 9.1556 14.1304 53.7989 0.2199 33.6490 0.3980

1.3496 16.8359 49.9816 6.0828 19.3635 17.6622 36.9545 23.0265

15.7320 19.5697 11.5118 17.3884 44.0398 16.2635 39.7139 28.4203

6.9909 23.1804 38.3392 19.9950 24.6543 19.6057 36.9980 24.3992

4.1591 3.1853 40.1400 20.3030 23.9876 9.4030 41.1084 27.7149

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
‫األعمدة الفردية هي خطوط الطول واألعمدة الزوجية هي خطوط العرض‬
‫[‪/https://arabicprogrammer.com/article/8747352747 ]1‬‬

‫‪:‬نتائج الحل هي كما يلي‬

‫= ‪path‬‬

‫إلى ‪ 19‬عمود ‪1‬‬

‫‪1‬‬ ‫‪17‬‬ ‫‪3‬‬ ‫‪36‬‬ ‫‪43‬‬ ‫‪93‬‬ ‫‪46‬‬ ‫‪59‬‬ ‫‪100‬‬ ‫‪98‬‬ ‫‪51‬‬ ‫‪80‬‬ ‫‪50‬‬
‫‪15‬‬ ‫‪42‬‬ ‫‪20‬‬ ‫‪30‬‬ ‫‪74‬‬ ‫‪83‬‬

‫دا ‪20‬‬
‫إلى ‪ 38‬عموً‬

‫‪87‬‬ ‫‪92‬‬ ‫‪2‬‬ ‫‪45‬‬ ‫‪67‬‬ ‫‪82‬‬ ‫‪48‬‬ ‫‪72‬‬ ‫‪14‬‬ ‫‪27‬‬ ‫‪10‬‬ ‫‪84‬‬ ‫‪18‬‬
‫‪40‬‬ ‫‪79‬‬ ‫‪77‬‬ ‫‪31‬‬ ‫‪97‬‬ ‫‪85‬‬

‫دا ‪39‬‬
‫إلى ‪ 57‬عموً‬

‫‪65‬‬ ‫‪64‬‬ ‫‪11‬‬ ‫‪76‬‬ ‫‪69‬‬ ‫‪94‬‬ ‫‪70‬‬ ‫‪19‬‬ ‫‪63‬‬ ‫‪62‬‬ ‫‪26‬‬ ‫‪29‬‬ ‫‪34‬‬
‫‪66‬‬ ‫‪90‬‬ ‫‪86‬‬ ‫‪8‬‬ ‫‪39‬‬ ‫‪78‬‬

‫دا ‪58‬‬
‫إلى ‪ 76‬عموً‬
/https://arabicprogrammer.com/article/8747352747 ]1[

47 23 58 81 22 71 37 7 68 25 49 28 57
88 61 16 91 41 4

77 ‫دا‬
ً‫ عمو‬95 ‫إلى‬

73 13 24 32 12 53 33 75 5 60 9 38 44
54 55 96 89 6 56

96 ‫ عمود‬102 ‫إلى‬

21 99 101 52 95 35 102

long =

4.087894090467779e+04

‫ ثانية‬8.865015 ‫لقد مرت‬.

>>

 1
 2
 3
 4
/https://arabicprogrammer.com/article/8747352747 ]1[

 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
/https://arabicprogrammer.com/article/8747352747 ]1[
/https://arabicprogrammer.com/article/8747352747 ]1[

You might also like