Überblick zum Experimentellen Rahmen, Fall zufällige System als Teil der Welt

Im Rahmen des bottom-up Vorgehens wird hier der experimentelle Rahmen zunächst am Beispiel einer Welt demonstriert, die eine Population von zufälligen Systemen als virtuelle Population - genannt POPRAND - managed. Den Kern bildet die Funktion $experimentRND()$:

//******************************************************************************
// experimentRND()
//
// Running a simple experiment with with purely random systems for some number RUN of cycles
//
// The WORLD consists of
//-----------------------
// -GRIDSPC := a certain prespecified grid
// -POP := a certain lis of systems inside the world
// -WIB := a world input buffer
// 
// The systems are represented by
//-------------------------------
// POPRAND := a list of dummy random systems

Während die Liste POP die teilnehemnden Systeme für die Welt repräsentiert, verwaltet die Liste POPRAND jene Systemparameter, die man braucht, um den Zustand eines zufälligen Systems in einer Welt zu simulieren.

In dem Experiment-Befehl $experimentRND()$ werden RUN-viele Zyklen ausgeführt.

Die Funktion insertPOP() plaziert die teilnehmenden Systeme zu Beginn auf ihren Startposotionen im vereinbarten Raum GRIDSPC. Dann beginnt eine Schleife mit einem Befehl, der die teilnehmenden Systeme über das World Input Buffer WIB mittels des Befehls randomWIB() simuliert. Aufgrund dieser Befehle in WIB werden dann mit dem Befehl newPOS() mögliche Aktionen berechnet einschliesslich möglicher neuer Positionen. Diese werden dann in zufälliger Reihenfolge mit dem Befehl newPOSPOS() abgearbeitet und - falls möglich - ausgeführt. Dann wird die Schleife so oft wiederholt, bis die Vorgabe durch die Variable RUN erreicht wird.

function [GRIDSPC,POP,POPRAND,WIB,k]=experimentRND(GRIDSPC, POP, WIB, POPRAND, RUN, SHOW) 
    
    
    if SHOW==1 then disp('BEFORE INSERT'),end
    
    //Insert systems into GRIDSPC
    [GRIDSPC]=insertPOP(GRIDSPC,POP)
    
    k=1
    while k < RUN
     
     
    if SHOW==1 then disp('BEFORE randomWIB'),disp(WIB),end
    
    
    //Generate random commands from the dummy systems
    [WIB, POPRAND]=randomWIB(WIB,POP,POPRAND,SHOW)
    
    
    if SHOW==1 then disp('BEFORE newPOS'),end
    
    //Compute possible new positions
    [POP] =newPOS(POP, WIB)
    
    
    if SHOW==1 then disp('BEFORE newPOSPOS'),end
    
    //Realize new moves if possible
    [POP,GRIDSPC] =newPOSPOS(POP,GRIDSPC,SHOW)
    
    disp('-------------------------------------------')
    disp('No =')
    disp(k)
    disp(GRIDSPC), disp(POPRAND)
    disp('-------------------------------------------')
    
    
    k=k+1
    end

endfunction

Da man in der Regel ein Experiment mehrmals wiederholen wird, um gewisse Trends oder Regelmäßigkeiten erkennen zu können, empfiehlt sich eine zusätzliche Funktion, die als Rahmen für solche Wiederholungen dienen kann. Diesem Zweck dient die Funktion $experimentRNDREP()$.

Die wesentlichen Parameter für den Rahmen sind einmal die Anzahl der Wiederholungen REPEAT, sowie ein Protokoll der wichtigsten Ergebnisse, hier HISTORY genannt. Aktuell enthält das Protokoll eine Identitätsnummer ID (korrespondiert mit der Liste POP), ein Zähler für Erfolge SUCCESS - wie oft ein Experiment 'überlebt' wurde -, einen Summierer für die gesammelte Energie aus jeder Runde SUMENERGY, sowie einen Zähler für die Anzahl der Wiederholungen REP.

//******************************************************************************
// experimentRNDREP()
//
// Repeating a certain experiment
//
// REPEAT := Number of repetitions
// HISTORY := Counting success and summing up collected energy
// HISTORY := [[ID, SUCCESS, SUMENERGY,REP]; ...]

Während der Rahmen selbst nur die Parameter REPEAT und HISTORY benötigt, braucht die intern aufgerufene Funktion $experimentRND()$ eine ganze Liste von Parametern. Diese müssen zunächst an den Rahmen übergeben werden, damit dieser diese dann an die 'innere' Funktion weiterreichen kann. Am Ende aller Experimente generiert der Rahmen anhand der Daten aus dem Protokoll HISTORY ein einfaches Balkendiagramm mit der anzahl der Erfolge pro System.

//******************************************************************************
// experimentRNDREP()
//
// Repeating a certain experiment
//
// REPEAT := Number of repetitions
// HISTORY := Counting success and summing up collected energy
// HISTORY := [[ID, SUCCESS, SUMENERGY,REP]; ...]



function [HISTORY]=experimentRNDREP(GRIDSPC, POP, WIB, POPRAND, RUN, REPEAT, SHOW) 
    
    [r,c]=size(POPRAND)
    
    HISTORY=zeros(r,4) //Set HISTORY to zeros
    
    for i=1:r
        HISTORY(i,1)=eval(POPRAND(i,1))
    end
    
    //Start loop for repetitions
    
    for i=1:REPEAT
        
        //Store the original values for repetitions
        
        GRID=GRIDSPC, 
        P=POP, 
        WB=WIB, 
        PRND=POPRAND,
        
        //Start with a copy of original values
        
       [GRID,P,PRND,WB,k]=experimentRND(GRID,P,WB, PRND,RUN, SHOW) 
     
        //Update HISTORY
        
           for j=1:r
               if eval(PRND(j,2)) > 0 then HISTORY(j,2)=HISTORY(j,2)+1, end
               HISTORY(j,3)=HISTORY(j,3)+eval(PRND(j,2))
               HISTORY(j,4)=HISTORY(j,4)+1
               
            end //End update HISTORY
        end //End loop repetitions
        
        clf()
        xdel()
        x=1:1:r
        plot2d3(x,HISTORY(:,2),rect=[0,0,r,REPEAT])
        

endfunction

Gerd Doeben-Henisch 2014-01-14