Verbundene Agents in Rhai lesen
Verbundene Agents in Rhai lesen
In Metapad koordinieren sich Agents über den Graphen selbst — sie lesen den Zustand der jeweils anderen über ihre Links. Es gibt kein Message-Passing, kein Ereignissystem; nur direkte Lesezugriffe. So bleibt jede Interaktion im Modell sichtbar, und Simulationen lassen sich leicht debuggen, weil alles Wichtige auf dem Diagramm steht.
get_connected — der grundlegende Durchlauf
let teammates = get_connected(agent, "belongs_to");
get_connected liefert ein Array von Agents zurück, die vom aktuellen Agent über einen bestimmten Beziehungstyp erreichbar sind. Es läuft den Link in beide Richtungen ab, sodass derselbe Aufruf funktioniert, egal ob Ihr Agent die Quelle oder das Ziel der Beziehung ist. Sobald Sie ein Array haben, können Sie alles tun, was die Array-Methoden von Rhai unterstützen:
teammates.len() // zählen
teammates.filter(|a| a.get_prop("role") == "Eng") // Teilmenge
sum_prop und count_prop — gängige Aggregationen
Für die beiden häufigsten Muster — das Summieren einer numerischen Eigenschaft über das Array oder das Zählen von Agents mit einem bestimmten Wert — stellt Metapad Abkürzungen bereit:
sum_prop(get_connected(agent, "has_member"), "salary")
count_prop(get_connected(agent, "has_member"), "state", "Active")
Genau das brauchen Sie für KPI-Rollups, Personalstärke, Gesamtkosten, Gesamtumsatz — überall dort, wo ein übergeordneter Agent seine untergeordneten zusammenfassen muss.
Die Vergangenheit lesen
Manche Prozesse haben natürliche Zeitverzögerungen — eine Fabrik versendet heute, das Lager empfängt morgen. Die Drei-Argument-Form von get_connected lässt eine Formel sehen, wie ihre Nachbarn vor einem oder mehreren Zeitschritten aussahen:
// Was die verbundenen Fabriken vor einem Tick versendet haben
sum_prop(get_connected(agent, "supplied_by", -1), "shipped")
Das ist das berühmte Beergame-Muster: Die Lagernachfrage zum Zeitpunkt T zieht aus den Fabriklieferungen bei T−1 und modelliert die Lieferzeit als strukturelles Merkmal des Modells, statt als etwas, das Sie zu kodieren nicht vergessen dürfen.
Ein ausgearbeitetes Beispiel: Limits to Growth
Stellen Sie sich eine Population vor, deren Wachstum durch eine endliche Tragfähigkeit begrenzt ist. Das Intro-Modell hat genau dieses Setup. Der Wachstumsfaktor wird durch einen verbundenen Resource Adequacy-Knoten angepasst:
// Wachstumsrate, angepasst durch die verbundene Ressourcenverfügbarkeit
let resources = get_connected(agent, "limit_growth");
let resource_factor = if resources.len() > 0 {
resources[0].get_prop("value")
} else {
1.0
};
agent.get_prop("growth_factor") * resource_factor
Dieselbe Formel funktioniert, egal ob es einen Ressourcenknoten oder mehrere gibt — und die Ressourcenerschöpfung verlangsamt das Wachstum automatisch, ohne dass jemand ein explizites "Ressource erschöpft"-Ereignis verdrahten muss.
Tipps
- Halten Sie den Graphen ehrlich. Wenn sich zwei Agents koordinieren müssen, zeichnen Sie den Link. Versteckte Koordination über Namenskonventionen oder externen Zustand ist viel schwerer nachzuvollziehen.
- Bevorzugen Sie Aggregationen gegenüber Schleifen.
sum_propundcount_propdecken die meisten Fälle ab und sind klarer als eine manuellefor-Schleife. - Lesen Sie den Verlauf sparsam. Die Offsets
-1/-2sind mächtig, aber jeder Offset bringt im Hintergrund etwas Buchführung mit sich. Verwenden Sie sie für echte Verzögerungen, nicht um zirkuläre Abhängigkeiten zu übertünchen.
Nächste Schritte
- Eigenschaftsformeln schreiben — wo diese Lesezugriffe typischerweise leben
- Act-Methoden schreiben — wenn der Lesezugriff eine Aktualisierung mehrerer Eigenschaften anstoßt
- Simulationsfehler und -warnungen diagnostizieren — wenn Lesezugriffe überraschende Werte liefern
- Rhai-Funktionsreferenz — vollständige Signaturen für jeden Helfer
Live ausprobieren
Öffnen Sie diese funktionierenden Beispiele in der App und erkunden Sie sie selbst.