Постановка проблемы: я пробую 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 каждой точки сверления на определенном интервале меньше или больше в зависимости от роботов.
было бы здорово, если бы вы могли предложить правильные методы или альтернативное решение этой проблемы.
спасибо