C# Google ORTools-可以';t共享同一路线(再次)

C# Google ORTools-可以';t共享同一路线(再次),c#,or-tools,C#,Or Tools,关于我以前的请求,我需要进一步问题的帮助:一条路线不能同时有两个以上的工作类别 条件如下: 节点A:工作类别1和工作类别2 节点B:工作类别3 节点C:工作类别1 节点D:工作类别2 解决方案: Depot>A>C>Depot,是有效的路线 Depot>B>D>Depot,是有效的路线 Depot>A>B>Depot,是否为有效路线 Depot>A>D>Depot,是有效的路线 Depot>B>C>D>Depot,是否不是有效路线 因此,车辆上的前两个工作类别必须排除添

关于我以前的请求,我需要进一步问题的帮助:一条路线不能同时有两个以上的工作类别

条件如下:

  • 节点A:工作类别1和工作类别2

  • 节点B:工作类别3

  • 节点C:工作类别1

  • 节点D:工作类别2

解决方案:

  • Depot>A>C>Depot,是有效的路线

  • Depot>B>D>Depot,是有效的路线

  • Depot>A>B>Depot,是否为有效路线

  • Depot>A>D>Depot,是有效的路线

  • Depot>B>C>D>Depot,是否不是有效路线

因此,车辆上的前两个工作类别必须排除添加具有不同工作类别的任何其他节点

谢谢你的建议

最好的,法比奥

#########################编辑#######################

。。。旧代码尝试使用动态工作类型时出错

#########################编辑2#######################

为了理解一些东西,我简化了上下文:只有3种工作类型

//work types for each nodes
long[][] worksMatrix = new long[5][];
worksMatrix[0] = new long[] { 0 };
worksMatrix[1] = new long[] { 1, 2 };
worksMatrix[2] = new long[] { 3 };
worksMatrix[3] = new long[] { 1 };
worksMatrix[4] = new long[] { 2 };

//1: meccanica (car mechanics work), 2: gomme (tires change\repair), 3: cristalli (car glass repair)

int meccanicaCallBack = routing.RegisterUnaryTransitCallback((long fromIndex) =>
{
    var fromNode = manager.IndexToNode(fromIndex);
    var nodeWorkTypes = model.WorksMatrix[fromNode];

    if (nodeWorkTypes.Contains(1))
        return 1;
    return 0;
});

routing.AddDimension(meccanicaCallBack, 0, 100, true, "meccanica");

int gommeCallBack = routing.RegisterUnaryTransitCallback((long fromIndex) =>
{
    var fromNode = manager.IndexToNode(fromIndex);
    var nodeWorkTypes = model.WorksMatrix[fromNode];

    if (nodeWorkTypes.Contains(2))
        return 1;
    return 0;
});

routing.AddDimension(gommeCallBack, 0, 100, true, "gomme");

int cristalliCallBack = routing.RegisterUnaryTransitCallback((long fromIndex) =>
{
    var fromNode = manager.IndexToNode(fromIndex);
    var nodeWorkTypes = model.WorksMatrix[fromNode];

    if (nodeWorkTypes.Contains(3))
        return 1;
    return 0;
});

routing.AddDimension(cristalliCallBack, 0, 100, true, "cristalli");
#########################编辑3#######################

像这样的?它似乎起作用了

for (int i = 0; i < model.MaxStops.Length; i++)
{
    var a = solver.MakeIsGreaterCstVar(meccanicaDim.CumulVar(routing.End(i)), 0);
    var b = solver.MakeIsGreaterCstVar(gommeDim.CumulVar(routing.End(i)), 0);
    var c = solver.MakeIsGreaterCstVar(cristalliDim.CumulVar(routing.End(i)), 0);

    IntVarVector abc = new IntVarVector();
    abc.Add(a);
    abc.Add(b);
    abc.Add(c);

    solver.Add(solver.MakeSumLessOrEqual(abc, 2));
}
for(int i=0;i
我能想到的最好办法是:

  • 为每个工作类型创建一个维度
  • 在每个节点上相应地增加它
  • 在车辆路线的末端:
    • 在每个维度上使用Solver.makeisgreatercsvar(cumul\u var\u表示工作类型,0)为每个工作类型创建一个布尔变量,指示此工作类型是否在路由上使用
    • Add(Solver.makesumlesorequal(bool_var_数组,2))
    • 我能想到的最好的办法是:

      • 为每个工作类型创建一个维度
      • 在每个节点上相应地增加它
      • 在车辆路线的末端:
        • 在每个维度上使用Solver.makeisgreatercsvar(cumul\u var\u表示工作类型,0)为每个工作类型创建一个布尔变量,指示此工作类型是否在路由上使用
        • Add(Solver.makesumlesorequal(bool_var_数组,2))

      谢谢@laurent的回答,我已编辑了我的问题以获得进一步帮助。您需要工人n路线终点的累积变量。@laurent我有类似问题,是否可以查看代码示例?不幸的是,我无法实现您的建议谢谢@laurent的回答,我已编辑了我的问题以获得进一步帮助。您需要工人n路线终点的cumul var。@laurent我有类似问题,是否可以查看代码示例?不幸的是,我无法实施你的建议