3GL   4GL   5GL   .

- .

  1. SBC-
  2. Bee
  3. Hive
  4. Hive
  5. SBC
  6. Solve
  7. ProcessActiveBee
  8. DoWaggleDance
  9. ProcessScoutBee ProcessInactiveBee

(Simulated Bee Colony, SBC) . , SBC, , , , (Traveling Salesman Problem) SBC.

SBC - , . 1. SBC 20 ( A T) , . , A, T , 19,0 .

. 1. SBC

SBC 100 , . , 95,0 . SBC ( ), , . SBC 16 20, 26,5 - , .

SBC -, , . SBC . , SBC , SBC . , SBC , .

, . C#, , . , , SBC .

, Apis mellifera ( ), , . 5000 20 000 . ( 20 40 ), , (foragers). : , - .

, , .

( 50 ) . 10% - .

- . . , - , , - (waggle dance) . , . .

, , , .

(Traveling Salesman Problem, TSP) - . TSP, , .

. 1 , , - SBC 20 , A T. 20 , . 20! = 2 432 902 008 176 640 000 .

. , c1 < c2, c1 c2 (ordinal distance) . c1 > c2, 1,5 c1 c2. A B 1,0 , B A - 1,5 , A C - 2,0 . . , , , - A -> B-> C -> ... -> T, - (20-1) * 1,0 = 19,0.

TSP . - . TSP , , - . , TSP , c1 c2 c2 c1, .

, <> . , 20 , , 20! 77 000 . SBC.

TSP CitiesData, . 2. SBC code.msdn.microsoft.com/mag0411BeeColony.

. 2. CitiesData

  1. class CitiesData {
  2.   public char[] cities;
  3.  
  4.   public CitiesData(int numberCities) {
  5.     this.cities = new char[numberCities];
  6.     this.cities[0] = 'A';
  7.     for (int i = 1; i < this.cities.Length; ++i)
  8.       this.cities[i] = (char)(this.cities[i - 1] + 1);
  9.   }
  10.  
  11.   public double Distance(char firstCity, char secondCity) {
  12.     if (firstCity < secondCity)
  13.       return 1.0 * ((int)secondCity - (int)firstCity);
  14.     else
  15.       return 1.5 * ((int)firstCity - (int)secondCity);
  16.   }
  17.  
  18.   public double ShortestPathLength() {
  19.     return 1.0 * (this.cities.Length - 1);
  20.   }
  21.  
  22.   public long NumberOfPossiblePaths() {
  23.     long n = this.cities.Length;
  24.     long answer = 1;
  25.     for (int i = 1; i <= n; ++i)
  26.       checked { answer *= i; }
  27.     return answer;
  28.   }
  29.  
  30.   public override string ToString() {
  31.     string s = "";
  32.     s += "Cities: ";
  33.     for (int i = 0; i < this.cities.Length; ++i)
  34.       s += this.cities[i] + " ";
  35.     return s;
  36.   }
  37. }

- , , , . , SBC, , , (jagged array of arrays).

CitiesData A, - B . .

Distance , , , .

ShortestPathLength Distance. SBC , , .

NumberOfPossiblePaths n!, n - . TSP n-1! ( ), - n/2! ( ).

ToString StringBuilder . , .

, , , , . , NumberOfPossiblePaths , long.MaxValue.

SBC-

SBC, . 1, C#. . 3. , SBC- , System. : Program ( Main), Hive ( SBC) CitiesData ( ). Hive (Hive), TravelingSalesmanHive, SBC , .

. 3.

  1. using System;
  2. namespace SimulatedBeeColony {
  3.   class Program {
  4.     static void Main(string[] args) {
  5.       Console.WriteLine("\nBegin Simulated Bee Colony algorithm demo\n");
  6.       . . . 
  7.       Console.WriteLine("End Simulated Bee Colony demo");
  8.     } 
  9.   } 
  10.  
  11.   class Hive {
  12.     public class Bee {
  13.       . . . 
  14.     }
  15.  
  16.     // Hive data fields here
  17.  
  18.     public override string ToString() { . . . }
  19.     
  20.     public Hive(int totalNumberBees, int numberInactive,
  21.       int numberActive, int numberScout, int maxNumberVisits,
  22.       int maxNumberCycles, CitiesData citiesData) {
  23.       . . .      
  24.     } 
  25.  
  26.     public char[] GenerateRandomMemoryMatrix() { . . . }
  27.     
  28.     public char[] GenerateNeighborMemoryMatrix(char[] memoryMatrix) { . . . }
  29.     
  30.     public double MeasureOfQuality(char[] memoryMatrix) { . . . }
  31.     
  32.     public void Solve() { . . . }
  33.  
  34.     private void ProcessActiveBee(int i) { . . . }
  35.  
  36.     private void ProcessScoutBee(int i) { . . . }
  37.  
  38.     private void ProcessInactiveBee(int i) { . . . }
  39.  
  40.     private void DoWaggleDance(int i) { . . . }
  41.   } 
  42.  
  43.   class CitiesData {
  44.     . . .
  45.   }
  46.  
  47. // ns

Main . CitiesData:

  1. Console.WriteLine(
  2.   "Loading cities data for SBC Traveling Salesman Problem analysis");
  3. CitiesData citiesData = new CitiesData(20);
  4. Console.WriteLine(citiesData.ToString());
  5. Console.WriteLine("Number of cities = " + citiesData.cities.Length);
  6. Console.WriteLine("Number of possible paths = " + 
  7.   citiesData.NumberOfPossiblePaths().ToString("#,###"));
  8. Console.WriteLine("Best possible solution (shortest path) length = " + 
  9.   citiesData.ShortestPathLength().ToString("F4"));

SBC , SQL, .

Hive :

  1. int totalNumberBees = 100;
  2. int numberInactive = 20;
  3. int numberActive = 50;
  4. int numberScout = 30;
  5. int maxNumberVisits = 100
  6. int maxNumberCycles = 3460;
  7.        
  8. Hive hive = new TravelingSalesmanHive(totalNumberBees,
  9.   numberInactive, numberActive, numberScout, maxNumberVisits,
  10.   maxNumberCycles, citiesData);

, SBC : , . <> , Hive, .

totalNumberBees , . . , , . , : 75% , 10% 15% . 

100, maxNumberVisits, , (neighbor solutions), .

maxNumberCycles , Solve; , SBC , . ( , .) maxNumberCycles 3460 , SBC . , , SBC , , <> .

, . Hive () , , .

Hive Main ToString , Hive, Solve , , :

  1. ...
  2.   Console.WriteLine("\nInitial random hive");
  3.   Console.WriteLine(hive);
  4.  
  5.   bool doProgressBar = true;
  6.   hive.Solve(doProgressBar);
  7.  
  8.   Console.WriteLine("\nFinal hive");
  9.   Console.WriteLine(hive);
  10.   Console.WriteLine("End Simulated Bee Colony demo");
  11. }

Bee

. 3, Hive Bee. . 4.

. 4. Bee

  1. public class Bee {
  2.   public int status;
  3.   public char[] memoryMatrix;
  4.   public double measureOfQuality; 
  5.   public int numberOfVisits;
  6.  
  7.   public Bee(int status, char[] memoryMatrix, 
  8.     double measureOfQuality, int numberOfVisits) {
  9.     this.status = status;
  10.     this.memoryMatrix = new char[memoryMatrix.Length];
  11.     Array.Copy(memoryMatrix, this.memoryMatrix, memoryMatrix.Length);
  12.     this.measureOfQuality = measureOfQuality;
  13.     this.numberOfVisits = numberOfVisits;
  14.   }
  15.  
  16.   public override string ToString() {
  17.     string s = "";
  18.     s += "Status = " + this.status + "\n";
  19.     s += " Memory = " + "\n";
  20.     for (int i = 0; i < this.memoryMatrix.Length-1; ++i)
  21.       s += this.memoryMatrix[i] + "->";
  22.     s += this.memoryMatrix[this.memoryMatrix.Length-1] + "\n";
  23.     s += " Quality = " + this.measureOfQuality.ToString("F4");
  24.     s += " Number visits = " + this.numberOfVisits;
  25.     return s;
  26.   }
  27. }

Bee , SBC, , . memoryMatrix. SBC - . TSP, , char. , , , , .

status int, Bee: , . , status .

measureOfQuality double, memoryMatrix Bee. TSP , memoryMatrix. , , measureOfQuality . SBC - . double.

Bee - numberOfVisits. int, , Bee , . , , . , , , numberOfVisits , ( ).

Bee - status, memoryMatrix, measureOfQuality numberOfVisits. , Bee measureOfQuality, Bee memoryMatrix; , CitiesData.

Bee ToString, . Bee.ToString , SBC WriteLine.

Hive

Hive . 5. 14 , , SBC.

. 5. 14 Hive

  1. static Random random = null;
  2.  
  3. public CitiesData citiesData;
  4.  
  5. public int totalNumberBees; 
  6. public int numberInactive; 
  7. public int numberActive;
  8. public int numberScout;
  9.  
  10. public int maxNumberCycles;
  11. public int maxNumberVisits; 
  12.  
  13. public double probPersuasion = 0.90;
  14. public double probMistake = 0.01
  15.  
  16. public Bee[] bees;
  17. public char[] bestMemoryMatrix;
  18. public double bestMeasureOfQuality;
  19. public int[] indexesOfInactiveBees;

WriteLine 14 . , .

, random, Random. SBC , random. random Hive.

- CitiesData. SBC . , , . , CitiesData , .

int, , , . , , , . .

, maxNumberCycles, , Solve. .

, maxNumberVisits, , . Solve, , numberOfVisits 1. numberOfVisits Bee maxNumberVisits, .

, probPersuasion, . , , , , .

probPersuasion <> 0.90, . . 90% . probPersuasion, 0.90, , . SBC , , , .

, probMistake, , , , . . ( ), , , . probMistake <> 0.01, , 1% .

, bees, - Bee. , (, , ), (memoryMatrix), (measureOfQuality) (numberOfVisits). Bee , bees Bee.

, bestMemoryMatrix, - char, bees. : SBC - , . , - . , SBC, , SBC .

, bestMeasureOfQuality, () bestMemoryMatrix.

, indexesOfInactiveBees, - int. . , , - . SBC , , , bees status .

Hive . 6. (hive) 10 : , . 2, 7 4 bees. CitiesData . :

A->B->E->C-D

:

1.0 + (3 * 1.0) + (2 * 1.5) + 1.0 = 8.0

, citiesData CitiesData, .

. 6. Hive

Hive

. 7. . , (citiesData). totalNumberBees , numberInactive, numberActive numberScout, .

. 7. Hive

  1. public Hive(int totalNumberBees, int numberInactive,
  2.   int numberActive, int numberScout, int maxNumberVisits,
  3.   int maxNumberCycles, CitiesData citiesData) {
  4.  
  5.   random = new Random(0);
  6.       
  7.   this.totalNumberBees = totalNumberBees;
  8.   this.numberInactive = numberInactive;
  9.   this.numberActive = numberActive;
  10.   this.numberScout = numberScout;
  11.   this.maxNumberVisits = maxNumberVisits;
  12.   this.maxNumberCycles = maxNumberCycles;
  13.  
  14.   this.citiesData = citiesData;
  15.  
  16.   this.bees = new Bee[totalNumberBees];
  17.   this.bestMemoryMatrix = GenerateRandomMemoryMatrix();
  18.   this.bestMeasureOfQuality = 
  19.     MeasureOfQuality(this.bestMemoryMatrix);
  20.  
  21.   this.indexesOfInactiveBees = new int[numberInactive]; 
  22.  
  23.   for (int i = 0; i < totalNumberBees; ++i) {
  24.     int currStatus; 
  25.     if (i < numberInactive) {
  26.       currStatus = 0// inactive
  27.       indexesOfInactiveBees[i] = i; 
  28.     }
  29.     else if (i < numberInactive + numberScout)
  30.       currStatus = 2// scout
  31.     else
  32.       currStatus = 1// active
  33.     
  34.     char[] randomMemoryMatrix = GenerateRandomMemoryMatrix();
  35.     double mq = MeasureOfQuality(randomMemoryMatrix);
  36.     int numberOfVisits = 0;
  37.  
  38.     bees[i] = new Bee(currStatus, 
  39.       randomMemoryMatrix, mq, numberOfVisits); 
  40.         
  41.     if (bees[i].measureOfQuality < bestMeasureOfQuality) {
  42.       Array.Copy(bees[i].memoryMatrix, this.bestMemoryMatrix, 
  43.         bees[i].memoryMatrix.Length);
  44.       this.bestMeasureOfQuality = bees[i].measureOfQuality;
  45.     }
  46.   } 
  47. }

random, , (seed value), 0. . Hive. Hive 14 ; probPersuasion probMistake <> .

Hive citiesData citiesData. - , :


  1. int n = citiesData.cities.Length;
  2. this.citiesData = new CitiesData(n);

, . , , .

Hive bees null. (. . ) :

  1. this.bestMemoryMatrix = GenerateRandomMemoryMatrix();
  2. this.bestMeasureOfQuality = 
  3.   MeasureOfQuality(this.bestMemoryMatrix);

GenerateRandomMemoryMatrix , MeasureOfQuality . .

Hive indexesOfInactiveBees bees, numberInactive. 0.

Bee bees Bee. , numberInactive bees , numberScout - , - .

, , , bees 10 , 0 1 , 2-4 - 5-9 - . , indexesOfInactiveBees 2 0 1.

, , , 0 Bee:

  1. char[] randomMemoryMatrix = GenerateRandomMemoryMatrix();
  2. double mq = MeasureOfQuality(randomMemoryMatrix);
  3. int numberOfVisits = 0;
  4. bees[i] = new Bee(currStatus, randomMemoryMatrix, 
  5.   mq, numberOfVisits);

, , . , bestMemoryMatrix bestMeasureOfQuality. , , , , TSP .

bestMemoryMatrix - . .

SBC

SBC , , . .

- . , - . , GenerateRandomMemoryMatrix, :

  1. public char[] GenerateRandomMemoryMatrix() {
  2.   char[] result = new char[this.citiesData.cities.Length];
  3.   Array.Copy(this.citiesData.cities, result,
  4.     this.citiesData.cities.Length);      
  5.   for (int i = 0; i < result.Length; i++) {
  6.     int r = random.Next(i, result.Length);
  7.     char temp = result[r];
  8.     result[r] = result[i];
  9.     result[i] = temp;
  10.   }
  11.   return result;
  12. }

TSP - char, char , GenerateRandomMemoryMatrix . result CitiesData , , Hive, CitiesData. result random, , - (Fisher-Yates shuffle algorithm) ( ) (Knuth shuffle).

, GenerateRandomMemoryMatrix Bee. , , ( - CitiesData), .

, GenerateNeighborMemoryMatrix, . 8.

. 8.

  1. public char[] GenerateNeighborMemoryMatrix(char[] memoryMatrix) {
  2.   char[] result = new char[memoryMatrix.Length];
  3.   Array.Copy(memoryMatrix, result, memoryMatrix.Length);
  4.  
  5.   int ranIndex = random.Next(0, result.Length);
  6.   int adjIndex;
  7.   if (ranIndex == result.Length - 1)
  8.     adjIndex = 0;
  9.   else
  10.     adjIndex = ranIndex + 1;
  11.  
  12.   char tmp = result[ranIndex];
  13.   result[ranIndex] = result[adjIndex];
  14.   result[adjIndex] = tmp;  return result;
  15. }

SBC - , ( ), , . , . TSP, , , , , - .

, TSP - A,B,C,D,E, A,C,B,D,E. , ( ) . A,D,C,B,E ? SBC , , .

, SBC. , . , - .

GenerateNeighborMemoryMatrix memoryMatrix ( ) result. result, random, . , ; , .

maxNumberVisits. , maxNumberVisits , . , (A,B,C), , ( A B, B C, A C). 20 maxNumberVisits 20 * 5 = 100.

, , MeasureOfQuality, :

  1. public double MeasureOfQuality(char[] memoryMatrix) {
  2.   double answer = 0.0;
  3.   for (int i = 0; i < memoryMatrix.Length - 1; ++i) {
  4.     char c1 = memoryMatrix[i];
  5.     char c2 = memoryMatrix[i + 1];
  6.     double d = this.citiesData.Distance(c1, c2);
  7.     answer += d;
  8.   }
  9.   return answer;
  10. }

SBC , . , . .

MeasureOfQuality , memoryMatrix, Distance CitiesData . , , , (ordinal distance) . - . SBC MeasureOfQuality , . , .

Solve

Solve , -, . : ProcessActiveBee, ProcessScoutBee ProcessInactiveBee. - DoWaggleDance. Solve . 9.

. 9. Solve

  1. public void Solve(bool doProgressBar) {
  2.   bool pb = doProgressBar;
  3.   int numberOfSymbolsToPrint = 10
  4.   int increment = this.maxNumberCycles / numberOfSymbolsToPrint;
  5.   if (pb) Console.WriteLine("\nEntering SBC Traveling Salesman Problem algorithm main processing loop\n");
  6.   if (pb) Console.WriteLine("Progress: |==========|");
  7.   if (pb) Console.Write("           ");
  8.   int cycle = 0;
  9.       
  10.   while (cycle < this.maxNumberCycles) {
  11.     for (int i = 0; i < totalNumberBees; ++i) {
  12.       if (this.bees[i].status == 1)
  13.         ProcessActiveBee(i);
  14.       else if (this.bees[i].status == 2)
  15.         ProcessScoutBee(i);
  16.       else if (this.bees[i].status == 0)
  17.         ProcessInactiveBee(i);
  18.     } 
  19.     ++cycle;
  20.  
  21.     if (pb && cycle % increment == 0)
  22.       Console.Write("^");
  23.   } 
  24.  
  25.   if (pb) Console.WriteLine("");
  26. }

ProcessActiveBee, ProcessScoutBee ProcessInactiveBee. , Solve, , . SBC . , Solve .

pb , . numberOfSymbolsToPrint 10, 10% , maxNumberCycles ( increment , , 10% ).

cycle, , while. ( for.) for bees Bee . , doProgressBar true, % , ( <^>).

ProcessActiveBee

SBC ( ). ProcessActiveBee . 10.

. 10. ProcessActiveBee

  1. private void ProcessActiveBee(int i) {
  2.   char[] neighbor = GenerateNeighborMemoryMatrix(bees[i].memoryMatrix);
  3.   double neighborQuality = MeasureOfQuality(neighbor); 
  4.   double prob = random.NextDouble();
  5.   bool memoryWasUpdated = false;
  6.   bool numberOfVisitsOverLimit = false
  7.  
  8.   if (neighborQuality < bees[i].measureOfQuality) { // better
  9.     if (prob < probMistake) { // mistake
  10.       ++bees[i].numberOfVisits;
  11.       if (bees[i].numberOfVisits > maxNumberVisits)
  12.         numberOfVisitsOverLimit = true;
  13.     }
  14.     else { // No mistake
  15.       Array.Copy(neighbor, bees[i].memoryMatrix, neighbor.Length);
  16.       bees[i].measureOfQuality = neighborQuality;
  17.       bees[i].numberOfVisits = 0
  18.       memoryWasUpdated = true
  19.     }
  20.   }
  21.   else { // Did not find better neighbor
  22.     if (prob < probMistake) { // Mistake
  23.       Array.Copy(neighbor, bees[i].memoryMatrix, neighbor.Length);
  24.       bees[i].measureOfQuality = neighborQuality;
  25.       bees[i].numberOfVisits = 0;
  26.       memoryWasUpdated = true
  27.     }
  28.     else { // No mistake
  29.       ++bees[i].numberOfVisits;
  30.       if (bees[i].numberOfVisits > maxNumberVisits)
  31.         numberOfVisitsOverLimit = true;
  32.     }
  33.   }
  34.  
  35.   if (numberOfVisitsOverLimit == true) {
  36.     bees[i].status = 0
  37.     bees[i].numberOfVisits = 0;
  38.     int x = random.Next(numberInactive); 
  39.     bees[indexesOfInactiveBees[x]].status = 1
  40.     indexesOfInactiveBees[x] = i; 
  41.   }
  42.   else if (memoryWasUpdated == true) {
  43.     if (bees[i].measureOfQuality < this.bestMeasureOfQuality) {
  44.       Array.Copy(bees[i].memoryMatrix, this.bestMemoryMatrix,
  45.         bees[i].memoryMatrix.Length); 
  46.       this.bestMeasureOfQuality = bees[i].measureOfQuality
  47.     }
  48.     DoWaggleDance(i);
  49.   }
  50.   else {
  51.     return;
  52.   }
  53. }

ProcessActiveBee , i, bees. , , memoryMatrix, :

  1. char[] neighbor =
  2.   GenerateNeighborMemoryMatrix(bees[i].memoryMatrix); 
  3. double neighborQuality = MeasureOfQuality(neighbor);

, :

  1. double prob = random.NextDouble();)
  2. bool memoryWasUpdated = false
  3. bool numberOfVisitsOverLimit = false;

prob 0.0 1.0 probMistake, , , . . .

memoryWasUpdated , , ( true) ( false). numberOfVisitsOverLimit maxNumberVisits, , , . , .

, , , . , , , , , , .

, , (probMistake = 0.01). , , , SBC, .

, , maxNumberVisits. , , indexesOfInactiveBees. , . , , DoWaggleDance, .

DoWaggleDance

DoWaggleDance , . DoWaggleDance:

  1. private void DoWaggleDance(int i) {
  2.   for (int ii = 0; ii < numberInactive; ++ii) {
  3.     int b = indexesOfInactiveBees[ii]; 
  4.     if (bees[i].measureOfQuality < bees[b].measureOfQuality) {
  5.       double p = random.NextDouble(); 
  6.       if (this.probPersuasion > p) {
  7.         Array.Copy(bees[i].memoryMatrix, bees[b].memoryMatrix,
  8.           bees[i].memoryMatrix.Length);
  9.         bees[b].measureOfQuality = bees[i].measureOfQuality;
  10.       } 
  11.     } 
  12.   } 
  13. }

i - , . . ( probPersuasion = 0.90), .

, , , . , for DoWaggleDance :

  1. if (bees[b].status != 0throw new Exception(. . .);

:

  1. if (bees[b].numberOfVisits != 0throw new Exception(. . .);

ProcessScoutBee ProcessInactiveBee

ProcessScoutBee, Solve, -, . ProcessScoutBee . 11.

. 11. ProcessScoutBee

  1. private void ProcessScoutBee(int i) {
  2.   char[] randomFoodSource = GenerateRandomMemoryMatrix();
  3.   double randomFoodSourceQuality = 
  4.     MeasureOfQuality(randomFoodSource);
  5.   if (randomFoodSourceQuality < bees[i].measureOfQuality {
  6.     Array.Copy(randomFoodSource, bees[i].memoryMatrix,
  7.       randomFoodSource.Length);
  8.     bees[i].measureOfQuality = randomFoodSourceQuality;
  9.     if (bees[i].measureOfQuality < bestMeasureOfQuality) {
  10.       Array.Copy(bees[i].memoryMatrix, this.bestMemoryMatrix,
  11.         bees[i].memoryMatrix.Length);
  12.       this.bestMeasureOfQuality = bees[i].measureOfQuality;
  13.     } 
  14.     DoWaggleDance(i);
  15.   }
  16. }

i - bees. - , , , , , . , . - , , .

, SBC - , . - SBC .

ProcessInactiveBee :

  1. `private void ProcessInactiveBee(int i) {
  2.   return;
  3. }
  4. private void ProcessInactiveBee(int i) {
  5.   return;
  6. }

SBC , ProcessInactiveBee - , . - .

, SBC . SBC , . - ( ), - (neighbor solution) .

, , , - . , ( , ). - (NP-complete) - (NP-hard) ( - ), SBC.

SBC . , (genetic algorithms, GA), , (ant colony optimization, ACO), , (simulated annealing, SA), .

. , , , , (solution convergence speed) . SBC , , , , , .

SBC , . 

(Dr. James McCaffrey)  Volt Information Sciences Inc. Microsoft, ( ). , Internet Explorer MSN Search. <.NET Test Automation Recipes> (Apress, 2006). jammc@microsoft.com.

Microsoft Research (Dan Liebling) (Anne Loomis Thompson)

          3GL   4GL   5GL   .

, - - :
- - ;
- (obj) (dll).




 10.11.2021 - 12:37: - Personalias -> WHO IS WHO - - _.
10.11.2021 - 12:36: - Conscience -> . ? - _.
10.11.2021 - 12:36: , , - Upbringing, Inlightening, Education -> ... - _.
10.11.2021 - 12:35: - Ecology -> - _.
10.11.2021 - 12:34: , - War, Politics and Science -> - _.
10.11.2021 - 12:34: , - War, Politics and Science -> . - _.
10.11.2021 - 12:34: , , - Upbringing, Inlightening, Education -> , - _.
10.11.2021 - 09:18: - New Technologies -> , 5G- - _.
10.11.2021 - 09:18: - Ecology -> - _.
10.11.2021 - 09:16: - Ecology -> - _.
10.11.2021 - 09:15: , , - Upbringing, Inlightening, Education -> - _.
10.11.2021 - 09:13: , , - Upbringing, Inlightening, Education -> - _.
Bourabai Research -  XXI Bourabai Research Institution