World Function wf1() in Case of Random Systems as partz of the world

(Version from Dec-9, 2013)

//***************************************************************
// insertPOP()
//
// Takes the list POP  and inserts these
// systems into the GRIDSPC
// Comment:
// Additional possible images will only be shown either via the ainp()-Function 
// or by a special VIEWER-Client (which is not yet part of this software project)

function [GRIDSPC]=insertPOP(GRIDSPC,POP)
    
    [r,c]=size(POP)
    
    for i=1:r //for every element of the list
        Y=eval(POP(i,3))
        X=eval(POP(i,4))
        GRIDSPC(Y,X)=POP(i,2)
    end
    
endfunction
  

//*************************************************
// RANDOM Actions
// Generates random actionsa based on  uniform random numbers from 0 ... 9
//
// NACT := new action

function [NACT] =actRand()
  
  NACT=floor(10*rand())  
  //printf("action:RANDOM NUMBER NACT= %d\n\n",NACT)
  
    
  endfunction
  
//*************************************************
// RANDOM WIB
// (In test cases)
//
// Generates a random WIB for test cases
//
// MINMAL ASSUMPTIONS ABOUT RANDOM LSS1
//
// ENERGY-STATUS := Amount of available energy
// ENERGY-CONSUMPTION := Amount of energy decreasing the status in one cycle
// ENERGY-INPUT := amount of energy to increase status (from POP)
// ACTION-NEW := either a move or an eat = random action {0, ..., 9}
// POPRAND := list of dummy systems PRESET with ENERGY-STATUS AND ENERGY-CONSUMPTION
//
// FORMAT POPRAND:
// [[ID, ENERGY-STATUS, ENERGY-CONSUMPTION], ...]

function [WIB, POPRAND]=randomWIB(WIB,POP,POPRAND,SHOW)
    
       [r,c]=size(POP) //assumes that POP and WIB have the same systems
                   //in the same order !
       
        for i=1:r //for every element of the list POP
            
            if SHOW==1 then disp('BEFORE POPRAND'), disp(POPRAND),disp(WIB), end
           
            ENERGY=eval(POPRAND(i,2))
            
            if (ENERGY>0)  
                
                //Update ENERGY-STATUS
                
                NEWENERGY=eval(POP(i,8)) //Use collected energy
                
                ENERGYCONSUMPTION=eval(POPRAND(i,3))
                
                POPRAND(i,2)=sci2exp(ENERGY+NEWENERGY-ENERGYCONSUMPTION)
                
                //Generate new action
                 
                [NACT]=actRand()
            
              if SHOW==1 then disp('BEFORE WIB NEW'), disp(WIB), end
              
                 if NACT == 9 then WIB(i,3)=sci2exp(NACT) //case non-move
                                   WIB(i,2)='0' //set move to zero 
            
                 else
                    WIB(i,2)=dec2bin(NACT) //case move
                    WIB(i,3)='0' //set nmove to zero 
                 end
              end
           end
     
endfunction
 
 

//*************************************************
// newPOS()
//
// Having the OLD position from POP and the intended movement as DIR from WIB 
// (which  in a special test case will be written by a random function)
// the function computes the NEW Pos
//
// XO, YO := old X-Y-Position
// DIR := direction of move
// XN, XN := new X-Y-Position
//
// The results will be stored in POP as  NEWPOS
//
// ATTENTION : scilab counts Y from 'top = north' downwards to 'down = south'
// Thus to move to the 'north' with '01' you have to subtract '1'
// The same with a move from 'right = east' to the 'left = west'
//


function [POP] =newPOS(POP, WIB)
  
   [r,c]=size(POP) //assumes that POP and WIB have the same systems
                   //in the same order !
                   
    for i=1:r
        
        //Get new move
        DIR=bin2dec(WIB(i,2)) 
        
        //Get old position
        YO = eval(POP(i,3))    
        XO =eval(POP(i,4))       
   
   //Compute coordinates for possible new position
   if DIR == 0 then XN=XO, YN=YO  // no move
   elseif DIR == 1 then YN=YO-1, XN=XO 
     elseif DIR==2  then YN=YO-1, XN=XO+1
     elseif DIR==3  then YN=YO, XN=XO+1
     elseif DIR==4 then  YN=YO+1, XN=XO+1
     elseif DIR==5 then  YN=YO+1, XN=XO
     elseif DIR==6 then  YN=YO+1, XN=XO-1
     elseif DIR==7  then YN=YO, XN=XO-1
     elseif DIR==8 then  YN=YO-1, XN=XO-1
     else printf("mover:ERROR WITH MOVEMENT AT = (YO,XO) = ( %d,%d)\n",YO,XO)
   end// End of one element of POP list
   
   //Write possible new position
   POP(i,5)=sci2exp(YN)
   POP(i,6)=sci2exp(XN) 
   
  end
endfunction
  
//****************************************
// findFOOD()
//
// This is a helper function for random test cases
// It checks for a random system whether there is some food around
// If yes this food is consumed
// It checks in clockwise order all positions
// But does only one uptake out of all
//
// i := index of system in POP
// YO, XO := actual position
// POP := list of systems in the world
// GRIDSPC := actual grid space of the world

function [POP]=updateENERGY(i,YO,XO,POP,GRIDSPC,SHOW)
  
        
        if SHOW==1 then printf('POSITION (Y,X) = %d %d\n',YO,XO), end
        
   //Compute coordinates for possible new position with food
   // Proceeds in clockwise order
   for DIR=1:8 
       if DIR == 1 then YN=YO-1, XN=XO, 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
     elseif DIR==2  then YN=YO-1, XN=XO+1 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
     elseif DIR==3  then YN=YO, XN=XO+1 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
     elseif DIR==4 then  YN=YO+1, XN=XO+1 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
     elseif DIR==5 then  YN=YO+1, XN=XO 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
     elseif DIR==6 then  YN=YO+1, XN=XO-1 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
     elseif DIR==7  then YN=YO, XN=XO-1 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
     elseif DIR==8 then  YN=YO-1, XN=XO-1 
           if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end
   end// End of one element of POP list
   end// End of search 
  

endfunction

//*************************************************
// newPOSPOS()
//
// Having the OLD position from POP and the intended NEW position
//
// Proceed in random order
//
// If system intends 'eat'-action check for food
//
// If system intends a move one has to check
// whether the new position is free, then move system to new position
// otherwise do nothing


function [POP,GRIDSPC] =newPOSPOS(POP,GRIDSPC,SHOW)
  
   [r,c]=size(POP) //assumes that POP and WIB have the same systems
                   //in the same order !
                   
   if SHOW==1 then disp('BEFORE FLAGS TO ZERO'), end
                   
   for i=1:r, POP(i,7)='0', end //Set flag to zero
                   
   while (sum(eval(POP(:,7))) < r), //as long as not all systems have been processed
       

       
   if SHOW==1 then disp('BEFORE SYSRND'), disp(GRIDSPC),end
   
         //Select randomly a system 
         [SYSRND]=ceil((r)*rand())  
         
         
   if SHOW==1 then printf('SYSRND = %d ',SYSRND), end
         
         if (POP(SYSRND,7) == '0') then POP(SYSRND,7)='1', //if not yet processed
             
         if SHOW==1 then disp('BEFORE YN,XN'), end
   
             YN=eval(POP(SYSRND,5)), 
             XN=eval(POP(SYSRND,6)),
             
             YO=eval(POP(SYSRND,3)),
             XO=eval(POP(SYSRND,4)),
             
          //Check 'eat'-action
          //Check food
          //If food intake has been done set back to '0' in WIB
          
          if eval(WIB(SYSRND,3)) == 9 then [POP]=updateENERGY(SYSRND,YO,XO,POP,GRIDSPC,SHOW), end
           
   if SHOW==1 then disp('BEFORE isequal'), printf('YN = %d ',YN), printf('XN= %d ',XN),end
             
             if isequal(GRIDSPC(YN, XN),'.')  then 
                 
                 
   if SHOW==1 then disp('BEFORE DELETE SYSTEM'), printf('YO = %d ',YO), printf('XO= %d ',XO),end
   
                 GRIDSPC(YO,XO)='.'  //Delete old system
                 
    if SHOW==1 then disp(GRIDSPC), end
                 
                 
   if SHOW==1 then disp('BEFORE UPDATE OLD YO XO'), end
                  
                 POP(SYSRND,3)=sci2exp(YN) //Update Y-X-coordinates
                 POP(SYSRND,4)=sci2exp(XN) 
                 
                 
   if SHOW==1 then disp('BEFORE NEW PLACEMENT OF SYSTEM'), end
   
                 GRIDSPC(YN,XN)=POP(SYSRND,2),//Place system at new position
                 end
             end
     
    end

endfunction



Gerd Doeben-Henisch 2014-01-14