@Override
  public List<Cloudlet> cloudletAssign(List<Cloudlet> cloudletList, List<Vm> vmList) {
    if (vmList != null || vmList.size() != 0) {
      List<Cloudlet> toAssignCloudletList = getToAssignCloudletList(cloudletList); // 初始化等待分配任务队列
      if (toAssignCloudletList.size() < 1) { // 没有等待分配的任务,返回空列表
        return null;
        //				System.exit(0);
      }

      int m = vmList.size(); // 虚拟机数
      int n = toAssignCloudletList.size(); // 即将分配任务列表数
      int maxCloudletsWaitingLength = vQueueSize.getMaxLength(); // 子任务队列最大长度
      List<Map<String, Integer>> vmWaitingQueueSizeList =
          initVmWaitingQueueSizeList(); // 初始化虚拟子队列队长列表

      /*
       * Log.printLine("Queue size Print Before n=" + n); for (int i = 0;i
       * < m; i++) { Log.print(vmWaitingQueueSizeList.get(i).get("size") +
       * " "); } Log.printLine("\nvirQueueSize"); for (int i = 0; i < m;
       * i++) { Log.print(virQueueSize.get(i) + " "); }
       */

      int i;
      int numFreeVm = m; // 空闲的vm数
      List<Map<String, Integer>> tmpSizeList =
          updateTmpSizeList(-1, numFreeVm, vmWaitingQueueSizeList); // 临时队列
      for (i = 0; i < n; i++) { // 分配任务到适合的虚拟机
        int index = createAction(numFreeVm, tmpSizeList);
        int mSize = tmpSizeList.get(index).get("size");
        if (mSize >= maxCloudletsWaitingLength) { // 若选择的队列满了,去掉这个队列,重新选择

          if (numFreeVm > 1) { // 如果空闲的队列数还可以减为1或以上,则更新临时队列,即抛掉已满的队列
            tmpSizeList = updateTmpSizeList(index, numFreeVm--, tmpSizeList);
            //						System.out.println(numFreeVm);
            i--;
            continue;
          } else { // 所有虚拟机的等待队列都满了
            Log.printLine("mSize=50 list(0):" + mSize);
            break;
          }

          //					//寻找最空的队列作为要分配云任务的目的vm
          //					for (int j = 0, tmp = maxCloudletsWaitingLength + 1; j < m; j++) {
          //						if (tmp > vmWaitingQueueSizeList.get(j).get("size")) {
          //							tmp = vmWaitingQueueSizeList.get(j).get("size");
          //							index = j;
          //						}
          //					}
          //					mSize = vmWaitingQueueSizeList.get(0).get("size");

          //					//非排序手法获取最空队列的mSize
          //					mSize = vmWaitingQueueSizeList.get(index).get("size");
          //					if (mSize >= maxCloudletsWaitingLength) {
          //						Log.printLine("mSize=50 list(0):" + mSize);
          //						break;
          //					}

        }

        /*
         * Log.printLine("\nLOOP I:" + i); for (int j = 0; j < m; j++) {
         * Log.print(vmWaitingQueueSizeList.get(j).get("size") + " "); }
         */

        // System.out.println("一个云任务分配Vm成功");
        //				int id = vmWaitingQueueSizeList.get(index).get("id");
        int id = tmpSizeList.get(index).get("id"); // 被选中的虚拟机的id

        if (vQueueSize.increment(id)) { // 决断是否能正确分配到被选中的虚拟机中,虚拟机的子队列队长队长加一
          tmpSizeList.get(index).put("size", ++mSize); // 更新临时虚拟机等待队列长度列表状态
          for (int j = 0; j < m; j++) { // 更新虚拟机等待队列长度列表状态
            if (vmWaitingQueueSizeList.get(j).get("id") == tmpSizeList.get(index).get("id")) {
              vmWaitingQueueSizeList.get(j).put("size", mSize);
              index = j;
              break;
            }
          }
          toAssignCloudletList.get(i).setVmId(id); // 将该任务分配给被选中的虚拟机

          updateQList(index, m, vmList, vmWaitingQueueSizeList); // 更新Q值表
          /*
           * Log.printLine("Cloudlet#" +
           * toAssignCloudletList.get(i).getCloudletId() + " vmid" +
           * toAssignCloudletList.get(i).getVmId() + "VM#" + id +
           * " size:" + vQueueSize.getQueueSize().get(id)); /* if
           * (mSize == 50) Log.printLine("size==50 Vm#" + id +
           * " Cloudlet#" +
           * toAssignCloudletList.get(i).getCloudletId() + " itsVmid "
           * + toAssignCloudletList.get(i).getVmId());
           */

          // Log.printLine("Two Sizes:"
          // + vQueueSize.getQueueSize().get(id) + " "
          // + vmWaitingQueueSizeList.get(index).get("size"));
        } else { // 被选中的虚拟机的等待队列已满
          Log.printLine(
              index
                  + "Index Assign Full Error!! Vm#"
                  + id
                  + " mSize:"
                  + mSize
                  + " vQueueSize:"
                  + vQueueSize.getQueueSize().get(id));
          System.exit(0);
        }
      }

      List<Cloudlet> assignedCloudletList =
          getAssignedCloudletList(i, toAssignCloudletList); // 获取被成功分配的任务列表

      finishAssign(toAssignCloudletList); // 结束分配

      Log.printLine(
          "Assign Finished! Left:"
              + getGlobalCloudletWaitingQueue().size()
              + " Success:"
              + assignedCloudletList.size());

      return assignedCloudletList;

    } else { // 没有可用的虚拟机
      Log.printLine("VmCloudletAssignerLearning No VM Error!!");
      return null;
    }
  }