{
  "metadata": {
    "language_info": {
      "codemirror_mode": {
        "name": "python",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8"
    },
    "kernelspec": {
      "name": "python",
      "display_name": "Python (Pyodide)",
      "language": "python"
    }
  },
  "nbformat_minor": 4,
  "nbformat": 4,
  "cells": [
    {
      "cell_type": "markdown",
      "source": "Ein mögliches Multiagentensystem, das die Grammatik mit zwei wechselseitig handelnden Softwareagenten Agent-K für \"Käufer\" und Agent-V für \"Verkäufer\" nutzt, könnte folgendermaßen implementiert werden:",
      "metadata": {}
    },
    {
      "cell_type": "code",
      "source": "import random\n\n# Definition der Grammatikregeln\nw3 = {\n    \"anfang\": [(100, [\"s\", \"vkg\"])],\n    (\"s\", \"vkg\"): [(100, \"ende\")]\n}\n\nbbd = {(\"kbbd\",): [(100, \"vbbd\")]}\n\nba = {(\"kba\",): [(100, \"vba\")]}\n\nae = {(\"kae\",): [(100, \"vae\")]}\n\naa = {(\"kaa\",): [(100, \"vaa\")]}\n\nb = {(\"s\", \"bbd\"): [(100, (\"s\", \"ba\"))]}\n\na = {(\"s\", \"ae\"): [(50, (\"s\", \"ae\")), (100, (\"s\", \"aa\"))]}\n\nvt = {(\"s\", \"b\"): [(50, (\"s\", \"b\")), (100, (\"s\", \"a\"))]}\n\nbg = {(\"kbg\",): [(100, \"vbg\")]}\n\nav = {(\"kav\",): [(100, \"vav\")]}\n\nvkg = {(\"s\", \"bg\"): [(100, (\"s\", \"vt\"))],\n        (\"s\", \"vt\"): [(50, (\"s\", \"vt\")), (100, (\"s\", \"av\"))]}\n\n# Definition der Agentenklasse\nclass Agent:\n    def __init__(self, name, grammar, starting_rule):\n        self.name = name\n        self.grammar = grammar\n        self.rule_probs = self.compute_rule_probs()\n        self.current_rule = starting_rule\n        \n    def compute_rule_probs(self):\n        rule_probs = {}\n        for rule in self.grammar:\n            rule_probs[rule] = [x[0] for x in self.grammar[rule]]\n            total_prob = sum(rule_probs[rule])\n            rule_probs[rule] = [x / total_prob for x in rule_probs[rule]]\n        return rule_probs\n    \n    def update_rule(self, input_symbol):\n        possible_rules = [x for x in self.rule_probs if input_symbol in x]\n        if not possible_rules:\n            return\n        self.current_rule = random.choices(possible_rules, weights=self.rule_probs[possible_rules[0]])[0]\n        \n    def generate_output(self):\n        output = []\n        for symbol in self.current_rule:\n            if isinstance(symbol, tuple):\n                output.extend(Agent(symbol[0], globals()[symbol[0]], symbol))\n            else:\n                output.append(symbol)\n        return output\n    \n# Definition des Multiagentensystems\nclass MultiAgentSystem:\n    def __init__(self, agent_k, agent_v):\n        self.agents = {\"K\": agent_k, \"V\": agent_v}\n        \n    def communicate(self, input_sequence):\n        agent_k_output = self.agents[\"K\"].generate_output()\n        agent_v_output = self.agents[\"V\"].generate_output()\n        \n        current_agent = self.agents[\"K\"]\n        output_sequence = []\n        \n        for symbol in input_sequence:\n            current_agent.update_rule(symbol)\n            output_sequence.extend(current_agent.generate_output())\n            if current_agent == self.agents[\"K\"]:\n                current_agent = self.agents[\"V\"]\n            else:\n                current_agent = self.agents[\"K\"]\n        \n        return output_sequence\n\n# Beispielanwendung\nagent_k = Agent(\"s\", globals()[\"s\"], (\"s\", \"vkg\"))\nagent_v = Agent(\"s\", globals()[\"s\"], (\"s\", \"vkg\"))\n\nmas = MultiAgentSystem(agent_k, agent_v)\n\ninput_sequence\n",
      "metadata": {},
      "execution_count": null,
      "outputs": []
    }
  ]
}