Advertisement
naman1601

Sims

Aug 8th, 2020 (edited)
1,469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.85 KB | None | 0 0
  1. import java.util.Random;
  2.  
  3. public class Sims {
  4.  
  5.   int daysLived = 0;
  6.   double range = 0;
  7.   boolean isAlive = false;
  8.   boolean hasFood = false;
  9.   //boolean canReproduce = false;
  10.   int xc = 0;
  11.   int yc = 0;
  12.  
  13.   static double getRange(int val) {
  14.  
  15.     double temp = (val + 1)/2;
  16.  
  17.     double retval = 0.8 * Math.sqrt(2*temp*temp);
  18.  
  19.     return retval;
  20.  
  21.   }
  22.  
  23.   public static void main(String[] args) {
  24.    
  25.     int population = 196;
  26.     int side = 50;
  27.     int blobSpawn = 43;
  28.     int foodSpawn = 28;
  29.     double mutation = 0.003;
  30.     int reproductionCycle = 5;
  31.     int cycles = 25000;
  32.    
  33.     Random random = new Random();
  34.     Sims[] blob = new Sims[population];
  35.     int[][] field = new int[side][side];
  36.     int randomNum = 0;
  37.     int fastest = 0;
  38.     int blobsAlive = 0;
  39.  
  40.     for(int i = 0; i < side; i += 1) {
  41.  
  42.       for(int j = 0; j < side; j+= 1) {
  43.  
  44.         field[i][j] = 0;
  45.  
  46.       }
  47.  
  48.     }
  49.  
  50.     for(int i = 0; i < population; i += 1) {
  51.  
  52.       blob[i] = new Sims();
  53.       randomNum = random.nextInt(100);
  54.       if(randomNum < blobSpawn) {
  55.  
  56.         blob[i].isAlive = true;
  57.         blob[i].range = getRange(side);
  58.         blobsAlive += 1;
  59.  
  60.       }
  61.  
  62.     }
  63.  
  64.     System.out.println("Initially --> Alive : " + blobsAlive + "   Range : " + getRange(side));
  65.  
  66.     int x = 0;
  67.  
  68.     for(int i = 0; i < side; i += 1){
  69.  
  70.       if((i == 0) || (i == (side - 1))) {
  71.  
  72.         for(int j = 0; j < side; j += 1) {
  73.  
  74.           blob[x].xc = i;
  75.           blob[x].yc = j;
  76.  
  77.         }
  78.  
  79.       } else {
  80.  
  81.         blob[x].xc = i;
  82.         blob[x].yc = 0;
  83.  
  84.         x += 1;
  85.  
  86.         blob[x].xc = i;
  87.         blob[x].yc = side - 1;
  88.  
  89.       }
  90.  
  91.     }
  92.    
  93.     //double foodLeft = 0;
  94.  
  95.     for(int i = 0; i < cycles; i += 1) {
  96.  
  97.       for(int j = 0; j < side; j += 1) {
  98.  
  99.         for(int k = 0; k < side; k += 1) {
  100.  
  101.           randomNum = random.nextInt(1000);
  102.           if(randomNum < foodSpawn) {
  103.  
  104.             field[j][k] = 1;
  105.             //foodLeft += 1;
  106.  
  107.           }
  108.  
  109.         }
  110.  
  111.       }
  112.  
  113.       for(int j = 0; j < side; j += 1) {
  114.  
  115.         for(int k = 0; k < side; k += 1) {
  116.  
  117.           if(field[j][k] == 1) {
  118.  
  119.             double time = 1000;
  120.  
  121.             fastest = -1;
  122.  
  123.             for(int l = 0; l < population; l += 1) {
  124.  
  125.               if(blob[l].isAlive && (!blob[l].hasFood)) {
  126.  
  127.                 double tt = Math.sqrt((j - blob[l].xc)*(j - blob[l].xc) + (k - blob[l].yc)*(k - blob[l].yc))/blob[l].range;
  128.                 //double feasible = Math.sqrt((j - blob[l].xc)*(j - blob[l].xc) + (k - blob[l].yc)*(k - blob[l].yc));
  129.                 if((tt < time) && (tt <= 1)) {
  130.  
  131.                   fastest = l;
  132.                   time = tt;
  133.  
  134.                 }
  135.  
  136.               }
  137.  
  138.             }
  139.  
  140.             if(fastest != -1) {
  141.  
  142.               blob[fastest].hasFood = true;
  143.               field[j][k] = 0;
  144.               //foodLeft -= 1;
  145.  
  146.             }
  147.  
  148.           }
  149.  
  150.         }
  151.  
  152.       }
  153.  
  154.       double avgRange = 0;
  155.       int count = 0;
  156.       int notAlive = 0;
  157.  
  158.       for(int j = 0; j < population; j += 1) {
  159.  
  160.         if(!blob[j].hasFood) {
  161.  
  162.           blob[j].isAlive = false;
  163.           blob[j].daysLived = 0;
  164.           notAlive += 1;
  165.  
  166.         } else {
  167.  
  168.           blob[j].hasFood = false;
  169.           blob[j].daysLived += 1;
  170.  
  171.           if(blob[j].daysLived % reproductionCycle == 0) {
  172.  
  173.             count += 1;
  174.             avgRange += blob[j].range;
  175.  
  176.           }
  177.  
  178.         }
  179.  
  180.       }
  181.  
  182.       avgRange = avgRange/count;
  183.  
  184.       //double avgRange = 0;
  185.       int toss = 0;
  186.       //int count = 0;
  187.       //int notAlive = 0;
  188.  
  189.       /*for(int j = 0; j < population; j += 1) {
  190.  
  191.         if(!blob[j].isAlive) notAlive += 1;
  192.  
  193.         if(blob[j].canReproduce) {
  194.  
  195.           blob[j].canReproduce = false;
  196.           avgRange += blob[j].range;
  197.           count += 1;
  198.  
  199.         }
  200.  
  201.         avgRange = avgRange/count;
  202.  
  203.       }*/
  204.  
  205.       if(count > notAlive) count = notAlive;
  206.  
  207.       int counter = 0;
  208.  
  209.       for(int j = 0; counter <= count; j += 1) {
  210.  
  211.         if(!blob[j].isAlive) {
  212.  
  213.           blob[j].isAlive = true;
  214.           toss = random.nextInt(2);
  215.           if(toss == 0) blob[j].range = (1 + mutation) * avgRange;
  216.           if(toss == 1) blob[j].range = (1 - mutation) * avgRange;
  217.           counter += 1;
  218.  
  219.         }
  220.  
  221.       }
  222.  
  223.       for(int j = 0; j < side; j += 1) {
  224.  
  225.         for(int k = 0; k < side; k += 1) {
  226.  
  227.           field[j][k] = 0;
  228.  
  229.         }
  230.  
  231.       }
  232.  
  233.     }
  234.  
  235.     double avg = 0;
  236.     blobsAlive = 0;
  237.  
  238.     for(int i = 0; i < population; i += 1) {
  239.  
  240.       if(blob[i].isAlive) {
  241.  
  242.         blobsAlive += 1;
  243.         avg += blob[i].range;
  244.  
  245.       }
  246.  
  247.     }
  248.  
  249.     avg = avg/blobsAlive;
  250.    
  251.     //foodLeft = foodLeft/cycles;
  252.  
  253.     System.out.println("Finally --> Alive : " + blobsAlive + "   Range : " + avg);
  254.    
  255.     //System.out.print("Average food left uneaten per day : " + foodLeft);
  256.  
  257.   }
  258.  
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement