基于CS模式的多智能体系统总体框架

一个MAS的仿真项目的总体设计框架,从最底层的设计开始,总结一个大体的设计思路。

首先确定CS结构的模式,Server发送并且接受来自Client的通讯消息,确定双方的通讯内容和格式,以msg代表双方的交流信息。Server和Client之间通过UDP进行信息交互。

MAS系统中Agent智能体是单独存在的个体,每个Clinet上运行一个单独的Agent个体。

Client主要负责与Server之间的通讯,接收来自Server的信息,并维护一个Agent的运行环境。

首先main开始

1,初始化BasicClient client。构造一个SamplePlayer agent ,对Agent进行初始化处理,initImpl,用于分析一些必要的初始化信息,包括Agent参数及相关预处理。

 rcsc::BasicClient client;
 
  
    if ( ! agent.init( &client, argc, argv ) )
    {
        return EXIT_FAILURE;
    }
client.run( &agent );
 
  

2,Agent初始化成功后,client.run(&agent), 由client客户端运行agent类, client获取Server状态并判断其所附属的Agent应该运行的类型,在线运行或者离线等类型。

 if ( clientMode() == ONLINE )
    {
        runOnline( agent );
    }
    else 
    {
        runOffline( agent );
    }

3,当Server处于激活状态时,Client 使用select()方法来获取来自Server的通讯信息,并由该Agent来执行对信息的处理。 部分代码如下:

while ( isServerAlive() )
    {
        read_fds = read_fds_back;
        interval.tv_sec = M_interval_msec / 1000;
        interval.tv_usec = ( M_interval_msec % 1000 ) * 1000;
 
  
        int ret = ::select( M_socket->fd() + 1, &read_fds,
                            static_cast< fd_set * >( 0 ),
                            static_cast< fd_set * >( 0 ),
                            &interval );
        if ( ret < 0 )
        {
            perror( "select" );
            break;
        }
        else if ( ret == 0 )
        {
            // no meesage. timeout.
            waited_msec += M_interval_msec;
            ++timeout_count;
            agent->handleTimeout( timeout_count,
                                  waited_msec );
        }
        else
        {
            // received message, reset wait time
            waited_msec = 0;
            timeout_count = 0;
            agent->handleMessage();
        }
    }
4,由Agent类来执行对信息的解析,并根据解析得到的信息对相关内容进行分析和计算

 while ( M_client->recvMessage() > 0 )
    {
        ++counter;
        parse( M_client->message() );  // 处理从Client获取到的信息,其实是Client从Server所获取到的信息
    }
5, 当处理完所有的信息之后,Agent进入思考决策状态,生成自身决策并对决策进行执行。

 if ( M_impl->think_received_ )
    {
        dlog.addText( Logger::SYSTEM,
                      __FILE__" (handleMessage) Got think message: decide action" );
        action();
        M_impl->think_received_ = false;
    }

6,进行动作决策action()函数,之前需要进行的是一些自身模型的更新和维护,然后根据自身对外界条件的感知和自身的决策逻辑进行动作的决策和执行

    actionImpl(); 
    M_impl->doArmAction();
    M_impl->doViewAction();
    M_impl->doNeckAction();
    communicationImpl();

以上就是很简单的一个总体框架,思路还算清晰,其中的每一个部分拆分出来都是很复杂的一个模块,从信息接受到信息解析到动作决策和执行,以及执行之后的动作反馈都比较复杂。

这也是这两年工作的一个积累,从复杂做到简单,又从简单重新认识到复杂,也算是一种循序渐进的进步。

以上只是一个Agent,至于多个Agent之间的通讯和协作,只需要创建多个Client并且增加Agent之间的通讯机制就可以实现。


你可能感兴趣的:(基于CS模式的多智能体系统总体框架)