/// <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); }
/// <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); }
/// <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); } }
/// <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; } } } }