小整数程序似乎非常慢

时间:2020-04-10 08:39:16

标签: c# or-tools

我有许多不同交付时隙的剩余容量。达到0或以下容量会使一个时隙售罄。 我有固定数量的预留空间,应该以一定的方式在各个时隙之间分配预留空间,以使大多数时隙保持打开状态(大于0),并且不会导致容量小于0。如果一经使用就会发生这种情况,例如每秒多次。

现在,我的模型在到目前为止的测试范围内都可以正常工作,但是我必须确保性能非常好..花一秒钟的时间进行计算是不可接受的。我也总是有非常有限的时隙可以使用,所以它不像模型有时会获得成千上万的变量。

我的问题是..下面的示例代码如此之慢如此慢,是否有特定原因?我不认为它有很多变量。除了整数编程之外,我可以做的任何事情或必须考虑使用的东西。

请记住,此示例代码仅在所有插槽之间分配一个ReservationAmount。通常,将有许多不同的ReservationAmount编号映射到时隙的子集。因为这个原因,我不能仅仅创建一种将预留空间分配到具有最高剩余容量的时隙中的算法,因为重叠可以使这种算法预留出其他人要依赖其给定的ReservationAmount才能获得最佳分配的时隙。

var model = new CpModel();
var capacities = new int[] { 2, 3, 6, 9, 12, 5, 2, 7, 2, 3, 6, 9, 12, 5, 2, 7, 2, 3, 6, 9, 12, 5, 2, 7 };
capacities = capacities.Take(capacities.Count()).ToArray();
var reservationAmount = capacities.Sum() - 8;
var remainingCapacityExpressions = new List<LinearExpr>();
var reservationVars = new List<IntVar>();
for (var index = 0; index < capacities.Length; index++) {
  var resVar = model.NewIntVar(0, int.MaxValue, $"res_{index}");
  reservationVars.Add(resVar);

  var remainingCapacityExpression = capacities[index] - resVar;
  remainingCapacityExpressions.Add(remainingCapacityExpression);
}

model.Add(LinearExpr.Sum(reservationVars) == reservationAmount);

var lowestRemainingCapacityInPairsVars = new List<IntVar>();
for (var index = 0; index < capacities.Length; index++) {
  for (var index2 = index + 1; index2 < capacities.Length; index2++) {
    var remainingCapacityPairA = remainingCapacityExpressions[index];
    var remainingCapacityPairB = remainingCapacityExpressions[index2];

    var minVar = model.NewIntVar(int.MinValue, int.MaxValue, $"h_{index}_{index2}");

    // Objective maximization will force all minVar to be as high as allowed
    model.Add(minVar <= remainingCapacityPairA);
    model.Add(minVar <= remainingCapacityPairB);    

    lowestRemainingCapacityInPairsVars.Add(minVar);
  }
}

model.AddDecisionStrategy(
  lowestRemainingCapacityInPairsVars,
  DecisionStrategyProto.Types.VariableSelectionStrategy.ChooseHighestMax,
  DecisionStrategyProto.Types.DomainReductionStrategy.SelectMaxValue);

model.Maximize(LinearExpr.Sum(lowestRemainingCapacityInPairsVars));

// Creates a solver and solves the model.
var solver = new CpSolver();
var status = solver.Solve(model);

0 个答案:

没有答案
相关问题