В статье ниже я представил проблему Rendezvous сетевых систем управления:



И в моей последней статье я подробно описал аналитическое решение для упрощенного случая N = 2 агентов и предположил, каким может быть решение для произвольно большого числа агентов (центроид ищет закон управления):



В этой статье я предоставляю код для моделирования рандеву для произвольного числа агентов и произвольного количества измерений для пространства состояний. Однако для статьи я иллюстрирую рандеву в 1D и 2D.

Из вышеизложенного мы можем видеть, что сходимость к точке или рандеву действительно происходит, и два агента встречаются в своей средней точке, как и подсказывала нам математика! Из приведенного выше мы видим, что два агента сходятся к началу координат.

Опять же, два агента сходятся к исходной точке здесь, в 2D. Вы можете видеть, что агенты очень быстро сходятся, и точки начинают группироваться по мере того, как два агента приближаются к началу координат. Сходимость можно увеличить быстрее, выбрав большее значение гаммы.

Наконец, мы можем увидеть для этой симуляции агента N = 3, к какой 2D-точке сошлись три агента ниже. Теперь вернитесь к фазовому портрету, и вы увидите, что именно здесь точки начинают группироваться и подтверждают сближение или рандеву агентов!

Код рандеву, который вы можете получить:

def rendezvous(num_agents=10, num_dims=2, num_steps=100):
    """
    Takes in a specified number of agents, 
    the state space dimension, and the simulation steps
    and returns the state space trajectory of each 
    agent running our centroid seeking rendezvous local
    controllers. 
    """
    # random initial positions for all agents: 
    X_inits = np.random.rand(num_agents, num_dims)
    
    # Store state trajectories:
    Xs = np.zeros((num_agents, num_dims, num_steps))
    # Store initial positions
    Xs[:,:,0] = X_inits
    # For gamma take 1 over number of neighbors:
    gamma = 1/(num_agents-1)
    for k in range(1, num_steps):
        # Need double for loop to run Rendezvous: 
        for i in range(num_agents):
            for j in range(num_agents):
                if (j!= i):
                    Xs[i,:,k] += gamma*Xs[j,:,k-1] 
        
        
    return Xs

До скорого,

Калеб.

Подумайте о том, чтобы стать участником Medium, чтобы не пропустить ни одной из моих историй. Получите неограниченный доступ к моим произведениям и произведениям других авторов:



Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Вакансии для инженеров-программистов