Как установить ограничение между роботами для сверления печатной платы с несколькими роботами (Or Tools Vehicle Routing) - PullRequest
0 голосов
/ 21 февраля 2020

Постановка проблемы: я пробую Google или инструменты для сверления печатной платы с 4 роботами (проблема). Все роботы начнут работу одновременно. Все позиции роботов расположены по четырем углам доски. после завершения сверления необходимо вернуться в исходное положение. Я преобразовал расстояние во время.

Цель состоит в том, чтобы выяснить минимальное время в пути для каждого робота с минимальной разницей в перемещении между всеми роботами.

Роботы с именами TopLeft, TopRight, BottomL, BottomR.

Ограничения:

Всегда должен соблюдаться минимальный зазор между роботами. если он ближе, один робот должен ждать или отойти от другого робота. Каждый робот может покрывать 70% высоты и ширины от своего положения. Например. В любой момент сверху слева не разрешено выезжать за пределы TopRight. Я использовал метод маршрутизации транспортного средства с несколькими начала и конца. И назначил робота для каждого отверстия (в зависимости от его положения).

`RoutingIndexManager manager = new RoutingIndexManager (DrillCount, data.RobotNumber, data.StartPositions, data.StartPositions);

    RoutingModel model = new RoutingModel(manager);

    int transitCall = model.RegisterTransitCallback((long fromIndex, long toIndex) => {
        var fromNode = manager.IndexToNode(fromIndex);
        var toNode = manager.IndexToNode(toIndex);

        return data.DistanceMatrix[fromNode, toNode];
    });

    model.SetArcCostEvaluatorOfAllVehicles(transitCall);

    model.AddDimension(transitCall, 0, 9000, true, "TavelTime");
    RoutingDimension timeDimension = model.GetMutableDimension("TavelTime");
    timeDimension.SetGlobalSpanCostCoefficient(700);


    for (int i=0;i< drillPoints.Length; i++)
    {
        var index = manager.NodeToIndex(i);

        List<long> allowedRobots = new List<long>();
        allowedRobots.Add(-1);

        //Robots Allowed
        for(int k=0;k< robots.Count; k++)
        {
            var distY = Math.Abs(robots[k].Y - drillPoints[i].Y);
            var distX  = Math.Abs(robots[k].X - drillPoints[i].X);

            if(distX< ModelConfig.ToolXMove && distY < ModelConfig.ToolYMove)
            {
                allowedRobots.Add(k);
            }
        }

        model.VehicleVar(index).SetValues(allowedRobots.ToArray());
    }`

Мне нужно применить первое и третье ограничение. Моя идея состоит в том, чтобы

ограничить два соседних отверстия, просверленных разными роботами, когда суммарное время перемещения составляет менее 5 секунд.

Сохранение индекса положения каждой точки сверления. Положение X каждой точки сверления на определенном интервале меньше или больше в зависимости от роботов.

было бы здорово, если бы вы могли предложить правильные методы или альтернативное решение этой проблемы.

спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...