Skip to content

Social Influence tramite rete spaziale / k-NN in Mesa #46

@apierr

Description

@apierr

Promemoria: Implementazione Social Influence tramite rete spaziale / k-NN in Mesa

1️⃣ Setup dello spazio

Usa ContinuousSpace di Mesa per posizionare gli agenti con coordinate fisiche.

from mesa.space import ContinuousSpace

# Creazione dello spazio (100x100 unità, non toroidale)
space = ContinuousSpace(width=100, height=100, torus=False)

# Posiziona ogni agente nello spazio
for agent in model.schedule.agents:
    space.place_agent(agent, (agent.x, agent.y))

2️⃣ Rete spaziale (radius network)

Ogni agente si connette a tutti gli agenti entro un raggio r.

def get_neighbors_radius(agent, r):
    neighbors = space.get_neighbors(pos=(agent.x, agent.y), radius=r, include_center=False)
    return neighbors

# Esempio utilizzo
raggio = 10  # unità di distanza
vicini = get_neighbors_radius(agent, raggio)

Vantaggi: realistico per comunità urbane / vicinato.


3️⃣ Rete k-NN (k nearest neighbors)

Ogni agente si connette ai k agenti più vicini.

import numpy as np

def get_k_nearest(agent, k):
    all_agents = [a for a in model.schedule.agents if a != agent]
    all_positions = np.array([(a.x, a.y) for a in all_agents])
    distances = np.linalg.norm(all_positions - np.array([agent.x, agent.y]), axis=1)
    nearest_indices = distances.argsort()[:k]
    nearest_agents = [all_agents[i] for i in nearest_indices]
    return nearest_agents

# Esempio utilizzo
k = 5
vicini_knn = get_k_nearest(agent, k)

Vantaggi: garantisce che ogni agente abbia sempre k vicini, evita agenti isolati.


4️⃣ Social Influence Formula

Una volta determinati i vicini, l’influenza sociale può essere calcolata come:

def social_influence(agent, neighbors):
    # frazione di vicini adottanti
    if len(neighbors) == 0:
        return 0.0
    return sum([1 for n in neighbors if n.adoption == 1]) / len(neighbors)

# Esempio utilizzo
S_i = social_influence(agent, vicini)

Nota: S_i(t) sarà poi combinata nella probabilità di adozione:
[
P(A_i(t)=1) = \sigma(w_C C_i + w_I I_i + w_S S_i)
]


5️⃣ Suggerimenti pratici

  • Per comunità piccole: raggio di 10–20 unità oppure k=5 sono valori plausibili.
  • Controlla agenti isolati (nessun vicino) nella rete spaziale.
  • Entrambe le opzioni sono facilmente integrabili nel loop principale di Mesa.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions