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,是否不是有效路线
//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))李>
- 我能想到的最好的办法是: