public static void Main(String[] args) { try { CP cp = new CP(); int sizeSquare = 112; int nbSquares = 21; int[] size = { 50, 42, 37, 35, 33, 29, 27, 25, 24, 19, 18, 17, 16, 15, 11, 9, 8, 7, 6, 4, 2 }; IIntervalVar[] x = new IIntervalVar[nbSquares]; IIntervalVar[] y = new IIntervalVar[nbSquares]; ICumulFunctionExpr rx = cp.CumulFunctionExpr(); ICumulFunctionExpr ry = cp.CumulFunctionExpr(); for (int i = 0; i < nbSquares; ++i) { x[i] = cp.IntervalVar(size[i], "X" + i); x[i].EndMax = sizeSquare; y[i] = cp.IntervalVar(size[i], "Y" + i); y[i].EndMax = sizeSquare; rx = cp.Sum(rx, cp.Pulse(x[i], size[i])); ry = cp.Sum(ry, cp.Pulse(y[i], size[i])); for (int j = 0; j < i; ++j) { cp.Add(cp.Or(cp.Le(cp.EndOf(x[i]), cp.StartOf(x[j])), cp.Or(cp.Le(cp.EndOf(x[j]), cp.StartOf(x[i])), cp.Or(cp.Le(cp.EndOf(y[i]), cp.StartOf(y[j])), cp.Le(cp.EndOf(y[j]), cp.StartOf(y[i])))))); } } cp.Add(cp.AlwaysIn(rx, 0, sizeSquare, sizeSquare, sizeSquare)); cp.Add(cp.AlwaysIn(ry, 0, sizeSquare, sizeSquare, sizeSquare)); ISearchPhase[] phases = new ISearchPhase[2]; phases[0] = cp.SearchPhase(x); phases[1] = cp.SearchPhase(y); cp.SetSearchPhases(phases); if (cp.Solve()) { for (int i = 0; i < nbSquares; ++i) { Console.WriteLine("Square " + i + ": [" + cp.GetStart(x[i]) + "," + cp.GetEnd(x[i]) + "] x [" + cp.GetStart(y[i]) + "," + cp.GetEnd(y[i]) + "]"); } } } catch (ILOG.Concert.Exception ex) { Console.WriteLine("Caught: " + ex); } }
public static void Main(String[] args) { workersUsage = cp.CumulFunctionExpr(); cash = cp.CumulFunctionExpr(); List <IIntExpr> ends = new List <IIntExpr>(); List <IIntervalVar> allTasks = new List <IIntervalVar>(); /* CASH PAYMENTS */ for (int p = 0; p < 5; ++p) { cash.Add(cp.Step(60 * p, 30000)); } MakeHouse(0, 31, ends, allTasks); MakeHouse(1, 0, ends, allTasks); MakeHouse(2, 90, ends, allTasks); MakeHouse(3, 120, ends, allTasks); MakeHouse(4, 90, ends, allTasks); cp.Add(cp.Le(0, cash)); cp.Add(cp.Le(workersUsage, nbWorkers)); cp.Add(cp.Minimize(cp.Max(ends.ToArray()))); /* EXTRACTING THE MODEL AND SOLVING. */ cp.SetParameter(CP.IntParam.FailLimit, 10000); if (cp.Solve()) { Console.WriteLine("Solution with objective " + cp.ObjValue + ":"); for (int i = 0; i < allTasks.Count; i++) { Console.WriteLine(cp.GetDomain(allTasks[i])); } int segs = cp.GetNumberOfSegments(cash); for (int i = 0; i < segs; i++) { Console.WriteLine( "Cash is " + cp.GetSegmentValue(cash, i) + " from " + cp.GetSegmentStart(cash, i) + " to " + (cp.GetSegmentEnd(cash, i) - 1) ); } } else { Console.WriteLine("No Solution found."); } }
public static void MakeHouse(CP cp, int id, List <IIntExpr> ends, List <IIntervalVar> allTasks, IStateFunction houseState) { /* CREATE THE TIME-INTERVALS. */ String name; IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; i++) { name = "H" + id + "-" + taskNames[i]; tasks[i] = cp.IntervalVar(taskDurations[i], name); workers = cp.Sum(workers, cp.Pulse(tasks[i], 1)); allTasks.Add(tasks[i]); } /* ADDING PRECEDENCE CONSTRAINTS */ cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[carpentry])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[plumbing])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[ceiling])); cp.Add(cp.EndBeforeStart(tasks[carpentry], tasks[roofing])); cp.Add(cp.EndBeforeStart(tasks[ceiling], tasks[painting])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[windows])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[windows], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[facade], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[garden], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[painting], tasks[moving])); /* ADDING STATE CONSTRAINTS */ cp.Add(cp.AlwaysEqual(houseState, tasks[masonry], dirty)); cp.Add(cp.AlwaysEqual(houseState, tasks[carpentry], dirty)); cp.Add(cp.AlwaysEqual(houseState, tasks[plumbing], clean)); cp.Add(cp.AlwaysEqual(houseState, tasks[ceiling], clean)); cp.Add(cp.AlwaysEqual(houseState, tasks[roofing], dirty)); cp.Add(cp.AlwaysEqual(houseState, tasks[painting], clean)); cp.Add(cp.AlwaysEqual(houseState, tasks[windows], dirty)); /* MAKESPAN */ ends.Add(cp.EndOf(tasks[moving])); }
public static void MakeHouse( int id, int rd, List <IIntExpr> ends, List <IIntervalVar> allTasks) { /* CREATE THE TIME-INTERVALS. */ String name; IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; ++i) { name = "H" + id + "-" + taskNames[i]; IIntervalVar task = cp.IntervalVar(taskDurations[i], name); tasks[i] = task; allTasks.Add(task); workersUsage = cp.Sum(workersUsage, cp.Pulse(task, 1)); cash = cp.Diff(cash, cp.StepAtStart(task, 200 * taskDurations[i])); } /* ADDING TEMPORAL CONSTRAINTS. */ tasks[masonry].StartMin = rd; cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[carpentry])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[plumbing])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[ceiling])); cp.Add(cp.EndBeforeStart(tasks[carpentry], tasks[roofing])); cp.Add(cp.EndBeforeStart(tasks[ceiling], tasks[painting])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[windows])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[windows], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[facade], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[garden], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[painting], tasks[moving])); /* DEFINING MINIMIZATION OBJECTIVE */ ends.Add(cp.EndOf(tasks[moving])); }
public static void Main(String[] args) { CP cp = new CP(); List <IIntExpr> ends = new List <IIntExpr>(); List <IIntervalVar> allTasks = new List <IIntervalVar>(); ITransitionDistance ttime = cp.TransitionDistance(2); ttime.SetValue(dirty, clean, 1); workers = cp.CumulFunctionExpr(); IStateFunction[] houseState = new IStateFunction[nbHouses]; for (int i = 0; i < nbHouses; i++) { houseState[i] = cp.StateFunction(ttime); MakeHouse(cp, i, ends, allTasks, houseState[i]); } cp.Add(cp.Le(workers, nbWorkers)); cp.Add(cp.Minimize(cp.Max(ends.ToArray()))); /* EXTRACTING THE MODEL AND SOLVING. */ cp.SetParameter(CP.IntParam.FailLimit, 10000); if (cp.Solve()) { for (int i = 0; i < allTasks.Count; i++) { Console.WriteLine(cp.GetDomain(allTasks[i])); } for (int h = 0; h < nbHouses; h++) { for (int i = 0; i < cp.GetNumberOfSegments(houseState[h]); i++) { Console.Write("House " + h + " has state "); int s = cp.GetSegmentValue(houseState[h], i); if (s == clean) { Console.Write("Clean"); } else if (s == dirty) { Console.Write("Dirty"); } else if (s == CP.NoState) { Console.Write("None"); } else { Console.Write("Unknown (problem)"); } Console.Write(" from "); if (cp.GetSegmentStart(houseState[h], i) == CP.IntervalMin) { Console.Write("Min"); } else { Console.Write(cp.GetSegmentStart(houseState[h], i)); } Console.Write(" to "); if (cp.GetSegmentEnd(houseState[h], i) == CP.IntervalMax) { Console.WriteLine("Max"); } else { Console.WriteLine((cp.GetSegmentEnd(houseState[h], i) - 1)); } } } } else { Console.WriteLine("No solution found. "); } }
public static void Main(String[] args) { String filename = "../../../../examples/data/rcpsp_default.data"; int failLimit = 10000; int nbTasks, nbResources; if (args.Length > 0) { filename = args[0]; } if (args.Length > 1) { failLimit = Convert.ToInt32(args[1]); } CP cp = new CP(); DataReader data = new DataReader(filename); try { nbTasks = data.Next(); nbResources = data.Next(); List <IIntExpr> ends = new List <IIntExpr>(); ICumulFunctionExpr[] resources = new ICumulFunctionExpr[nbResources]; int[] capacities = new int[nbResources]; for (int j = 0; j < nbResources; j++) { capacities[j] = data.Next(); resources[j] = cp.CumulFunctionExpr(); } IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; i++) { tasks[i] = cp.IntervalVar(); } for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; int d, nbSucc; d = data.Next(); task.SizeMin = d; task.SizeMax = d; ends.Add(cp.EndOf(task)); for (int j = 0; j < nbResources; j++) { int q = data.Next(); if (q > 0) { resources[j].Add(cp.Pulse(task, q)); } } nbSucc = data.Next(); for (int s = 0; s < nbSucc; s++) { int succ = data.Next(); cp.Add(cp.EndBeforeStart(task, tasks[succ - 1])); } } for (int j = 0; j < nbResources; j++) { cp.Add(cp.Le(resources[j], capacities[j])); } IObjective objective = cp.Minimize(cp.Max(ends.ToArray())); cp.Add(objective); cp.SetParameter(CP.IntParam.FailLimit, failLimit); Console.WriteLine("Instance \t: " + filename); if (cp.Solve()) { Console.WriteLine("Makespan \t: " + cp.ObjValue); } else { Console.WriteLine("No solution found."); } } catch (ILOG.Concert.Exception e) { Console.WriteLine(" ERROR: " + e); } }
//----- RCPSP Model creation ------------------------------------------------ private static void buildModel(String fileName) { int nbTasks, nbResources; DataReader data = new DataReader(fileName); try { nbTasks = data.Next(); nbResources = data.Next(); List <IIntExpr> ends = new List <IIntExpr>(); List <IConstraint> capacityCtList = new List <IConstraint>(); List <IConstraint> precedenceCtList = new List <IConstraint>(); ICumulFunctionExpr[] resources = new ICumulFunctionExpr[nbResources]; int[] capacities = new int[nbResources]; for (int j = 0; j < nbResources; j++) { capacities[j] = data.Next(); resources[j] = cp.CumulFunctionExpr(); } IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; i++) { tasks[i] = cp.IntervalVar(); tasks[i].Name = "ACT" + i; } for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; int d, smin, emax, nbSucc; d = data.Next(); smin = data.Next(); emax = data.Next(); task.SizeMin = d; task.SizeMax = d; task.StartMin = smin; task.EndMax = emax; ends.Add(cp.EndOf(task)); for (int j = 0; j < nbResources; j++) { int q = data.Next(); if (q > 0) { resources[j].Add(cp.Pulse(task, q)); } } nbSucc = data.Next(); for (int s = 0; s < nbSucc; s++) { int succ = data.Next(); IConstraint pct = cp.EndBeforeStart(task, tasks[succ]); cp.Add(pct); precedenceCtList.Add(pct); } } for (int j = 0; j < nbResources; j++) { IConstraint cct = cp.Le(resources[j], capacities[j]); cp.Add(cct); capacityCtList.Add(cct); } precedenceCts = precedenceCtList.ToArray(); capacityCts = capacityCtList.ToArray(); IObjective objective = cp.Minimize(cp.Max(ends.ToArray())); cp.Add(objective); } catch (ILOG.Concert.Exception e) { Console.WriteLine("Error: " + e); } }
public static void Main(String[] args) { String filename = "../../../../examples/data/rcpspmm_default.data"; int failLimit = 30000; int nbTasks, nbRenewable, nbNonRenewable; if (args.Length > 0) { filename = args[0]; } if (args.Length > 1) { failLimit = Convert.ToInt32(args[1]); } CP cp = new CP(); DataReader data = new DataReader(filename); nbTasks = data.Next(); nbRenewable = data.Next(); nbNonRenewable = data.Next(); ICumulFunctionExpr[] renewables = new ICumulFunctionExpr[nbRenewable]; IIntExpr[] nonRenewables = new IIntExpr[nbNonRenewable]; int[] capRenewables = new int[nbRenewable]; int[] capNonRenewables = new int[nbNonRenewable]; for (int j = 0; j < nbRenewable; j++) { renewables[j] = cp.CumulFunctionExpr(); capRenewables[j] = data.Next(); } for (int j = 0; j < nbNonRenewable; j++) { nonRenewables[j] = cp.IntExpr(); capNonRenewables[j] = data.Next(); } IIntervalVar[] tasks = new IIntervalVar[nbTasks]; List <IIntervalVar>[] modes = new List <IIntervalVar> [nbTasks]; for (int i = 0; i < nbTasks; i++) { tasks[i] = cp.IntervalVar(); modes[i] = new List <IIntervalVar>(); } List <IIntExpr> ends = new List <IIntExpr>(); for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; int d = data.Next(); int nbModes = data.Next(); int nbSucc = data.Next(); for (int k = 0; k < nbModes; k++) { IIntervalVar alt = cp.IntervalVar(); alt.SetOptional(); modes[i].Add(alt); } cp.Add(cp.Alternative(task, modes[i].ToArray())); ends.Add(cp.EndOf(task)); for (int s = 0; s < nbSucc; s++) { int succ = data.Next(); cp.Add(cp.EndBeforeStart(task, tasks[succ])); } } for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; List <IIntervalVar> imodes = modes[i]; for (int k = 0; k < imodes.Count; k++) { int taskId = data.Next(); int modeId = data.Next(); int d = data.Next(); imodes[k].SizeMin = d; imodes[k].SizeMax = d; int q; for (int j = 0; j < nbNonRenewable; j++) { q = data.Next(); if (0 < q) { renewables[j].Add(cp.Pulse(imodes[k], q)); } } for (int j = 0; j < nbNonRenewable; j++) { q = data.Next(); if (0 < q) { nonRenewables[j] = cp.Sum(nonRenewables[j], cp.Prod(q, cp.PresenceOf(imodes[k]))); } } } } for (int j = 0; j < nbRenewable; j++) { cp.Add(cp.Le(renewables[j], capRenewables[j])); } for (int j = 0; j < nbRenewable; j++) { cp.Add(cp.Le(nonRenewables[j], capNonRenewables[j])); } IObjective objective = cp.Minimize(cp.Max(ends.ToArray())); cp.Add(objective); cp.SetParameter(CP.IntParam.FailLimit, failLimit); Console.WriteLine("Instance \t: " + filename); if (cp.Solve()) { Console.WriteLine("Makespan \t: " + cp.ObjValue); } else { Console.WriteLine("No solution found."); } }
//----- RCPSP Model creation ------------------------------------------------ private static void buildModel(String fileName) { int nbTasks, nbResources; DataReader data = new DataReader(fileName); try { nbTasks = data.Next(); nbResources = data.Next(); List<IIntExpr> ends = new List<IIntExpr>(); List<IConstraint> capacityCtList = new List<IConstraint>(); List<IConstraint> precedenceCtList = new List<IConstraint>(); ICumulFunctionExpr[] resources = new ICumulFunctionExpr[nbResources]; int[] capacities = new int[nbResources]; for (int j = 0; j < nbResources; j++) { capacities[j] = data.Next(); resources[j] = cp.CumulFunctionExpr(); } IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; i++) { tasks[i] = cp.IntervalVar(); tasks[i].Name = "ACT" + i; } for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; int d, smin, emax, nbSucc; d = data.Next(); smin = data.Next(); emax = data.Next(); task.SizeMin = d; task.SizeMax = d; task.StartMin = smin; task.EndMax = emax; ends.Add(cp.EndOf(task)); for (int j = 0; j < nbResources; j++ ) { int q = data.Next(); if (q > 0) { resources[j].Add(cp.Pulse(task, q)); } } nbSucc = data.Next(); for (int s = 0; s < nbSucc; s++ ) { int succ = data.Next(); IConstraint pct = cp.EndBeforeStart(task, tasks[succ]); cp.Add(pct); precedenceCtList.Add(pct); } } for (int j = 0; j < nbResources; j++) { IConstraint cct = cp.Le(resources[j], capacities[j]); cp.Add(cct); capacityCtList.Add(cct); } precedenceCts = precedenceCtList.ToArray(); capacityCts = capacityCtList.ToArray(); IObjective objective = cp.Minimize(cp.Max(ends.ToArray())); cp.Add(objective); } catch (ILOG.Concert.Exception e) { Console.WriteLine("Error: " + e); } }
public static void Main(String[] args) { String filename = "../../../../examples/data/rcpspmm_default.data"; int failLimit = 30000; int nbTasks, nbRenewable, nbNonRenewable; if (args.Length > 0) filename = args[0]; if (args.Length > 1) failLimit = Convert.ToInt32(args[1]); CP cp = new CP(); DataReader data = new DataReader(filename); nbTasks = data.Next(); nbRenewable = data.Next(); nbNonRenewable = data.Next(); ICumulFunctionExpr[] renewables = new ICumulFunctionExpr[nbRenewable]; IIntExpr[] nonRenewables = new IIntExpr[nbNonRenewable]; int[] capRenewables = new int[nbRenewable]; int[] capNonRenewables = new int[nbNonRenewable]; for (int j = 0; j < nbRenewable; j++) { renewables[j] = cp.CumulFunctionExpr(); capRenewables[j] = data.Next(); } for (int j = 0; j < nbNonRenewable; j++) { nonRenewables[j] = cp.IntExpr(); capNonRenewables[j] = data.Next(); } IIntervalVar[] tasks = new IIntervalVar[nbTasks]; List<IIntervalVar>[] modes = new List<IIntervalVar>[nbTasks]; for (int i = 0; i < nbTasks; i++) { tasks[i] = cp.IntervalVar(); modes[i] = new List<IIntervalVar>(); } List<IIntExpr> ends = new List<IIntExpr>(); for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; int d = data.Next(); int nbModes = data.Next(); int nbSucc = data.Next(); for (int k = 0; k < nbModes; k++) { IIntervalVar alt = cp.IntervalVar(); alt.SetOptional(); modes[i].Add(alt); } cp.Add(cp.Alternative(task, modes[i].ToArray())); ends.Add(cp.EndOf(task)); for (int s = 0; s < nbSucc; s++) { int succ = data.Next(); cp.Add(cp.EndBeforeStart(task, tasks[succ])); } } for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; List<IIntervalVar> imodes = modes[i]; for (int k = 0; k < imodes.Count; k++) { int taskId = data.Next(); int modeId = data.Next(); int d = data.Next(); imodes[k].SizeMin = d; imodes[k].SizeMax = d; int q; for (int j = 0; j < nbNonRenewable; j++) { q = data.Next(); if (0 < q) { renewables[j].Add(cp.Pulse(imodes[k], q)); } } for (int j = 0; j < nbNonRenewable; j++) { q = data.Next(); if (0 < q) { nonRenewables[j] = cp.Sum(nonRenewables[j], cp.Prod(q, cp.PresenceOf(imodes[k]))); } } } } for (int j = 0; j < nbRenewable; j++) { cp.Add(cp.Le(renewables[j], capRenewables[j])); } for (int j = 0; j < nbRenewable; j++) { cp.Add(cp.Le(nonRenewables[j], capNonRenewables[j])); } IObjective objective = cp.Minimize(cp.Max(ends.ToArray())); cp.Add(objective); cp.SetParameter(CP.IntParam.FailLimit, failLimit); Console.WriteLine("Instance \t: " + filename); if (cp.Solve()) { Console.WriteLine("Makespan \t: " + cp.ObjValue); } else { Console.WriteLine("No solution found."); } }
public static void Main(String[] args) { workersUsage = cp.CumulFunctionExpr(); cash = cp.CumulFunctionExpr(); List<IIntExpr> ends = new List<IIntExpr>(); List<IIntervalVar> allTasks = new List<IIntervalVar>(); /* CASH PAYMENTS */ for (int p = 0; p < 5; ++p) cash.Add(cp.Step(60 * p, 30000)); MakeHouse(0, 31, ends, allTasks); MakeHouse(1, 0, ends, allTasks); MakeHouse(2, 90, ends, allTasks); MakeHouse(3, 120, ends, allTasks); MakeHouse(4, 90, ends, allTasks); cp.Add(cp.Le(0, cash)); cp.Add(cp.Le(workersUsage, nbWorkers)); cp.Add(cp.Minimize(cp.Max(ends.ToArray()))); /* EXTRACTING THE MODEL AND SOLVING. */ cp.SetParameter(CP.IntParam.FailLimit, 10000); if (cp.Solve()) { Console.WriteLine("Solution with objective " + cp.ObjValue + ":"); for (int i = 0; i < allTasks.Count; i++) { Console.WriteLine(cp.GetDomain(allTasks[i])); } int segs = cp.GetNumberOfSegments(cash); for (int i = 0; i < segs; i++) { Console.WriteLine( "Cash is " + cp.GetSegmentValue(cash, i) + " from " + cp.GetSegmentStart(cash, i) + " to " + (cp.GetSegmentEnd(cash, i) - 1) ); } } else { Console.WriteLine("No Solution found."); } }
public static void MakeHouse( int id, int rd, List<IIntExpr> ends, List<IIntervalVar> allTasks) { /* CREATE THE TIME-INTERVALS. */ String name; IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; ++i) { name = "H" + id + "-" + taskNames[i]; IIntervalVar task = cp.IntervalVar(taskDurations[i], name); tasks[i] = task; allTasks.Add(task); workersUsage = cp.Sum(workersUsage, cp.Pulse(task, 1)); cash = cp.Diff(cash, cp.StepAtStart(task, 200 * taskDurations[i])); } /* ADDING TEMPORAL CONSTRAINTS. */ tasks[masonry].StartMin = rd; cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[carpentry])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[plumbing])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[ceiling])); cp.Add(cp.EndBeforeStart(tasks[carpentry], tasks[roofing])); cp.Add(cp.EndBeforeStart(tasks[ceiling], tasks[painting])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[windows])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[windows], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[facade], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[garden], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[painting], tasks[moving])); /* DEFINING MINIMIZATION OBJECTIVE */ ends.Add(cp.EndOf(tasks[moving])); }
static void Main(string[] args) { int D = 5; int W = 5; int H = 3; int G = 2; int T = 12; int[] k_g = new int[] { 2, 2 }; int ALLK = 4; int[] cc_d = new int[] { 2, 1, 2, 1, 2 }; int[] ave = new int[] { 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1 }; int[] dur = new int[] { 1, 2, 1, 1, 2 }; int[] prf_D = new int[] { 2, 1, 1, 1, 100 }; int[] indexg_d = new int[] { 0, 1, 1, 1, 0 }; CP roster = new CP(); // intern availbility INumToNumStepFunction resource_AveIntern = roster.NumToNumStepFunction(0, T, 100, "AvailibilityOfIntern"); for (int t = 0; t < T; t++) { if (ave[t] == 0) { resource_AveIntern.SetValue(t, t + 1, 0); } } // discipline IIntervalVar[] discipline_d = new IIntervalVar[D]; ICumulFunctionExpr hospitalNotRR = roster.CumulFunctionExpr(); for (int d = 0; d < D; d++) { discipline_d[d] = roster.IntervalVar(); discipline_d[d].EndMax = T; discipline_d[d].EndMin = dur[d]; discipline_d[d].LengthMax = dur[d]; discipline_d[d].LengthMin = dur[d]; discipline_d[d].SizeMax = dur[d]; discipline_d[d].SizeMin = dur[d]; discipline_d[d].StartMax = T; discipline_d[d].StartMin = 0; discipline_d[d].SetIntensity(resource_AveIntern, 100); hospitalNotRR.Add(roster.Pulse(discipline_d[d], 1)); discipline_d[d].SetOptional(); } IIntervalSequenceVar dis = roster.IntervalSequenceVar(discipline_d); roster.Add(roster.Ge(roster.PresenceOf(discipline_d[1]), roster.PresenceOf(discipline_d[4]))); roster.Add(roster.Before(dis, discipline_d[1], discipline_d[4])); roster.Add(roster.NoOverlap(discipline_d)); // desciplien for not renewable resources IIntVar[] height_t = new IIntVar[T]; for (int t = 0; t < T; t++) { height_t[t] = roster.IntVar(0, 1); } INumToNumSegmentFunction piecewise = roster.NumToNumSegmentFunction(new double[] { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11 }, new double[] { 10, 0, 10, 1, 10, 2, 10, 3, 10, 4, 10, 5, 10, 6, 10, 7, 10, 8, 10, 9, 10, 10, 10, 11 }); INumExpr rc = roster.NumExpr(); for (int d = 0; d < D; d++) { rc = roster.Sum(rc, roster.StartEval(discipline_d[d], piecewise, 0)); } for (int t = 0; t < T; t++) { } IIntervalVar[] disciplineNR_d = new IIntervalVar[D]; for (int d = 0; d < D; d++) { disciplineNR_d[d] = roster.IntervalVar(); disciplineNR_d[d].EndMax = T; disciplineNR_d[d].EndMin = T; disciplineNR_d[d].LengthMax = T; disciplineNR_d[d].LengthMin = T; disciplineNR_d[d].SizeMax = T; disciplineNR_d[d].SizeMin = T; disciplineNR_d[d].StartMax = T; disciplineNR_d[d].StartMin = 0; disciplineNR_d[d].SetOptional(); roster.IfThen(roster.PresenceOf(discipline_d[d]), roster.PresenceOf(disciplineNR_d[d])); } //roster.Add(roster.IfThen(roster.PresenceOf(discipline_d[4]), roster.And(roster.Le(roster.EndOf(discipline_d[4]), roster.StartOf(discipline_d[0])),roster.PresenceOf(discipline_d[0])))); //roster.Add(roster.StartBeforeEnd(discipline_d[4],discipline_d[0])); // hospital changes //ICumulFunctionExpr[] hospital //for (int d = 0; d < D; d++) //{ // roster.IfThen(roster.PresenceOf(disciplineNR_d[d]),); //} // hospital assignment IIntervalVar[][] Hospital_dh = new IIntervalVar[D][]; for (int d = 0; d < D; d++) { Hospital_dh[d] = new IIntervalVar[H]; for (int h = 0; h < H; h++) { Hospital_dh[d][h] = roster.IntervalVar(); Hospital_dh[d][h].EndMax = T; Hospital_dh[d][h].EndMin = dur[d]; Hospital_dh[d][h].LengthMax = dur[d]; Hospital_dh[d][h].LengthMin = dur[d]; Hospital_dh[d][h].SizeMax = dur[d]; Hospital_dh[d][h].SizeMin = dur[d]; Hospital_dh[d][h].StartMax = T; Hospital_dh[d][h].StartMin = 0; Hospital_dh[d][h].SetOptional(); if (h == 0 && (d != 4)) { Hospital_dh[d][h].SetAbsent(); } if (h == 1 && (d == 4)) { Hospital_dh[d][h].SetAbsent(); } if (h == 2 && (d == 4)) { Hospital_dh[d][h].SetAbsent(); } } roster.Add(roster.Alternative(discipline_d[d], Hospital_dh[d])); } IIntervalVar[] disHospSetUp_dh = new IIntervalVar[D * H]; int[] type = new int[D * H]; for (int dh = 0; dh < D * H; dh++) { int dIndex = dh % D; int hIndex = dh / D; disHospSetUp_dh[dh] = roster.IntervalVar("DsiHosp" + "[" + dIndex + "][" + hIndex + "]"); type[dh] = hIndex; disHospSetUp_dh[dh].SetOptional(); disHospSetUp_dh[dh] = Hospital_dh[dIndex][hIndex]; } // changes IIntervalSequenceVar cc = roster.IntervalSequenceVar(disHospSetUp_dh, type); roster.NoOverlap(cc); IIntVar[][] change_dD = new IIntVar[D][]; for (int d = 0; d < D; d++) { change_dD[d] = new IIntVar[D]; for (int dd = 0; dd < D; dd++) { change_dD[d][dd] = roster.IntVar(0, 1, "change_dD[" + d + "][" + dd + "]"); } } IIntVar[] change_d = new IIntVar[D]; for (int d = 0; d < D; d++) { change_d[d] = roster.IntVar(0, 1, "change_d[" + d + "]"); } for (int dh = 0; dh < D * H; dh++) { int dIndex = dh % D; int hIndex = dh / D; IIntExpr chngD = roster.IntExpr(); chngD = roster.Sum(chngD, change_d[dIndex]); roster.Add(roster.IfThen(roster.And(roster.PresenceOf(disHospSetUp_dh[dh]), roster.Neq(roster.TypeOfNext(cc, disHospSetUp_dh[dh], hIndex, hIndex), hIndex)), roster.Eq(chngD, 1))); for (int ddh = 0; ddh < D * H; ddh++) { int ddIndex = ddh % D; int hhIndex = ddh / D; if (hhIndex == hIndex || dIndex == ddIndex) { continue; } } } //IIntVar[][] y_dD = new IIntVar[D][]; //for (int d = 0; d < D; d++) //{ // y_dD[d] = new IIntVar[D]; // for (int dd= 0; dd < D; dd++) // { // y_dD[d][dd] = roster.IntVar(0,1); // if (d == dd) // { // y_dD[d][dd] = roster.IntVar(0, 0); // } // } //} //for (int d = 0; d < D; d++) //{ // for (int dd = 0; dd < D; dd++) // { // if (d != dd) // { // for (int h = 0; h < H; h++) // { // for (int hh = 0; hh < H; hh++) // { // if (d != dd && h != hh && true) // { // IIntExpr yyy = roster.IntExpr(); // yyy = roster.Sum(yyy,roster.Prod(T,y_dD[d][dd])); // yyy = roster.Sum(yyy, roster.Prod(1, roster.EndOf(Hospital_dh[dd][hh]))); // yyy = roster.Sum(yyy, roster.Prod(-1, roster.StartOf(Hospital_dh[d][h]))); // roster.Add( roster.IfThen(roster.And(roster.PresenceOf(Hospital_dh[d][h]), roster.PresenceOf(Hospital_dh[dd][hh])), roster.AddGe(yyy, 0))); // } // } // } // } // } //} //for (int d = 0; d < D; d++) //{ // for (int dd = 0; dd < D; dd++) // { // if (d == dd) // { // continue; // } // IIntExpr change = roster.IntExpr(); // change = roster.Sum(change, change_dD[dd][d]); // change = roster.Sum(change, roster.Prod(-1, y_dD[dd][d])); // for (int ddd = 0; ddd < D; ddd++) // { // if (ddd == d || ddd == dd) // { // continue; // } // change = roster.Sum(change, change_dD[dd][ddd]); // } // roster.Add(roster.IfThen(roster.And(roster.PresenceOf(discipline_d[d]), roster.PresenceOf(discipline_d[dd])), roster.AddEq(change, 0))); // } //} // all group assignment IIntExpr allPossibleCourses = roster.IntExpr(); for (int d = 0; d < D; d++) { allPossibleCourses = roster.Sum(allPossibleCourses, roster.Prod(cc_d[d], roster.PresenceOf(discipline_d[d]))); } roster.AddEq(allPossibleCourses, ALLK); // group assignment for (int g = 0; g < G; g++) { IIntExpr groupedCours_g = roster.IntExpr(); for (int d = 0; d < D; d++) { if (indexg_d[d] == g) { groupedCours_g = roster.Sum(groupedCours_g, roster.Prod(cc_d[d], roster.PresenceOf(discipline_d[d]))); } } roster.AddGe(groupedCours_g, k_g[g]); } // stay in one hospital // objective function INumExpr objExp = roster.NumExpr(); // discipline desire for (int d = 0; d < D; d++) { objExp = roster.Sum(objExp, roster.Prod(prf_D[d], roster.PresenceOf(discipline_d[d]))); for (int dd = 0; dd < D; dd++) { objExp = roster.Sum(objExp, roster.Prod(-1, change_d[d])); } } objExp = roster.Sum(objExp, rc); IIntExpr makespan = roster.IntExpr(); for (int d = 0; d < D; d++) { makespan = roster.Max(makespan, roster.EndOf(discipline_d[d])); } IIntVar wait = roster.IntVar(0, T); IIntExpr waitConst = roster.IntExpr(); waitConst = roster.Sum(waitConst, wait); waitConst = roster.Sum(waitConst, roster.Prod(-1, makespan)); for (int d = 0; d < D; d++) { waitConst = roster.Sum(waitConst, roster.Prod(dur[d], roster.PresenceOf(discipline_d[d]))); } roster.AddEq(waitConst, 0); roster.AddMaximize(objExp); roster.ExportModel("Roster.cpo"); roster.SetParameter(CP.IntParam.TimeMode, CP.ParameterValues.ElapsedTime); roster.SetParameter(CP.IntParam.LogVerbosity, CP.ParameterValues.Quiet); roster.SetParameter(CP.IntParam.SolutionLimit, 10); // solve it now if (roster.Solve()) { Console.WriteLine("this is the cost of the CP column {0}", roster.ObjValue); for (int d = 0; d < D; d++) { if (roster.IsPresent(discipline_d[d])) { Console.WriteLine("Discipline {0} with CC {1} and Dur {2} and Prf {3} started at time {4} and finished at time {5}", d, cc_d[d], dur[d], prf_D[d], roster.GetStart(discipline_d[d]), roster.GetEnd(discipline_d[d])); } } for (int d = 0; d < D; d++) { for (int h = 0; h < H; h++) { if (roster.IsPresent(Hospital_dh[d][h])) { Console.WriteLine("Discipline {0} with CC {1} and Dur {2} and Prf {3} started at time {4} and finished at time {5} at Hospitail {6}", d, cc_d[d], dur[d], prf_D[d], roster.GetStart(Hospital_dh[d][h]), roster.GetEnd(Hospital_dh[d][h]), h); } } } for (int d = 0; d < D * H; d++) { int dIndex = d % D; int hIndex = d / D; if (roster.IsPresent(disHospSetUp_dh[d])) { Console.WriteLine("discpline " + dIndex + " in hospital " + hIndex); } } for (int d = 0; d < D; d++) { if (roster.GetValue(change_d[d]) > 0.5) { Console.WriteLine("We have change for discipline {0}", d); } for (int dd = 0; dd < D; dd++) { if (d == dd) { continue; } } } Console.WriteLine("========================================="); Console.WriteLine("Wainting time {0}", roster.GetValue(wait)); } }
public static void Main(String[] args) { String filename = "../../../../examples/data/rcpsp_default.data"; int failLimit = 10000; int nbTasks, nbResources; if (args.Length > 0) filename = args[0]; if (args.Length > 1) failLimit = Convert.ToInt32(args[1]); CP cp = new CP(); DataReader data = new DataReader(filename); try { nbTasks = data.Next(); nbResources = data.Next(); List<IIntExpr> ends = new List<IIntExpr>(); ICumulFunctionExpr[] resources = new ICumulFunctionExpr[nbResources]; int[] capacities = new int[nbResources]; for (int j = 0; j < nbResources; j++) { capacities[j] = data.Next(); resources[j] = cp.CumulFunctionExpr(); } IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; i++) { tasks[i] = cp.IntervalVar(); } for (int i = 0; i < nbTasks; i++) { IIntervalVar task = tasks[i]; int d, nbSucc; d = data.Next(); task.SizeMin = d; task.SizeMax = d; ends.Add(cp.EndOf(task)); for (int j = 0; j < nbResources; j++) { int q = data.Next(); if (q > 0) resources[j].Add(cp.Pulse(task, q)); } nbSucc = data.Next(); for (int s = 0; s < nbSucc; s++) { int succ = data.Next(); cp.Add(cp.EndBeforeStart(task, tasks[succ - 1])); } } for (int j = 0; j < nbResources; j++) { cp.Add(cp.Le(resources[j], capacities[j])); } IObjective objective = cp.Minimize(cp.Max(ends.ToArray())); cp.Add(objective); cp.SetParameter(CP.IntParam.FailLimit, failLimit); Console.WriteLine("Instance \t: " + filename); if (cp.Solve()) { Console.WriteLine("Makespan \t: " + cp.ObjValue); } else { Console.WriteLine("No solution found."); } } catch (ILOG.Concert.Exception e) { Console.WriteLine(" ERROR: " + e); } }
public static void Main(String[] args) { CP cp = new CP(); List<IIntExpr> ends = new List<IIntExpr>(); List<IIntervalVar> allTasks = new List<IIntervalVar>(); ITransitionDistance ttime = cp.TransitionDistance(2); ttime.SetValue(dirty, clean, 1); workers = cp.CumulFunctionExpr(); IStateFunction[] houseState = new IStateFunction[nbHouses]; for (int i = 0; i < nbHouses; i++) { houseState[i] = cp.StateFunction(ttime); MakeHouse(cp, i, ends, allTasks, houseState[i]); } cp.Add(cp.Le(workers, nbWorkers)); cp.Add(cp.Minimize(cp.Max(ends.ToArray()))); /* EXTRACTING THE MODEL AND SOLVING. */ cp.SetParameter(CP.IntParam.FailLimit, 10000); if (cp.Solve()) { for (int i = 0; i < allTasks.Count; i++) { Console.WriteLine(cp.GetDomain(allTasks[i])); } for (int h = 0; h < nbHouses; h++) { for (int i = 0; i < cp.GetNumberOfSegments(houseState[h]); i++) { Console.Write("House " + h + " has state "); int s = cp.GetSegmentValue(houseState[h], i); if (s == clean) Console.Write("Clean"); else if (s == dirty) Console.Write("Dirty"); else if (s == CP.NoState) Console.Write("None"); else Console.Write("Unknown (problem)"); Console.Write(" from "); if (cp.GetSegmentStart(houseState[h], i) == CP.IntervalMin) Console.Write("Min"); else Console.Write(cp.GetSegmentStart(houseState[h], i)); Console.Write(" to "); if (cp.GetSegmentEnd(houseState[h], i) == CP.IntervalMax) Console.WriteLine("Max"); else Console.WriteLine((cp.GetSegmentEnd(houseState[h], i) - 1)); } } } else { Console.WriteLine("No solution found. "); } }
public static void MakeHouse(CP cp, int id, List<IIntExpr> ends, List<IIntervalVar> allTasks, IStateFunction houseState) { /* CREATE THE TIME-INTERVALS. */ String name; IIntervalVar[] tasks = new IIntervalVar[nbTasks]; for (int i = 0; i < nbTasks; i++) { name = "H" + id + "-" + taskNames[i]; tasks[i] = cp.IntervalVar(taskDurations[i], name); workers = cp.Sum(workers, cp.Pulse(tasks[i], 1)); allTasks.Add(tasks[i]); } /* ADDING PRECEDENCE CONSTRAINTS */ cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[carpentry])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[plumbing])); cp.Add(cp.EndBeforeStart(tasks[masonry], tasks[ceiling])); cp.Add(cp.EndBeforeStart(tasks[carpentry], tasks[roofing])); cp.Add(cp.EndBeforeStart(tasks[ceiling], tasks[painting])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[windows])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[facade])); cp.Add(cp.EndBeforeStart(tasks[roofing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[plumbing], tasks[garden])); cp.Add(cp.EndBeforeStart(tasks[windows], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[facade], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[garden], tasks[moving])); cp.Add(cp.EndBeforeStart(tasks[painting], tasks[moving])); /* ADDING STATE CONSTRAINTS */ cp.Add(cp.AlwaysEqual(houseState, tasks[masonry], dirty)); cp.Add(cp.AlwaysEqual(houseState, tasks[carpentry], dirty)); cp.Add(cp.AlwaysEqual(houseState, tasks[plumbing], clean)); cp.Add(cp.AlwaysEqual(houseState, tasks[ceiling], clean)); cp.Add(cp.AlwaysEqual(houseState, tasks[roofing], dirty)); cp.Add(cp.AlwaysEqual(houseState, tasks[painting], clean)); cp.Add(cp.AlwaysEqual(houseState, tasks[windows], dirty)); /* MAKESPAN */ ends.Add(cp.EndOf(tasks[moving])); }