Пример #1
0
        /// <summary>
        /// Runs the ExportVehicleRequest.
        /// This will spawn a export vehicle and will try to make a tasks for robots to move refined crates stored on a export storage nodes to the export vehicle to fill it up so closes as posible to its maximal weight capacity.
        /// Returns true if succesfully completed.
        /// </summary>
        public bool RunTask(Model w)
        {
            //Spawn export vehicle:
            if (exportVehicle == null)
            {
                exportVehicle = new ExportVehicle(x, y, z, 0, Math.PI, 0);
                w.worldObjects.Add(exportVehicle);
                exportVehicle.Move(exportVehicle.x, exportVehicle.y, exportVehicle.z);
            }
            //Make tasks for robots if vehicle has arrived:
            if (exportVehicle.CheckArrived())
            {
                //Find filled export storage nodes and order them by the weight of the crates in the nodes:
                List <StorageNode> filledRefinedStorageNodes = new List <StorageNode>();
                foreach (Node node in w.nodeGrid.nodes)                 //WARNING!!! could lead to "change to collections" exeption, but i doubt it.
                {
                    if (node is StorageNode)
                    {
                        if (!((StorageNode)node).CheckImport() && ((StorageNode)node).GetIsDone())
                        {
                            filledRefinedStorageNodes.Add((StorageNode)node);
                        }
                    }
                }
                if (filledRefinedStorageNodes.Count() == 0)
                {
                    return(false);
                }
                filledRefinedStorageNodes = filledRefinedStorageNodes.OrderBy(node => node.GetCrate().weight).ToList();

                //Loop that creates tasks for robots to move crates to the export vehicle with the found filled refined storage nodes:
                int lastWeight = -1;
                while (filledRefinedStorageNodes.Count() != 0)
                {
                    bool lowestvalue = true;
                    for (int i = 0; i < filledRefinedStorageNodes.Count(); i++)
                    {
                        //Export vehicle is almost full, will try fill it as full as possible:
                        if (exportVehicle.assignedWeightLeft <= 10)
                        {
                            bool enoughChoice = filledRefinedStorageNodes.Count() >= 3;
                            int  biggestW = 0, biggestP = -1;
                            for (int j = 0; j < filledRefinedStorageNodes.Count(); j++)
                            {
                                int weightOnNode = filledRefinedStorageNodes[j].GetCrate().weight;
                                if (exportVehicle.assignedWeightLeft == weightOnNode)
                                {
                                    StorageNode pickUpTarget = filledRefinedStorageNodes[j];
                                    w.tasksForRobot.Add(new TaskForRobot(pickUpTarget.position, new double[] { 1, -25 }, pickUpTarget.GetCrate(), (PickUpTarget)pickUpTarget, (DropOffTarget)exportVehicle));
                                    pickUpTarget.SetIsDone();
                                    exportVehicle.AssignWeight(weightOnNode);
                                    return(true);
                                }
                                else if (enoughChoice)
                                {
                                    if (weightOnNode > biggestW && weightOnNode < exportVehicle.assignedWeightLeft)
                                    {
                                        biggestP = j;
                                        biggestW = weightOnNode;
                                    }
                                }
                            }
                            if (biggestP != -1)
                            {
                                StorageNode pickUpTarget = filledRefinedStorageNodes[biggestP];
                                w.tasksForRobot.Add(new TaskForRobot(pickUpTarget.position, new double[] { 1, -25 }, pickUpTarget.GetCrate(), (PickUpTarget)pickUpTarget, (DropOffTarget)exportVehicle));
                                filledRefinedStorageNodes.RemoveAt(biggestP);
                                pickUpTarget.SetIsDone();
                                exportVehicle.AssignWeight(biggestW);
                            }
                            else
                            {
                                exportVehicle.LoadWeight(exportVehicle.assignedWeightLeft);
                                return(true);
                            }
                        }
                        //Export vehicle has more than enough space, fill the export vehicle with biggest weight to smallest weight, a smaller weight each time.
                        //this until lowest weight has been found, than this will sart over again:
                        else if (filledRefinedStorageNodes[i].GetCrate().weight < lastWeight || lastWeight == -1)
                        {
                            StorageNode pickUpTarget = filledRefinedStorageNodes[i];
                            w.tasksForRobot.Add(new TaskForRobot(pickUpTarget.position, new double[] { 1, -25 }, pickUpTarget.GetCrate(), (PickUpTarget)pickUpTarget, (DropOffTarget)exportVehicle));
                            lastWeight = pickUpTarget.GetCrate().weight;
                            pickUpTarget.SetIsDone();
                            exportVehicle.AssignWeight(lastWeight);
                            filledRefinedStorageNodes.RemoveAt(i);
                            lowestvalue = false;
                            break;
                        }
                    }
                    if (lowestvalue == true)
                    {
                        lastWeight = -1;
                    }
                }
            }
            return(false);
        }
 /// <summary>
 /// Runs the PickUpUnRefinedCrateRequest.
 /// This will try to make a task for a robot to move a unrefined crate on a inport storage node to a refinery with space left.
 /// Returns true if succesfully completed.
 /// </summary>
 /// <param name="w"></param>
 /// <returns></returns>
 public bool RunTask(Model w)
 {
     foreach (Object3D obj in w.worldObjects)
     {
         if (obj is Refinery)
         {
             if (((Refinery)obj).CheckForSpaceLeft())
             {
                 w.tasksForRobot.Add(new TaskForRobot(node.position, new double[] { -25, -1 }, node.GetCrate(), (PickUpTarget)node, (DropOffTarget)obj));
                 return(true);
             }
         }
     }
     return(false);
 }