لن أقدم المبادئ التفصيلية وتعريفات محددة للخوارزميات الجينية هنا. إذا كنت تريد أن تعرف ، يمكنك استخدام Baidu لتعلمه. هنا سأقدم باختصار فهمك للخوارزميات الوراثية. تستخدم هذه المقالة القواعد الثنائية لتشفير الجينات.
أفكار الخوارزمية:
تشير الخوارزمية الجينية إلى نظرية داروين للتطور وتعتقد أن الأنواع تتطور في اتجاه إيجابي (بقاء الأصلح) ، لذلك يمكن اعتبار أنه بعد الجبر الكافي ، تكون القيمة القصوى التي تم الحصول عليها قريبة جدًا من القيمة القصوى الفعلية.
خطوات الخوارزمية:
جزء خوارزمية تنفيذ الجين
1. السكان الأفراد (هنا يعتبرون الكروموسومات) ، في الأفراد ، نضيف سمتين إلى هذا الفرد ، اللياقة (قيمة الوظيفة) المقابلة لجين الفرد وجينه.
كروموسوم الطبقة العامة {private boolean [] Gene ؛ // Sequence Sequence Private Double Scort ؛ 2. توليد تسلسل الجينات بشكل عشوائي. سواء كان كل موضع للجين هو 0 أو 1 ، فهذه طريقة عشوائية تمامًا لتحقيق ذلك.
كروموسوم عام (حجم int) {if (size <= 0) {return ؛ } initGenesize (size) ؛ لـ (int i = 0 ؛ i <size ؛ i ++) {gene [i] = math.random ()> = 0.5 ؛ }} private void intergenesize (int size) {if (size <= 0) {return ؛ } الجين = جديد منطقي [الحجم] ؛ } 3. تحويل الجين إلى القيمة المقابلة ، على سبيل المثال ، الرقم المقابل لـ 101 هو 5 ، ويتم استخدام عمليات بت هنا لتنفيذها.
public int getNum () {if (gene == null) {return 0 ؛ } int num = 0 ؛ لـ (Boolean Bool: Gene) {num << = 1 ؛ if (bool) {num += 1 ؛ }} return num ؛ } 4. في حالة حدوث طفرة الجين ، يتم تنفيذ موقع الطفرة بالكامل بطريقة عشوائية. مبدأ الطفرة هو التغيير من 1 إلى 0 إلى 0 إلى 1.
طفرة باطلة عامة (int num) {// السماح للطفرة int size = gene.length ؛ لـ (int i = 0 ؛ i <num ؛ i ++) {// ابحث عن موقع طفرة int at = ((int) (math.random () * size)) ٪ ؛ // القيمة بعد الطفرة المنطقية المنطقية =! الجين [في] ؛ الجين [في] = منطقي ؛ }} 5. يستخدم استنساخ الجينات لإنتاج الجيل القادم. هذه الخطوة هي نسخ الجينات الموجودة.
استنساخ كروموسوم ثابت عام (كروموسوم نهائي C) {if (c == null || c.gene == null) {return null ؛ } نسخة كروموسوم = كروموسوم جديد () ؛ copy.initgenesize (c.gene.length) ؛ لـ (int i = 0 ؛ i <c.gene.length ؛ i ++) {copy.gene [i] = c.gene [i] ؛ } نسخة الإرجاع ؛ } 6. كلا الوالدين ينتجون الجيل القادم ، وهنا ينتج شخصان ذرية فردية. أي جين محدد يختلف عن الطالب ، وهو عشوائي تمامًا.
القائمة الثابتة العامة <Crromosome> Genetic (كروموسوم P1 ، كروموسوم P2) {if (p1 == null || p2 == null) {// هناك واحدة من الكروموسومات الفارغة ولا تنتج الجيل التالي عودة ؛ } if (p1.gene == null || p2.gene == null) {// هناك أحد الكروموسومات التي لا تحتوي على تسلسل الجينات ولا تنتج الجيل القادم عودة الفارغ ؛ } if (p1.gene.length! = p2.gene.length) {// طول تسلسل جين الكروموسوم لا ينتج عن الجيل القادم عائد فارغ ؛ } كروموسوم C1 = استنساخ (p1) ؛ كروموسوم C2 = استنساخ (P2) ؛ // إنشاء مواضع swap المتقاطعة بشكل عشوائي حجم int = c1.gene.length ؛ int a = ((int) (math.random () * size)) ٪ size ؛ int b = ((int) (math.random () * size)) size ٪ ؛ int min = a> b؟ ب: أ ؛ int max = a> b؟ ج: ب ؛ // cromex جينات في مواضع لـ (int i = min ؛ i <= max ؛ i ++) {boolean t = c1.gene [i] ؛ c1.gene [i] = c2.gene [i] ؛ c2.gene [i] = t ؛ } List <Crromosome> list = new ArrayList <Crromosome> () ؛ list.add (c1) ؛ list.add (c2) ؛ قائمة العودة } خوارزمية تنفيذ الخوارزمية
1. بالنسبة للخوارزميات الوراثية ، نحتاج إلى وجود عدد من السكان المقابلة وبعض الثوابت التي نحتاج إلى تعيينها: عدد السكان ، وطول الجين ، وعدد طفرات الجينات ، ومعدل طفرة الجينات ، وما إلى ذلك لمزيد من التفاصيل ، يرجى الرجوع إلى الكود التالي:
Public Public Class GentericalGorithm {Private List <Crromosome> السكان = ArrayList جديد <Crromosome> () ؛ // السكان private popsize = 100 ؛ // عدد السكان الجينات int private ؛ // الحد الأقصى للطول int maxiternum = 500 ؛ الطول غير المتزامن للجيش الداخلي الخاص = 1 ؛ // كم عدد الأجيال الموروثة حاليًا؟ BestScore ؛ // Best Score Private Double Sordscore ؛ // أسوأ نقاط من TotalsCore الخاصة ؛ // إجمالي Score Private Double AveragesCore ؛ // متوسط الدرجات الخاصة بـ Double X ؛ // سجل أفضل قيمة x في السكان التاريخيين الخاصين y ؛ // سجل أفضل قيمة y في السكان التاريخيين int genei ؛ // algebra حيث يوجد xy} 2. تهيئة السكان. في بداية الخوارزمية الجينية ، نحتاج إلى تهيئة السكان الأصليين ، وهو الجيل الأول الأصلي.
private void init () {for (int i = 0 ؛ i <popSize ؛ i ++) {supile = new ArrayList <Crromosome> () ؛ كروموسوم chro = كروموسوم جديد (جينات) ؛ السكان. ADD (CHRO) ؛ } cacultescore () ؛ } 3. بعد وجود السكان الأولي ، نحتاج إلى حساب ملاءمة السكان ، وكذلك أفضل اللياقة البدنية ، وأسوأ اللياقة البدنية ومتوسط اللياقة ، إلخ.
private void cacultescore () {setChromosomeScore (السكان. get (0)) ؛ BestScore = السكان. get (0) .getScore () ؛ أسوأ score = السكان. get (0) .getScore () ؛ TotalScore = 0 ؛ لـ (كروموسوم CHRO: السكان) {setChromosomescore (CHRO) ؛ if (chro.getScore ()> BestScore) {// قم بتعيين أفضل قيمة للجين BestScore = chro.getScore () ؛ if (y <BestScore) {x = changex (chro) ؛ y = BestScore ؛ جيني = جيل ؛ }} if (chro.getScore () <shostscore) {// اضبط أسوأ قيمة الجينات الأسوأ = chro.getScore () ؛ } TotalScore += chro.getScore () ؛ } veragescore = TotalScore / popSize ؛ // متوسط القيمة الناتجة عن مشاكل الدقة أكبر من أفضل قيمة ، قم بتعيين متوسط القيمة على أفضل قيمة في متوسط القيمة = AveragesCore> BestScore؟ BestScore: AveragesCore ؛ } 4. عند حساب اللياقة الفردية ، نحتاج إلى حساب قيمة Y المقابلة بناءً على الجين. هنا قمنا بتعيين طريقتين مجردين لتنفيذ التنفيذ المحدد من خلال تنفيذ الفصل.
private void setChromosomeScore (chromosome chro) {if (chro == null) {return ؛ } double x = changex (chro) ؛ مزدوج y = caculatey (x) ؛ chro.setscore (y) ؛ } / ** * param chro * regurn * description: تحويل ثنائي إلى X * / public Abstract double changex (Chromosome CHRO) ؛ / ** * param x * regurn * description: حساب قيمة y استنادًا إلى x y = f (x) */ public Abstract double caculatey (double x) ؛ 5. بعد حساب اللياقة السكانية ، نحتاج إلى استخدام طريقة المقامرة القرص الدوار لاختيار الأفراد الذين يمكنهم إنتاج الجيل التالي. هناك شرط هنا فقط إذا لم تكن اللياقة للفرد أقل من متوسط اللياقة ، فسيولد الجيل القادم (الباقين على قيد الحياة).
كروموسوم خاص getParentChromosome () {شريحة مزدوجة = Math.Random () * TetalScore ؛ مجموع مزدوج = 0 ؛ لـ (كروموسوم CHRO: السكان) {sum += chro.getScore () ؛ // انتقل إلى الموضع المقابل وأن اللياقة لا تقل عن متوسط اللياقة إذا كان (sum> slice && chro.getscore ()> = AveragesCore) {return chro ؛ }} الإرجاع null ؛ } 6. بعد اختيار الأفراد الذين يمكنهم إنتاج الجيل التالي ، يجب عليك التزاوج لإنتاج الجيل التالي.
private void evolve () {list <Crromosome> ilingpopulation = new ArrayList <Crromosome> () ؛ // توليد السكان الجيل التالي بينما (ilingpopulation.size () <popSize) {chromosome p1 = getParentChromosome () ؛ كروموسوم p2 = getParentChromosome () ؛ قائمة <Crromosome> الأطفال = chromosome.genetic (p1 ، p2) ؛ إذا (الأطفال! = null) {for (chromosome chro: children) {ilingpopulation.add (chro) ؛ }}} // استبدل السكان القدامى بقائمة سكانية جديدة <Crromosome> t = السكان ؛ السكان = الطفل ؛ t.clear () ؛ t = فارغة ؛ // طفرة الجينات () ؛ // حساب اللياقة البدنية الجديدة cacultescore () ؛ } 7. قد تحدث الطفرات الوراثية أثناء عملية إنتاج الجيل القادم.
mutation private void () {for (chromosome chro: السكان) {if (math.random () <mutationRate) {// mutation gene يحدث int mutationNum = (int) (math.random () * maxmutictionnum) ؛ chro.mutation (mutationNum) ؛ }}} 8. كرر الخطوات أعلاه واحدة تلو الأخرى.
public void caculte () {// تهيئة جيل السكان = 1 ؛ init () ؛ بينما (الجيل <maxiternum) {// التطور الوراثي الشعبي () ؛ مطبعة()؛ جيل ++ ؛ }}اكتب فصول التنفيذ
نظرًا لأن فئة الخوارزمية الوراثية المذكورة أعلاه هي فئة مجردة ، نحتاج إلى كتابة فئة تنفيذ لحالة معينة ، على افتراض أننا نحسب القيمة القصوى لـ y = 100-log (x) على [6،106].
1. نفترض أن طول الجين هو 24 (يتم تحديد طول الجين بالطول الفعال للنتيجة المطلوبة) ، وبالتالي فإن الحد الأقصى الثنائي المقابل هو 1 << 24. نقوم بإجراء الإعدادات التالية
الطبقة العامة GeneticGorithMtest يمتد GeneticGorithm {public static Final int num = 1 << 24 ؛ GeneticalGorithMtest () {Super (24) ؛ }} 2. تنفيذ الطريقة التجريدية لقيمة x
Override Public Double Changex (Chromosome CHRO) {// TODO TOD AUTO METRODER CONTER ((1.0 * chro.getnum () / num) * 100) + 6 ؛ } 3. تنفيذ الطريقة التجريدية y
Override public double caculatey (double x) {// todo method method method tuto return 100 - math.log (x) ؛ }نتائج التشغيل
التفكير في الخوارزميات الوراثية
لقد قرأت الكثير من المقدمات للخوارزميات الوراثية. الحلول المثلى المذكورة أعلاه هي معظم قيم الجيل الأخير. لدي سؤال. لماذا أعرف أن معظم القيم بين جميع الفرق المذكورة أعلاه ، أي القيم XY في البرنامج ، لماذا لا يمكنني استخدام قيم XY كقيمة النتيجة النهائية للخوارزمية الوراثية؟
رمز كامل
1. فئة الكروموسوم
/ ***@الوصف: كروموسوم وراثي*/ حزمة com.lulei.genetic.algorithm ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ chromosome الطبقة العامة {private boolean [] Gene ؛ // Sequence Sequence Private Double Score ؛ // وظيفة المقابلة Score Public Double GetScore () {Return Score ؛ } public void setScore (نقاط مزدوجة) {this.score = score ؛ } / *** size size* تسلسل جين تم إنشاؤه عشوائيًا* / كروموسوم عام (حجم int) {if (size <= 0) {return ؛ } initGenesize (size) ؛ لـ (int i = 0 ؛ i <size ؛ i ++) {gene [i] = math.random ()> = 0.5 ؛ }} / *** قم بإنشاء جين جديد* / كروموسوم عام () {} / *** param c* return* description: cloning gene* / public chromosome clone (chromosome c) {if (c == c.gene == null) {return null ؛ } نسخة كروموسوم = كروموسوم جديد () ؛ copy.initgenesize (c.gene.length) ؛ لـ (int i = 0 ؛ i <c.gene.length ؛ i ++) {copy.gene [i] = c.gene [i] ؛ } نسخة الإرجاع ؛ } / *** param size* description: تهيئة طول الجين* / private void intergenesize (int size) {if (size <= 0) {return ؛ } الجين = جديد منطقي [الحجم] ؛ } /** * param c1 * param c2 * description: الجيل الوراثي لإنتاج الجيل القادم * /القائمة الثابتة العامة <Crromosome> الوراثية (الكروموسوم p1 ، الكروموسوم p2) {if (p1 == null || p2 == null) {// واحد من الكروموسومات التي هي فارغة ، ولا تؤدي إلى الإرجاع التالي ؛ } if (p1.gene == null || p2.gene == null) {// هناك أحد الكروموسومات التي لا تحتوي على تسلسل جيني ، ولا تنتج الجيل التالي من عودة الخالية ؛ } if (p1.gene.length! = p2.gene.length) {// طول تسلسل جين الكروموسوم لا ينتج عن الجيل القادم عائد فارغ ؛ } كروموسوم C1 = استنساخ (p1) ؛ كروموسوم C2 = استنساخ (P2) ؛ // إنشاء مواضع swap المتقاطعة بشكل عشوائي حجم int = c1.gene.length ؛ int a = ((int) (math.random () * size)) ٪ size ؛ int b = ((int) (math.random () * size)) size ٪ ؛ int min = a> b؟ ب: أ ؛ int max = a> b؟ ج: ب ؛ // cromex جينات في مواضع لـ (int i = min ؛ i <= max ؛ i ++) {boolean t = c1.gene [i] ؛ c1.gene [i] = c2.gene [i] ؛ c2.gene [i] = t ؛ } List <Crromosome> list = new ArrayList <Crromosome> () ؛ list.add (c1) ؛ list.add (c2) ؛ قائمة العودة } /*** param num* description: يحدث التباين في مواضع NUM لطفرة الجينات num* /public void (int num) {// السماح بحجم int mutation = gene.length ؛ لـ (int i = 0 ؛ i <num ؛ i ++) {// ابحث عن موضع طفرة int at = ((int) (math.random () * size)) size ؛ // القيمة بعد الطفرة المنطقية المنطقية =! الجين [في] ؛ الجين [في] = منطقي ؛ }} / *** return* description: تحويل الجينات إلى الأرقام المقابلة* / public int getNum () {if (gene == null) {return 0 ؛ } int num = 0 ؛ لـ (Boolean Bool: Gene) {num << = 1 ؛ if (bool) {num += 1 ؛ }} return num ؛ }} 2. فئة Geneticgorithm
/ ** *@الوصف: */ package com.lulei.genetic.algorithm ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ Public Abstract Class GentericalGorithm {Private List <Crromosome> السكان = ArrayList جديد <Crromosome> () ؛ popsize int الخاص = 100 ؛ // الرقم الشائع الجينات int private ؛ // الحد الأقصى لطول الجينات private int maxiternum = 500 ؛ // الحد الأقصى لعدد التكرار mutationrate double mutationrate = 0.01 ؛ Private Double Bestscore ؛ // أفضل درجة خاصة مزدوجة Double Score ؛ // أسوأ نقاط TotalsCore الخاصة ؛ // Total Score Private Double AveragesCore ؛ // متوسط الدرجات الخاصة بـ Double X ؛ // سجل أفضل قيمة x في السكان التاريخيين الخاصين y ؛ // سجل أفضل قيمة y في الجينات التاريخية الخاصة بالسكان التاريخية ؛ // algebra حيث تقع xy الوراثية العامة (int genesize) {this.genesize = genesize ؛ } public void caculte () {// تهيئة جيل السكان = 1 ؛ init () ؛ بينما (الجيل <maxiternum) {// التطور الوراثي الشعبي () ؛ مطبعة()؛ جيل ++ ؛ }} / *** description: نتيجة الإخراج* / private void print () { System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println ("أسوأ اللياقة البدنية". description: تهيئة السكان*/ private init () من أجل (int i = 0 ؛ i <splsize ؛ i ++) void Evolve () {list <Crromosome> ilingpopulation = new ArtyList <Crromosome> () ؛ P2) ؛ @Return * @طريقة الروليت تختار الكروموسومات التي يمكن أن ترث الجيل القادم */ chromosome private getParentChromosome () إرجاع chro ؛ setChromoscore (chro) ؛ chro.getscore () ؛ (Chromosome CHRO: السكان) {if (Math.Random () <mutationrate) {// طفرات الجينات تحدث int = (int) (Math.Random () * maxmattionnum) setChromoscore (chromosome) {if (chro == null) {return ؛ @Return * concules: حساب y استنادًا إلى x y = f (x) جينات ؛ getBestScore () {return BestScore ؛ 3
/ ** *@الوصف: */ package com.lulei.genetic.algorithm ؛ الطبقة العامة GeneticGorithMtest يمتد GeneticGorithm {public static Final int num = 1 << 24 ؛ GeneticalGorithMtest () {Super (24) ؛ } Override public double changex (chromosome chro) {// todo method method method method return ((1.0 * chro.getnum () / num) * 100) + 6 ؛ } Override public double caculatey (double x) {// todo method method method tuto return 100 - math.log (x) ؛ } public static void main (string [] args) {geneticgorithmtest test = new GeneticGorithMtest () ؛ test.caculte () ؛ }}ما سبق مقدمة مفصلة لخوارزمية جافا الوراثية. آمل أن يكون من المفيد للجميع تعلم خوارزمية جافا الوراثية.