示例#1
0
        /// <summary>
        /// 从备选智能体中选择下一个智能体,选择标准是最大化当前联盟值
        /// </summary>
        /// <param name="PreCoaMemList">备选智能体集合</param>
        /// <returns>返回被选中参加联盟的智能体</returns>
        private CoaMembers AddAgent(List <CoaMembers> PreCoaMemList, List <CoaMembers> reservedAgents)
        {
            if (reservedAgents.Count == 0)
            {
                return(null);
            }
            CoaMembers newCm = new CoaMembers();
            float      valueOfCoa, valueIni;

            valueIni = 0;
            if (PreCoaMemList != null && PreCoaMemList.Count != 0)
            {
                PreCoaMemList.Add(reservedAgents[0]);
                valueIni = valueOfCoalition(PreCoaMemList);
                newCm    = reservedAgents[0];
                PreCoaMemList.Remove(reservedAgents[0]);
            }
            for (int i = 1; i < reservedAgents.Count; i++)
            {
                if (!IsAgentInCoalition(PreCoaMemList, reservedAgents[i].agent))
                {
                    PreCoaMemList.Add(reservedAgents[i]);
                    valueOfCoa = valueOfCoalition(PreCoaMemList);
                    if (valueIni < valueOfCoa)
                    {
                        valueIni = valueOfCoa;
                        newCm    = reservedAgents[i];
                    }
                    PreCoaMemList.Remove(reservedAgents[i]);
                }
            }
            return(newCm);
        }
示例#2
0
        /// <summary>
        /// 多余智能体的分割
        /// </summary>
        /// <param name="aCoa">需要进行分割的联盟</param>
        public CoaMembers Split(List <CoaMembers> aCoa)
        {
            int        number = 0;
            CoaMembers agent = new CoaMembers();
            CoaMembers agentNew = new CoaMembers();
            float      value, valueOri;
            float      valueIni = value = valueOfCoalition(aCoa);

            valueOri = value;
            agent    = aCoa[0];
            aCoa.Remove(agent);
            valueIni = valueOri - valueOfCoalition(aCoa);
            aCoa.Insert(0, agent);
            for (int i = 1; i < aCoa.Count; i++)
            {
                agent = aCoa[i];
                aCoa.Remove(agent);
                value = valueOri - valueOfCoalition(aCoa);
                if (value > valueIni)
                {
                    valueIni = value;
                    number   = i;
                    agentNew = aCoa[i];
                }
                aCoa.Insert(i, agent);
            }
            return(agentNew);
        }
示例#3
0
        /// <summary>
        /// 信息发布者智能体选择
        /// 对每一个任务,将其附近空间距离最近的智能体作为其coalition最开始的集合
        /// 模拟任务发现发布过程的函数
        /// </summary>
        /// <param name="aList">全体智能体</param>
        public void CoalitionPreForm(ref List <Agent> aList)
        {
            ///探测范围在150之内的空闲agent都进行联盟结构搜索
            float f    = 0;
            float dis  = 0;
            int   mark = 0;

            dis = aList[0].DistComp(this);
            //选择离任务最近的智能体作为信息获取者
            for (int i = 0; i < aList.Count; i++)
            {
                if (aList[i].statusInCoalition == agentStatusInCoalition.IdleAgent && aList[i].list_Neighbors != null)
                {
                    f = aList[i].DistComp(this);
                    if (f < dis)
                    {
                        //如果第一个被通知的agent的邻居节点不为空,那么在它的邻居节点中进行coalition组建的消息传播
                        mark = i;
                        dis  = f;
                    }
                }
            }
            //选择离任务最近的智能体作为信息获取者
            if (mark != 0 || dis != 0)
            {
                potential_leader = aList[mark];
                aList[mark].statusInCoalition = agentStatusInCoalition.WaitingAgent;
                aList[mark].taskTaken         = this;
                CoaMembers m = new CoaMembers();
                m.agent        = aList[mark];
                m.rank         = 0;
                m.valueOfAgent = 0;
                pre_members.Add(m);
            }
            //
            else if (mark == 0 && dis == 0)
            {
                do
                {
                    Random ra = new Random();
                    int    j  = ra.Next(aList.Count);
                    if (aList[j].statusInCoalition == agentStatusInCoalition.IdleAgent && aList[j].list_Neighbors != null && j >= 0 && j < aList.Count)
                    {
                        potential_leader           = aList[j];
                        aList[j].statusInCoalition = agentStatusInCoalition.WaitingAgent;
                        aList[j].taskTaken         = this;
                        CoaMembers m = new CoaMembers();
                        m.agent        = aList[j];
                        m.rank         = 0;
                        m.valueOfAgent = 0;
                        pre_members.Add(m);
                        break;
                    }
                }while(potential_leader == null);
            }
        }
示例#4
0
        /// <summary>
        /// 联盟组队优化选择
        /// 考虑移动成本和到达时间进行选择
        /// </summary>
        public bool CoalitionOptimization(Task task, int step)
        {
            bool       flag = false;
            CoaMembers newCoalitionAgent = new CoaMembers();

            coaMembers = new List <CoaMembers>(0);
            //当备选智能体
            if (CoaAbilityCheck(task.pre_members))
            {
                do
                {
                    //获取新添加的智能体的ID
                    newCoalitionAgent = AddAgent(coaMembers, task.pre_members);
                    if (newCoalitionAgent == null)
                    {
                        return(false);
                    }
                    if (newCoalitionAgent.agent == null)
                    {
                        return(false);
                    }
                    if (!IsAgentInCoalition(coaMembers, newCoalitionAgent.agent))
                    {
                        newCoalitionAgent.agent.taskTaken = task;
                        coaMembers.Add(newCoalitionAgent);
                        pre_members.Remove(newCoalitionAgent);
                        flag = CoaAbilityCheck(coaMembers);
                        //如果联盟能力超过了要求,则进行联盟分解
                        if (!flag)
                        {
                            ablity ab = coaRequireCheck(coaMembers);
                            if (pre_members.Count != 0 && (ab.ablityX > requirement.ablityX || ab.ablityY > requirement.ablityY))
                            {
                                newCoalitionAgent = Split(coaMembers);
                                coaMembers.Remove(newCoalitionAgent);
                            }
                            //else
                            //    start_time = step + period_time;
                        }
                    }
                } while (!flag);
            }
            else
            {
                call_time = step + 1;
            }
            return(true);
        }
        /// <summary>
        /// 对任务状态进行更新
        /// </summary>
        /// <param name="step">当前时刻</param>
        private void UpdateOfAllTask(int step)
        {
            List <Task>       taskList      = new List <Task>(0);
            List <CoaMembers> coaMemberList = new List <CoaMembers>(0);

            foreach (Agent a in agentAll)
            {
                CoaMembers m = new CoaMembers();
                m.agent        = a;
                m.rank         = 0;
                m.valueOfAgent = 0;
                coaMemberList.Add(m);
            }
            for (int i = 0; i < task_UnderGoing.Count; i++)
            {
                //if (task_UnderGoing[i].IsTaskCompleted(step,ref coaMemberList))
                if (step >= task_UnderGoing[i].finishTime)
                {
                    task_UnderGoing[i].status = Task.taskStatus.completed;
                    task_Complete.Add(task_UnderGoing[i]);
                    taskList.Add(task_UnderGoing[i]);
                }
            }
            for (int i = 0; i < taskList.Count; i++)
            {
                if (task_UnderGoing.Contains(taskList[i]))
                {
                    task_UnderGoing.Remove(taskList[i]);
                }
            }
            foreach (CoaMembers m in coaMemberList)
            {
                for (int i = 0; i < agentAll.Count; i++)
                {
                    if (agentAll[i].ID == m.agent.ID)
                    {
                        agentAll[i] = m.agent;
                    }
                }
            }
        }