示例#1
0
        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);
            }
        }
示例#2
0
        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);

                if (cp.Solve(phases))
                {
                    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);
            }
        }
示例#3
0
 public static INumExpr EarlinessCost(IIntervalVar task, int rd, double weight, int useFunction)
 {
     if (useFunction != 0) {
     double[] arrX = {rd};
     double[] arrV = {-weight, 0.0};
     INumToNumSegmentFunction f = cp.PiecewiseLinearFunction(arrX, arrV, rd, 0.0);
     return cp.StartEval(task,f);
     }
     else
     {
     return cp.Prod(weight, cp.Max(0, cp.Diff(rd, cp.StartOf(task))));
     }
 }
示例#4
0
        public static void MakeHouse(
            CP cp,
            int id,
            List <IIntExpr> ends,
            List <IIntervalVar> allTasks,
            List <IIntervalVar> joeTasks,
            List <IIntervalVar> jimTasks
            )
        {
            /// 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);
                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 WORKER TASKS. ///
            joeTasks.Add(tasks[masonry]);
            joeTasks.Add(tasks[carpentry]);
            jimTasks.Add(tasks[plumbing]);
            jimTasks.Add(tasks[ceiling]);
            joeTasks.Add(tasks[roofing]);
            jimTasks.Add(tasks[painting]);
            jimTasks.Add(tasks[windows]);
            joeTasks.Add(tasks[facade]);
            joeTasks.Add(tasks[garden]);
            jimTasks.Add(tasks[moving]);

            /// DEFINING MINIMIZATION OBJECTIVE ///
            ends.Add(cp.EndOf(tasks[moving]));
        }
示例#5
0
 public static INumExpr EarlinessCost(IIntervalVar task, int rd, double weight, int useFunction)
 {
     if (useFunction != 0)
     {
         double[] arrX = { rd };
         double[] arrV = { -weight, 0.0 };
         INumToNumSegmentFunction f = cp.PiecewiseLinearFunction(arrX, arrV, rd, 0.0);
         return(cp.StartEval(task, f));
     }
     else
     {
         return(cp.Prod(weight, cp.Max(0, cp.Diff(rd, cp.StartOf(task)))));
     }
 }
示例#6
0
        static void Main()
        {
            CP cp = new CP();
            /// CREATE THE TIME-INTERVALS.///
            IIntervalVar masonry   = cp.IntervalVar(35, "masonry   ");
            IIntervalVar carpentry = cp.IntervalVar(15, "carpentry ");
            IIntervalVar plumbing  = cp.IntervalVar(40, "plumbing  ");
            IIntervalVar ceiling   = cp.IntervalVar(15, "ceiling   ");
            IIntervalVar roofing   = cp.IntervalVar(5, "roofing   ");
            IIntervalVar painting  = cp.IntervalVar(10, "painting  ");
            IIntervalVar windows   = cp.IntervalVar(5, "windows   ");
            IIntervalVar facade    = cp.IntervalVar(10, "facade    ");
            IIntervalVar garden    = cp.IntervalVar(5, "garden    ");
            IIntervalVar moving    = cp.IntervalVar(5, "moving    ");

            /// ADDING TEMPORAL CONSTRAINTS.///
            cp.Add(cp.EndBeforeStart(masonry, carpentry));
            cp.Add(cp.EndBeforeStart(masonry, plumbing));
            cp.Add(cp.EndBeforeStart(masonry, ceiling));
            cp.Add(cp.EndBeforeStart(carpentry, roofing));
            cp.Add(cp.EndBeforeStart(ceiling, painting));
            cp.Add(cp.EndBeforeStart(roofing, windows));
            cp.Add(cp.EndBeforeStart(roofing, facade));
            cp.Add(cp.EndBeforeStart(plumbing, facade));
            cp.Add(cp.EndBeforeStart(roofing, garden));
            cp.Add(cp.EndBeforeStart(plumbing, garden));
            cp.Add(cp.EndBeforeStart(windows, moving));
            cp.Add(cp.EndBeforeStart(facade, moving));
            cp.Add(cp.EndBeforeStart(garden, moving));
            cp.Add(cp.EndBeforeStart(painting, moving));

            /// EXTRACTING THE MODEL AND SOLVING.///
            if (cp.Solve())
            {
                Console.WriteLine(cp.GetDomain(masonry));
                Console.WriteLine(cp.GetDomain(carpentry));
                Console.WriteLine(cp.GetDomain(plumbing));
                Console.WriteLine(cp.GetDomain(ceiling));
                Console.WriteLine(cp.GetDomain(roofing));
                Console.WriteLine(cp.GetDomain(painting));
                Console.WriteLine(cp.GetDomain(windows));
                Console.WriteLine(cp.GetDomain(facade));
                Console.WriteLine(cp.GetDomain(garden));
                Console.WriteLine(cp.GetDomain(moving));
            }
            else
            {
                Console.Write("No solution found. ");
            }
        }
示例#7
0
 public static INumExpr TardinessCost(IIntervalVar task, int dd, double weight, int useFunction)
 {
     if (useFunction != 0)
     {
         double[] arrX = { dd };
         double[] arrV = { 0.0, weight };
         INumToNumSegmentFunction f = cp.PiecewiseLinearFunction(arrX, arrV, dd, 0.0);
         return(cp.EndEval(task, f));
     }
     else
     {
         return(cp.Prod(weight, cp.Max(0, cp.Diff(cp.EndOf(task), dd))));
     }
 }
示例#8
0
        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]));
        }
示例#9
0
        public static void Main(String[] args)
        {
            int nbHouses = 5;
            int deadline = 318;

            skill = cp.IntExpr();
            List <IIntervalVar> allTasks = new List <IIntervalVar>();

            List <IIntervalVar>[] workerTasks = new List <IIntervalVar> [nbWorkers];
            for (int w = 0; w < nbWorkers; w++)
            {
                workerTasks[w] = new List <IIntervalVar>();
            }

            for (int h = 0; h < nbHouses; h++)
            {
                MakeHouse(allTasks, workerTasks, h, deadline);
            }

            for (int w = 0; w < nbWorkers; w++)
            {
                IIntervalSequenceVar seq = cp.IntervalSequenceVar(workerTasks[w].ToArray(), workerNames[w]);
                cp.Add(cp.NoOverlap(seq));
            }

            cp.Add(cp.Maximize(skill));

            /* 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++)
                {
                    IIntervalVar var = (IIntervalVar)allTasks[i];
                    if (cp.IsPresent(allTasks[i]))
                    {
                        Console.WriteLine(cp.GetDomain((IIntervalVar)allTasks[i]));
                    }
                }
            }
            else
            {
                Console.WriteLine("No solution found. ");
            }
        }
示例#10
0
        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 IIntExpr MakeScenarioSubmodel(CP cp,
                                                    int nbJobs,
                                                    int nbMachines,
                                                    int[][]                machines,
                                                    int[][]                durations,
                                                    IIntervalSequenceVar[] sequences)
        {
            List <IIntervalVar>[] machinesOps = new List <IIntervalVar> [nbMachines];
            String name;
            int    i, j;

            for (j = 0; j < nbMachines; j++)
            {
                machinesOps[j] = new List <IIntervalVar>();
            }
            IIntExpr[] ends = new IIntExpr[nbJobs];
            for (i = 0; i < nbJobs; i++)
            {
                IIntervalVar prec = cp.IntervalVar();
                for (j = 0; j < nbMachines; j++)
                {
                    name = "J" + i + "_O" + j;
                    IIntervalVar ti = cp.IntervalVar(durations[i][j], name);
                    machinesOps[machines[i][j]].Add(ti);
                    if (j > 0)
                    {
                        cp.Add(cp.EndBeforeStart(prec, ti));
                    }
                    prec = ti;
                }
                ends[i] = cp.EndOf(prec);
            }
            for (j = 0; j < nbMachines; j++)
            {
                name         = "M" + j;
                sequences[j] = cp.IntervalSequenceVar(machinesOps[j].ToArray(), name);
                cp.Add(cp.NoOverlap(sequences[j]));
            }
            return(cp.Max(ends));
        }
示例#12
0
 //----- 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);
     }
 }
示例#13
0
        public static void Main(String[] args)
        {
            try
            {
                CP cp = new CP();
                ITransitionDistance setup1 = cp.TransitionDistance(NbTypes);
                ITransitionDistance setup2 = cp.TransitionDistance(NbTypes);
                int i, j;
                for (i = 0; i < NbTypes; ++i)
                {
                    for (j = 0; j < NbTypes; ++j)
                    {
                        int d1 = SetupM1[NbTypes * i + j];
                        if (d1 < 0)
                            d1 = CP.IntervalMax; // Forbidden transition
                        setup1.SetValue(i, j, d1);
                        int d2 = SetupM2[NbTypes * i + j];
                        if (d2 < 0)
                            d2 = CP.IntervalMax; // Forbidden transition
                        setup2.SetValue(i, j, d2);
                    }
                }
                int[] tp = new int[NbTasks];
                IIntervalVar[] a = new IIntervalVar[NbTasks];
                IIntervalVar[] a1 = new IIntervalVar[NbTasks];
                IIntervalVar[] a2 = new IIntervalVar[NbTasks];
                IIntExpr[] ends = new IIntExpr[NbTasks];

                String name;
                for (i = 0; i < NbTasks; ++i)
                {
                    int type = TaskType[i];
                    int d1 = TaskDurM1[i];
                    int d2 = TaskDurM2[i];
                    tp[i] = type;
                    name = "A" + i + "_TP" + type;
                    a[i] = cp.IntervalVar(name);
                    IIntervalVar[] alt = new IIntervalVar[2];
                    name = "A" + i + "_M1_TP" + type;
                    a1[i] = cp.IntervalVar(d1, name);
                    a1[i].SetOptional();
                    alt[0] = a1[i];
                    name = "A" + i + "_M2_TP" + type;
                    a2[i] = cp.IntervalVar(d2, name);
                    a2[i].SetOptional();
                    alt[1] = a2[i];
                    cp.Add(cp.Alternative(a[i], alt));
                    ends[i] = cp.EndOf(a[i]);
                }

                IIntervalSequenceVar s1 = cp.IntervalSequenceVar(a1, tp);
                IIntervalSequenceVar s2 = cp.IntervalSequenceVar(a2, tp);
                cp.Add(cp.NoOverlap(s1, setup1, true));
                cp.Add(cp.NoOverlap(s2, setup2, true));
                cp.Add(cp.Minimize(cp.Max(ends)));

                cp.SetParameter(CP.IntParam.FailLimit, 100000);
                cp.SetParameter(CP.IntParam.LogPeriod, 10000);
                if (cp.Solve())
                {
                    Console.WriteLine("Machine 1: ");
                    IIntervalVar x;
                    for (x = cp.GetFirst(s1); !x.Equals(cp.GetLast(s1)); x = cp.GetNext(s1, x))
                        Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine("Machine 2: ");
                    for (x = cp.GetFirst(s2); !x.Equals(cp.GetLast(s2)); x = cp.GetNext(s2, x))
                        Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine("Makespan \t: " + cp.ObjValue);
                }
                else
                {
                    Console.WriteLine("No solution found.");
                }
            }
            catch (IloException e)
            {
                Console.WriteLine("Error: " + e);
            }
        }
示例#14
0
        public static void MakeHouse(
        List<IIntervalVar> allTasks,
        List<IIntervalVar> joeTasks,
        List<IIntervalVar> jimTasks,
        List<Int32> joeLocations,
        List<Int32> jimLocations,
        int loc,
        int rd,
        int dd,
        double weight)
        {
            /* CREATE THE TIME-INTERVALS. */
            String name = "H" + loc;

            IIntervalVar[] tasks = new IIntervalVar[nbTasks];
            for (int i = 0; i < nbTasks; i++ ) {
            name = "H" + loc + "-" + taskNames[i];
            tasks[i] = cp.IntervalVar(taskDurations[i], name);
            allTasks.Add(tasks[i]);
            }

            /* SPAN CONSTRAINT */
            IIntervalVar house = cp.IntervalVar(name);
            cp.Add(cp.Span(house, tasks));

            /* ADDING TEMPORAL CONSTRAINTS. */
            house.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]));

            /* ALLOCATING TASKS TO WORKERS */
            joeTasks.Add(tasks[masonry]);
            joeLocations.Add(loc);
            joeTasks.Add(tasks[carpentry]);
            joeLocations.Add(loc);
            jimTasks.Add(tasks[plumbing]);
            jimLocations.Add(loc);
            jimTasks.Add(tasks[ceiling]);
            jimLocations.Add(loc);
            joeTasks.Add(tasks[roofing]);
            joeLocations.Add(loc);
            jimTasks.Add(tasks[painting]);
            jimLocations.Add(loc);
            jimTasks.Add(tasks[windows]);
            jimLocations.Add(loc);
            joeTasks.Add(tasks[facade]);
            joeLocations.Add(loc);
            joeTasks.Add(tasks[garden]);
            joeLocations.Add(loc);
            jimTasks.Add(tasks[moving]);
            jimLocations.Add(loc);

            /* DEFINING MINIMIZATION OBJECTIVE */
            cost = cp.Sum(cost, tardinessCost(house, dd, weight));
            cost = cp.Sum(cost, cp.LengthOf(house));
        }
示例#15
0
    //----- 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);
        }
    }
示例#16
0
        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.");
            }
        }
示例#17
0
        public static void MakeHouse(List<IIntervalVar> allTasks,
                                     List<IIntervalVar>[] workerTasks,
                                     int id,
                                     int deadline)
        {
            /* CREATE THE INTERVAL VARIABLES. */
            String name;
            IIntervalVar[] tasks = new IIntervalVar[nbTasks];
            IIntervalVar[,] taskMatrix = new IIntervalVar[nbTasks, nbWorkers];

            for (int i = 0; i < nbTasks; i++)
            {
                name = "H" + id + "-" + taskNames[i];
                tasks[i] = cp.IntervalVar(taskDurations[i], name);

                /* ALLOCATING TASKS TO WORKERS. */
                List<IIntervalVar> alttasks = new List<IIntervalVar>();
                for (int w = 0; w < nbWorkers; w++)
                {
                    if (HasSkill(w, i))
                    {
                        name = "H" + id + "-" + taskNames[i] + "-" + workerNames[w];
                        IIntervalVar wtask = cp.IntervalVar(taskDurations[i], name);
                        wtask.SetOptional();
                        alttasks.Add(wtask);
                        taskMatrix[i, w] = wtask;
                        workerTasks[w].Add(wtask);
                        allTasks.Add(wtask);
                        /* DEFINING MAXIMIZATION OBJECTIVE. */
                        skill = cp.Sum(skill, cp.Prod(SkillLevel(w, i), cp.PresenceOf(wtask)));
                    }
                }
                cp.Add(cp.Alternative(tasks[i], alttasks.ToArray()));
            }

            /* ADDING PRECEDENCE CONSTRAINTS. */
            tasks[moving].EndMax = deadline;
            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 SAME-WORKER CONSTRAINTS. */
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[masonry, joe]),
                       cp.PresenceOf(taskMatrix[carpentry, joe]))));
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[roofing, jack]),
                       cp.PresenceOf(taskMatrix[facade, jack]))));
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[carpentry, joe]),
                       cp.PresenceOf(taskMatrix[roofing, joe]))));
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[garden, jim]),
                       cp.PresenceOf(taskMatrix[moving, jim]))));
        }
示例#18
0
        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.");
            }
        }
示例#19
0
        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)
        {
            String filename = "../../../../examples/data/learningeffect_default.data";
            int failLimit = 10000;
            int nbJobs, nbMachines;

            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);

            nbJobs = data.Next();
            nbMachines = data.Next();
            IIntExpr[] ends = new IIntExpr[nbJobs];

            IIntervalVar[][] machines = new IIntervalVar[nbMachines][];
            int[][] sizes = new int[nbMachines][];
            for (int j = 0; j < nbMachines; j++) {
                 machines[j] = new IIntervalVar[nbJobs];
                 sizes[j] = new int[nbJobs];
            }

            for (int i = 0; i < nbJobs; i++)
            {
                IIntervalVar prec = cp.IntervalVar();
                for (int j = 0; j < nbMachines; j++)
                {
                    int m, d;
                    m = data.Next();
                    d = data.Next();
                    IIntervalVar ti = cp.IntervalVar(0, d);
                    machines[m][i] = ti;
                    sizes[m][i] = d;
                    if (j > 0)
                    {
                        cp.Add(cp.EndBeforeStart(prec, ti));
                    }
                    prec = ti;
                }
                ends[i] = cp.EndOf(prec);
            }

            for (int j = 0; j < nbMachines; j++)
            {
                double alpha = data.Next() / ((double) 100);
                IIntervalVar[] chain = new IIntervalVar[nbJobs];
                IIntervalVar prec = cp.IntervalVar();
                IIntExpr[] indices = new IIntExpr[nbJobs];
                for (int i = 0; i < nbJobs; i++) {
                    IIntervalVar syncti = cp.IntervalVar();
                    if (i > 0)
                    {
                       cp.Add(cp.EndBeforeStart(prec, syncti));
                    }
                    prec = syncti;
                    chain[i] = syncti;
                    IIntExpr index = cp.IntVar(0, nbJobs -1);
                    indices[i] = index;
                    // Learning effect captured by the decreasing function
                    // of the position (0 <= alpha <= 1).
                    // At first position, in the sequence index = 0; there is no
                    // learning effect and duration of the task is its nominal duration
                    cp.Add(cp.Eq(cp.SizeOf(machines[j][i]),
                                 cp.Floor(cp.Prod(sizes[j][i],
                                                  cp.Power(alpha, index)))));
                }
                cp.Add(cp.Isomorphism(chain, machines[j], indices, nbJobs));
                // The no-overlap is a redundant constraint in this quite
                // simple model - it is used only to provide stronger inference.
                cp.Add(cp.NoOverlap(machines[j]));
            }

            IObjective objective = cp.Minimize(cp.Max(ends));
            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.");
            }
        }
示例#21
0
        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));
            }
        }
示例#22
0
        public static void Main(String[] args)
        {
            String filename  = "../../../../examples/data/jobshopflex_default.data";
            int    failLimit = 10000;

            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);
            int        nbJobs     = data.Next();
            int        nbMachines = data.Next();

            List <IIntervalVar>[] machines = new List <IIntervalVar> [nbMachines];
            for (int j = 0; j < nbMachines; j++)
            {
                machines[j] = new List <IIntervalVar>();
            }
            List <IIntExpr> ends = new List <IIntExpr>();

            for (int i = 0; i < nbJobs; i++)
            {
                int          nbOperations = data.Next();
                IIntervalVar prec         = cp.IntervalVar();
                for (int j = 0; j < nbOperations; j++)
                {
                    int                 nbOpMachines = data.Next();
                    IIntervalVar        master       = cp.IntervalVar();
                    List <IIntervalVar> members      = new List <IIntervalVar>();
                    for (int k = 0; k < nbOpMachines; k++)
                    {
                        int          m      = data.Next();
                        int          d      = data.Next();
                        IIntervalVar member = cp.IntervalVar(d);
                        member.SetOptional();
                        members.Add(member);
                        machines[m - 1].Add(member);
                    }
                    cp.Add(cp.Alternative(master, members.ToArray()));
                    if (j > 0)
                    {
                        cp.Add(cp.EndBeforeStart(prec, master));
                    }
                    prec = master;
                }
                ends.Add(cp.EndOf(prec));
            }

            for (int j = 0; j < nbMachines; j++)
            {
                cp.Add(cp.NoOverlap(machines[j].ToArray()));
            }

            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)
        {
            String filename  = "../../../../examples/data/stochastic_jobshop_default.data";
            int    failLimit = 250000;

            if (args.Length > 0)
            {
                filename = args[0];
            }
            if (args.Length > 1)
            {
                failLimit = Convert.ToInt32(args[1]);
            }

            // Data reading
            DataReader data = new DataReader(filename);
            int        nbJobs, nbMachines, nbScenarios;

            nbJobs      = data.Next();
            nbMachines  = data.Next();
            nbScenarios = data.Next();
            int i, j, k;

            // machines[i][j]: machine used by jth operation of job i
            int[][] machines = new int[nbJobs][];
            for (i = 0; i < nbJobs; i++)
            {
                machines[i] = new int[nbMachines];
                for (j = 0; j < nbMachines; j++)
                {
                    machines[i][j] = data.Next();
                }
            }
            // durations[k][i][j]: duration of jth operation of job i in scenario k
            int[][][] durations = new int[nbScenarios][][];
            for (k = 0; k < nbScenarios; k++)
            {
                durations[k] = new int[nbJobs][];
                for (i = 0; i < nbJobs; i++)
                {
                    durations[k][i] = new int[nbMachines];
                    for (j = 0; j < nbMachines; j++)
                    {
                        durations[k][i][j] = data.Next();
                    }
                }
            }

            CP cp = new CP();

            IIntervalSequenceVar[] refSequences = new IIntervalSequenceVar[nbMachines];
            IIntExpr sumMakespan = cp.IntExpr();

            for (k = 0; k < nbScenarios; k++)
            {
                IIntervalSequenceVar[] scenarioSequences = new IIntervalSequenceVar[nbMachines];
                IIntExpr scenarioMakespan =
                    MakeScenarioSubmodel(cp, nbJobs, nbMachines,
                                         machines, durations[k],
                                         scenarioSequences);
                // Objective function is aggregated
                sumMakespan = cp.Sum(sumMakespan, scenarioMakespan);
                // For each machine, a sameSequence constraint is posted across all scenarios
                if (0 == k)
                {
                    refSequences = scenarioSequences;
                }
                else
                {
                    for (j = 0; j < nbMachines; j++)
                    {
                        cp.Add(cp.SameSequence(refSequences[j], scenarioSequences[j]));
                    }
                }
            }
            // Objective function is expected makespan
            INumExpr   expectedMakespan = cp.Quot(sumMakespan, nbScenarios);
            IObjective objective        = cp.Minimize(expectedMakespan);

            cp.Add(objective);
            cp.SetParameter(CP.IntParam.FailLimit, failLimit);
            cp.SetParameter(CP.IntParam.LogPeriod, 1000000);
            Console.WriteLine("Instance \t: " + filename);
            if (cp.Solve())
            {
                Console.WriteLine("Expected makespan \t: " + cp.ObjValue);
                for (j = 0; j < nbMachines; ++j)
                {
                    IIntervalSequenceVar s = refSequences[j];
                    Console.Write(s.Name + ":\t");
                    IIntervalVar op = cp.GetFirst(s);
                    for (; !op.Equals(cp.GetLast(s)); op = cp.GetNext(s, op))
                    {
                        Console.Write(op.Name + "\t");
                    }
                    Console.WriteLine(op.Name + "\t");
                }
            }
            else
            {
                Console.WriteLine("No solution found.");
            }
        }
示例#24
0
        private void CreateModel(String dataFile)
        {
            DataReader data = new DataReader(dataFile);

            nbJobs     = data.Next();
            nbMachines = data.Next();

            int[] rel = new int[nbJobs];
            int[] due = new int[nbJobs];

            costs = new int[nbMachines][];
            int[][] dur = new int[nbMachines][];
            for (int j = 0; j < nbMachines; j++)
            {
                costs[j] = new int[nbJobs];
                dur[j]   = new int[nbJobs];
            }

            for (int i = 0; i < nbJobs; i++)
            {
                rel[i] = data.Next();
            }

            for (int i = 0; i < nbJobs; i++)
            {
                due[i] = data.Next();
            }

            for (int j = 0; j < nbMachines; j++)
            {
                for (int i = 0; i < nbJobs; i++)
                {
                    costs[j][i] = data.Next();
                }
            }

            for (int j = 0; j < nbMachines; j++)
            {
                for (int i = 0; i < nbJobs; i++)
                {
                    dur[j][i] = data.Next();
                }
            }

            machines = new IIntervalVar[nbMachines][];
            for (int j = 0; j < nbMachines; j++)
            {
                machines[j] = new IIntervalVar[nbJobs];
            }
            for (int i = 0; i < nbJobs; i++)
            {
                IIntervalVar job = cp.IntervalVar();
                job.StartMin = rel[i];
                job.EndMax   = due[i];
                job.Name     = "Op" + i;
                IIntervalVar[] jobm = new IIntervalVar[nbMachines];
                for (int j = 0; j < nbMachines; j++)
                {
                    jobm[j]      = cp.IntervalVar(dur[j][i]);
                    jobm[j].Name = "Alt" + i + "_" + j + "_C" + costs[j][i];
                    jobm[j].SetOptional();
                    machines[j][i] = jobm[j];
                }
                cp.Add(cp.Alternative(job, jobm));
            }
            for (int j = 0; j < nbMachines; j++)
            {
                cp.Add(cp.NoOverlap(machines[j]));
            }
        }
        public static void Main(String[] args)
        {
            String filename = "../../../../examples/data/learningeffect_default.data";
            int    nbJobs, nbMachines;

            if (args.Length > 0)
            {
                filename = args[0];
            }

            CP         cp   = new CP();
            DataReader data = new DataReader(filename);

            nbJobs     = data.Next();
            nbMachines = data.Next();
            IIntExpr[] ends = new IIntExpr[nbJobs];

            IIntervalVar[][] machines = new IIntervalVar[nbMachines][];
            int[][]          sizes    = new int[nbMachines][];
            for (int j = 0; j < nbMachines; j++)
            {
                machines[j] = new IIntervalVar[nbJobs];
                sizes[j]    = new int[nbJobs];
            }

            for (int i = 0; i < nbJobs; i++)
            {
                IIntervalVar prec = cp.IntervalVar();
                for (int j = 0; j < nbMachines; j++)
                {
                    int m, d;
                    m = data.Next();
                    d = data.Next();
                    IIntervalVar ti = cp.IntervalVar(0, d);
                    machines[m][i] = ti;
                    sizes[m][i]    = d;
                    if (j > 0)
                    {
                        cp.Add(cp.EndBeforeStart(prec, ti));
                    }
                    prec = ti;
                }
                ends[i] = cp.EndOf(prec);
            }

            for (int j = 0; j < nbMachines; j++)
            {
                double         alpha   = data.Next() / ((double)100);
                IIntervalVar[] chain   = new IIntervalVar[nbJobs];
                IIntervalVar   prec    = cp.IntervalVar();
                IIntExpr[]     indices = new IIntExpr[nbJobs];
                for (int i = 0; i < nbJobs; i++)
                {
                    IIntervalVar syncti = cp.IntervalVar();
                    if (i > 0)
                    {
                        cp.Add(cp.EndBeforeStart(prec, syncti));
                    }
                    prec     = syncti;
                    chain[i] = syncti;
                    IIntExpr index = cp.IntVar(0, nbJobs - 1);
                    indices[i] = index;
                    // Learning effect captured by the decreasing function
                    // of the position (0 <= alpha <= 1).
                    // At first position, in the sequence index = 0; there is no
                    // learning effect and duration of the task is its nominal duration
                    INumExpr floatDur = cp.Prod(sizes[j][i], cp.Power(alpha, index));
                    cp.Add(cp.Le(
                               cp.Abs(cp.Diff(floatDur, cp.SizeOf(machines[j][i]))),
                               0.5)
                           );
                }
                cp.Add(cp.Isomorphism(chain, machines[j], indices, nbJobs));
                // The no-overlap is a redundant constraint in this quite
                // simple model - it is used only to provide stronger inference.
                cp.Add(cp.NoOverlap(machines[j]));
            }

            IObjective objective = cp.Minimize(cp.Max(ends));

            cp.Add(objective);
            cp.SetParameter(CP.IntParam.LogPeriod, 10000);

            Console.WriteLine("Instance \t: " + filename);
            if (cp.Solve())
            {
                Console.WriteLine("Makespan \t: " + cp.ObjValue);
            }
            else
            {
                Console.WriteLine("No solution found.");
            }
        }
示例#26
0
        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);
            }
        }
示例#27
0
        public static void Main(String[] args)
        {
            String filename = "../../../../examples/data/flowshop_default.data";
            int    failLimit = 10000;
            int    nbJobs, nbMachines;

            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);

            nbJobs     = data.Next();
            nbMachines = data.Next();

            List <IIntExpr> ends = new List <IIntExpr>();

            List <IIntervalVar>[] machines = new List <IIntervalVar> [nbMachines];
            for (int j = 0; j < nbMachines; j++)
            {
                machines[j] = new List <IIntervalVar>();
            }
            for (int i = 0; i < nbJobs; i++)
            {
                IIntervalVar prec = cp.IntervalVar();
                for (int j = 0; j < nbMachines; j++)
                {
                    int          d  = data.Next();
                    IIntervalVar ti = cp.IntervalVar(d);
                    machines[j].Add(ti);
                    if (j > 0)
                    {
                        cp.Add(cp.EndBeforeStart(prec, ti));
                    }
                    prec = ti;
                }
                ends.Add(cp.EndOf(prec));
            }

            IIntervalSequenceVar[] seqs = new IIntervalSequenceVar[nbMachines];
            for (int j = 0; j < nbMachines; j++)
            {
                seqs[j] = cp.IntervalSequenceVar(machines[j].ToArray());
                cp.Add(cp.NoOverlap(seqs[j]));
                if (0 < j)
                {
                    cp.Add(cp.SameSequence(seqs[0], seqs[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.");
            }
        }
示例#28
0
 public static INumExpr TardinessCost(IIntervalVar task, int dd, double weight, int useFunction)
 {
     if (useFunction != 0) {
     double[] arrX = {dd};
     double[] arrV = {0.0, weight};
     INumToNumSegmentFunction f = cp.PiecewiseLinearFunction(arrX, arrV, dd, 0.0);
     return cp.EndEval(task,f);
     }
     else
     {
     return cp.Prod(weight, cp.Max(0, cp.Diff(cp.EndOf(task),dd)));
     }
 }
示例#29
0
        public static void Main(String[] args)
        {
            try
            {
            CP cp = new CP();

            ITransitionDistance setup1 = cp.TransitionDistance(NbTypes);
            ITransitionDistance setup2 = cp.TransitionDistance(NbTypes);
            int i, j;
            for (i = 0; i < NbTypes; ++i)
            {
                for (j = 0; j < NbTypes; ++j)
                {
                    setup1.SetValue(i, j, SetupM1[NbTypes * i + j]);
                    setup2.SetValue(i, j, SetupM2[NbTypes * i + j]);
                }
            }
            int[] tp = new int[NbTasks];
            IIntervalVar[] a = new IIntervalVar[NbTasks];
            IIntervalVar[] a1 = new IIntervalVar[NbTasks];
            IIntervalVar[] a2 = new IIntervalVar[NbTasks];

            String name;
            for (i = 0; i < NbTasks; ++i)
            {
                int type = TaskType[i];
                int d = TaskDur[i];
                tp[i] = type;
                name = "A" + i + "_TP" + type;
                a[i] = cp.IntervalVar(d, name);
                IIntervalVar[] alt = new IIntervalVar[2];
                name = "A" + i + "_M1_TP" + type;
                a1[i] = cp.IntervalVar(name);
                a1[i].SetOptional();
                alt[0] = a1[i];
                name = "A" + i + "_M2_TP" + type;
                a2[i] = cp.IntervalVar(name);
                a2[i].SetOptional();
                alt[1] = a2[i];
                cp.Add(cp.Alternative(a[i], alt));
            }

            IIntervalSequenceVar s1 = cp.IntervalSequenceVar(a1, tp);
            IIntervalSequenceVar s2 = cp.IntervalSequenceVar(a2, tp);
            cp.Add(cp.NoOverlap(s1, setup1, true));
            cp.Add(cp.NoOverlap(s2, setup2, true));

            IIntExpr nbLongSetups = cp.IntExpr();
            for (i = 0; i < NbTasks; ++i)
            {
                int tpi = TaskType[i];
                int[] isLongSetup1 = new int[NbTypes + 1];
                int[] isLongSetup2 = new int[NbTypes + 1];
                for (j = 0; j < NbTypes; ++j)
                {
                    isLongSetup1[j] = (30 <= SetupM1[NbTypes * tpi + j]) ? 1 : 0;
                    isLongSetup2[j] = (30 <= SetupM2[NbTypes * tpi + j]) ? 1 : 0;
                }
                isLongSetup1[NbTypes] = 0; // Last on resource or resource not selected
                isLongSetup2[NbTypes] = 0; // Last on resource or resource not selected
                nbLongSetups = cp.Sum(nbLongSetups,
                                      cp.Element(isLongSetup1, cp.TypeOfNext(s1, a1[i], NbTypes, NbTypes)));
                nbLongSetups = cp.Sum(nbLongSetups,
                                      cp.Element(isLongSetup2, cp.TypeOfNext(s2, a2[i], NbTypes, NbTypes)));
            }
            cp.Add(cp.Minimize(nbLongSetups));

            cp.SetParameter(CP.IntParam.FailLimit, 100000);
            cp.SetParameter(CP.IntParam.LogPeriod, 10000);
            if (cp.Solve())
            {
                Console.WriteLine("Machine 1: ");
                IIntervalVar x;
                for (x = cp.GetFirst(s1); !x.Equals(cp.GetLast(s1)); x = cp.GetNext(s1, x))
                    Console.WriteLine(cp.GetDomain(x));
                Console.WriteLine(cp.GetDomain(x));
                Console.WriteLine("Machine 2: ");
                for (x = cp.GetFirst(s2); !x.Equals(cp.GetLast(s2)); x = cp.GetNext(s2, x))
                    Console.WriteLine(cp.GetDomain(x));
                Console.WriteLine(cp.GetDomain(x));
                Console.WriteLine("Number of long transition times \t: " + cp.ObjValue);
            }
            else
            {
                Console.WriteLine("No solution found.");
            }

            }
            catch (IloException e)
            {
            Console.WriteLine("Error: " + e);
            }
        }
示例#30
0
        public static void Main(String[] args)
        {
            try
            {
                CP cp = new CP();

                ITransitionDistance setup1 = cp.TransitionDistance(NbTypes);
                ITransitionDistance setup2 = cp.TransitionDistance(NbTypes);
                int i, j;
                for (i = 0; i < NbTypes; ++i)
                {
                    for (j = 0; j < NbTypes; ++j)
                    {
                        setup1.SetValue(i, j, SetupM1[NbTypes * i + j]);
                        setup2.SetValue(i, j, SetupM2[NbTypes * i + j]);
                    }
                }
                int[]          tp = new int[NbTasks];
                IIntervalVar[] a  = new IIntervalVar[NbTasks];
                IIntervalVar[] a1 = new IIntervalVar[NbTasks];
                IIntervalVar[] a2 = new IIntervalVar[NbTasks];

                String name;
                for (i = 0; i < NbTasks; ++i)
                {
                    int type = TaskType[i];
                    int d    = TaskDur[i];
                    tp[i] = type;
                    name  = "A" + i + "_TP" + type;
                    a[i]  = cp.IntervalVar(d, name);
                    IIntervalVar[] alt = new IIntervalVar[2];
                    name  = "A" + i + "_M1_TP" + type;
                    a1[i] = cp.IntervalVar(name);
                    a1[i].SetOptional();
                    alt[0] = a1[i];
                    name   = "A" + i + "_M2_TP" + type;
                    a2[i]  = cp.IntervalVar(name);
                    a2[i].SetOptional();
                    alt[1] = a2[i];
                    cp.Add(cp.Alternative(a[i], alt));
                }

                IIntervalSequenceVar s1 = cp.IntervalSequenceVar(a1, tp);
                IIntervalSequenceVar s2 = cp.IntervalSequenceVar(a2, tp);
                cp.Add(cp.NoOverlap(s1, setup1, true));
                cp.Add(cp.NoOverlap(s2, setup2, true));

                IIntExpr nbLongSetups = cp.IntExpr();
                for (i = 0; i < NbTasks; ++i)
                {
                    int   tpi          = TaskType[i];
                    int[] isLongSetup1 = new int[NbTypes + 1];
                    int[] isLongSetup2 = new int[NbTypes + 1];
                    for (j = 0; j < NbTypes; ++j)
                    {
                        isLongSetup1[j] = (30 <= SetupM1[NbTypes * tpi + j]) ? 1 : 0;
                        isLongSetup2[j] = (30 <= SetupM2[NbTypes * tpi + j]) ? 1 : 0;
                    }
                    isLongSetup1[NbTypes] = 0; // Last on resource or resource not selected
                    isLongSetup2[NbTypes] = 0; // Last on resource or resource not selected
                    nbLongSetups          = cp.Sum(nbLongSetups,
                                                   cp.Element(isLongSetup1, cp.TypeOfNext(s1, a1[i], NbTypes, NbTypes)));
                    nbLongSetups = cp.Sum(nbLongSetups,
                                          cp.Element(isLongSetup2, cp.TypeOfNext(s2, a2[i], NbTypes, NbTypes)));
                }
                cp.Add(cp.Minimize(nbLongSetups));

                cp.SetParameter(CP.IntParam.FailLimit, 100000);
                cp.SetParameter(CP.IntParam.LogPeriod, 10000);
                if (cp.Solve())
                {
                    Console.WriteLine("Machine 1: ");
                    IIntervalVar x;
                    for (x = cp.GetFirst(s1); !x.Equals(cp.GetLast(s1)); x = cp.GetNext(s1, x))
                    {
                        Console.WriteLine(cp.GetDomain(x));
                    }
                    Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine("Machine 2: ");
                    for (x = cp.GetFirst(s2); !x.Equals(cp.GetLast(s2)); x = cp.GetNext(s2, x))
                    {
                        Console.WriteLine(cp.GetDomain(x));
                    }
                    Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine("Number of long transition times \t: " + cp.ObjValue);
                }
                else
                {
                    Console.WriteLine("No solution found.");
                }
            }
            catch (IloException e)
            {
                Console.WriteLine("Error: " + e);
            }
        }
示例#31
0
        public static void Main(String[] args)
        {
            String filename = "../../../../examples/data/jobshop_default.data";
            int    nbJobs, nbMachines;

            if (args.Length > 0)
            {
                filename = args[0];
            }

            CP         cp   = new CP();
            DataReader data = new DataReader(filename);

            nbJobs     = data.Next();
            nbMachines = data.Next();
            List <IIntExpr> ends = new List <IIntExpr>();

            List <IIntervalVar>[] machines = new List <IIntervalVar> [nbMachines];
            for (int j = 0; j < nbMachines; j++)
            {
                machines[j] = new List <IIntervalVar>();
            }

            for (int i = 0; i < nbJobs; i++)
            {
                IIntervalVar prec = cp.IntervalVar();
                for (int j = 0; j < nbMachines; j++)
                {
                    int m, d;
                    m = data.Next();
                    d = data.Next();
                    IIntervalVar ti = cp.IntervalVar(d);
                    machines[m].Add(ti);
                    if (j > 0)
                    {
                        cp.Add(cp.EndBeforeStart(prec, ti));
                    }
                    prec = ti;
                }
                ends.Add(cp.EndOf(prec));
            }

            for (int j = 0; j < nbMachines; j++)
            {
                cp.Add(cp.NoOverlap(machines[j].ToArray()));
            }

            IObjective objective = cp.Minimize(cp.Max(ends.ToArray()));

            cp.Add(objective);

            Console.WriteLine("Instance \t: " + filename);
            if (cp.Solve())
            {
                Console.WriteLine("Makespan \t: " + cp.ObjValue);
            }
            else
            {
                Console.WriteLine("No solution found.");
            }
        }
示例#32
0
 public static INumExpr tardinessCost(IIntervalVar task, int dd, double weight)
 {
     return cp.Prod(weight, cp.Max(0, cp.Diff(cp.EndOf(task), dd)));
 }
示例#33
0
        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);
            }
        }
示例#34
0
        public static void Main(String[] args)
        {
            String filename  = "../../../../examples/data/openshop_default.data";
            int    failLimit = 10000;

            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);
            int        nbJobs     = data.Next();
            int        nbMachines = data.Next();

            List <IIntervalVar>[] jobs = new List <IIntervalVar> [nbJobs];
            for (int i = 0; i < nbJobs; i++)
            {
                jobs[i] = new List <IIntervalVar>();
            }
            List <IIntervalVar>[] machines = new List <IIntervalVar> [nbMachines];
            for (int j = 0; j < nbMachines; j++)
            {
                machines[j] = new List <IIntervalVar>();
            }

            List <IIntExpr> ends = new List <IIntExpr>();

            for (int i = 0; i < nbJobs; i++)
            {
                for (int j = 0; j < nbMachines; j++)
                {
                    int          pt = data.Next();
                    IIntervalVar ti = cp.IntervalVar(pt);
                    jobs[i].Add(ti);
                    machines[j].Add(ti);
                    ends.Add(cp.EndOf(ti));
                }
            }

            for (int i = 0; i < nbJobs; i++)
            {
                cp.Add(cp.NoOverlap(jobs[i].ToArray()));
            }

            for (int j = 0; j < nbMachines; j++)
            {
                cp.Add(cp.NoOverlap(machines[j].ToArray()));
            }

            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.");
            }
        }
示例#35
0
        private void CreateModel(String dataFile)
        {
            DataReader data = new DataReader(dataFile);
            nbJobs = data.Next();
            nbMachines = data.Next();

            int[] rel = new int[nbJobs];
            int[] due = new int[nbJobs];

            costs = new int[nbMachines][];
            int[][] dur = new int[nbMachines][];
            for (int j = 0; j < nbMachines; j++)
            {
                costs[j] = new int[nbJobs];
                dur[j] = new int[nbJobs];
            }

            for (int i = 0; i < nbJobs; i++)
                rel[i] = data.Next();

            for (int i = 0; i < nbJobs; i++)
                due[i] = data.Next();

            for (int j = 0; j < nbMachines; j++)
                for (int i = 0; i < nbJobs; i++)
                    costs[j][i] = data.Next();

            for (int j = 0; j < nbMachines; j++)
                for (int i = 0; i < nbJobs; i++)
                    dur[j][i] = data.Next();

            machines = new IIntervalVar[nbMachines][];
            for (int j = 0; j < nbMachines; j++)
                machines[j] = new IIntervalVar[nbJobs];
            for (int i = 0; i < nbJobs; i++)
            {
                IIntervalVar job = cp.IntervalVar();
                job.StartMin = rel[i];
                job.EndMax = due[i];
                job.Name = "Op" + i;
                IIntervalVar[] jobm = new IIntervalVar[nbMachines];
                for (int j = 0; j < nbMachines; j++)
                {
                    jobm[j] = cp.IntervalVar(dur[j][i]);
                    jobm[j].Name = "Alt" + i + "_" + j + "_C" + costs[j][i];
                    jobm[j].SetOptional();
                    machines[j][i] = jobm[j];
                }
                cp.Add(cp.Alternative(job, jobm));
            }
            for (int j = 0; j < nbMachines; j++)
                cp.Add(cp.NoOverlap(machines[j]));
        }
示例#36
0
        public static void Main(String[] args)
        {
            try
            {
                CP cp = new CP();
                ITransitionDistance setup1 = cp.TransitionDistance(NbTypes);
                ITransitionDistance setup2 = cp.TransitionDistance(NbTypes);
                int i, j;
                for (i = 0; i < NbTypes; ++i)
                {
                    for (j = 0; j < NbTypes; ++j)
                    {
                        int d1 = SetupM1[NbTypes * i + j];
                        if (d1 < 0)
                        {
                            d1 = CP.IntervalMax; // Forbidden transition
                        }
                        setup1.SetValue(i, j, d1);
                        int d2 = SetupM2[NbTypes * i + j];
                        if (d2 < 0)
                        {
                            d2 = CP.IntervalMax; // Forbidden transition
                        }
                        setup2.SetValue(i, j, d2);
                    }
                }
                int[]          tp   = new int[NbTasks];
                IIntervalVar[] a    = new IIntervalVar[NbTasks];
                IIntervalVar[] a1   = new IIntervalVar[NbTasks];
                IIntervalVar[] a2   = new IIntervalVar[NbTasks];
                IIntExpr[]     ends = new IIntExpr[NbTasks];

                String name;
                for (i = 0; i < NbTasks; ++i)
                {
                    int type = TaskType[i];
                    int d1   = TaskDurM1[i];
                    int d2   = TaskDurM2[i];
                    tp[i] = type;
                    name  = "A" + i + "_TP" + type;
                    a[i]  = cp.IntervalVar(name);
                    IIntervalVar[] alt = new IIntervalVar[2];
                    name  = "A" + i + "_M1_TP" + type;
                    a1[i] = cp.IntervalVar(d1, name);
                    a1[i].SetOptional();
                    alt[0] = a1[i];
                    name   = "A" + i + "_M2_TP" + type;
                    a2[i]  = cp.IntervalVar(d2, name);
                    a2[i].SetOptional();
                    alt[1] = a2[i];
                    cp.Add(cp.Alternative(a[i], alt));
                    ends[i] = cp.EndOf(a[i]);
                }

                IIntervalSequenceVar s1 = cp.IntervalSequenceVar(a1, tp);
                IIntervalSequenceVar s2 = cp.IntervalSequenceVar(a2, tp);
                cp.Add(cp.NoOverlap(s1, setup1, true));
                cp.Add(cp.NoOverlap(s2, setup2, true));
                cp.Add(cp.Minimize(cp.Max(ends)));

                cp.SetParameter(CP.IntParam.FailLimit, 100000);
                cp.SetParameter(CP.IntParam.LogPeriod, 10000);
                if (cp.Solve())
                {
                    Console.WriteLine("Machine 1: ");
                    IIntervalVar x;
                    for (x = cp.GetFirst(s1); !x.Equals(cp.GetLast(s1)); x = cp.GetNext(s1, x))
                    {
                        Console.WriteLine(cp.GetDomain(x));
                    }
                    Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine("Machine 2: ");
                    for (x = cp.GetFirst(s2); !x.Equals(cp.GetLast(s2)); x = cp.GetNext(s2, x))
                    {
                        Console.WriteLine(cp.GetDomain(x));
                    }
                    Console.WriteLine(cp.GetDomain(x));
                    Console.WriteLine("Makespan \t: " + cp.ObjValue);
                }
                else
                {
                    Console.WriteLine("No solution found.");
                }
            }
            catch (IloException e)
            {
                Console.WriteLine("Error: " + e);
            }
        }
示例#37
0
        public static void MakeHouse(
            CP cp,
            int id,
            List<IIntExpr> ends,
            List<IIntervalVar> allTasks,
            List<IIntervalVar> joeTasks,
            List<IIntervalVar> jimTasks
            )
        {
            /// 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);
                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 WORKER TASKS. ///
            joeTasks.Add(tasks[masonry]);
            joeTasks.Add(tasks[carpentry]);
            jimTasks.Add(tasks[plumbing]);
            jimTasks.Add(tasks[ceiling]);
            joeTasks.Add(tasks[roofing]);
            jimTasks.Add(tasks[painting]);
            jimTasks.Add(tasks[windows]);
            joeTasks.Add(tasks[facade]);
            joeTasks.Add(tasks[garden]);
            jimTasks.Add(tasks[moving]);

            /// DEFINING MINIMIZATION OBJECTIVE ///
            ends.Add(cp.EndOf(tasks[moving]));
        }
示例#38
0
 public static INumExpr tardinessCost(IIntervalVar task, int dd, double weight)
 {
     return(cp.Prod(weight, cp.Max(0, cp.Diff(cp.EndOf(task), dd))));
 }
示例#39
0
        public static void MakeHouse(
            List <IIntervalVar> allTasks,
            List <IIntervalVar> joeTasks,
            List <IIntervalVar> jimTasks,
            List <Int32> joeLocations,
            List <Int32> jimLocations,
            int loc,
            int rd,
            int dd,
            double weight)
        {
            /* CREATE THE TIME-INTERVALS. */
            String name = "H" + loc;

            IIntervalVar[] tasks = new IIntervalVar[nbTasks];
            for (int i = 0; i < nbTasks; i++)
            {
                name     = "H" + loc + "-" + taskNames[i];
                tasks[i] = cp.IntervalVar(taskDurations[i], name);
                allTasks.Add(tasks[i]);
            }

            /* SPAN CONSTRAINT */
            IIntervalVar house = cp.IntervalVar(name);

            cp.Add(cp.Span(house, tasks));

            /* ADDING TEMPORAL CONSTRAINTS. */
            house.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]));

            /* ALLOCATING TASKS TO WORKERS */
            joeTasks.Add(tasks[masonry]);
            joeLocations.Add(loc);
            joeTasks.Add(tasks[carpentry]);
            joeLocations.Add(loc);
            jimTasks.Add(tasks[plumbing]);
            jimLocations.Add(loc);
            jimTasks.Add(tasks[ceiling]);
            jimLocations.Add(loc);
            joeTasks.Add(tasks[roofing]);
            joeLocations.Add(loc);
            jimTasks.Add(tasks[painting]);
            jimLocations.Add(loc);
            jimTasks.Add(tasks[windows]);
            jimLocations.Add(loc);
            joeTasks.Add(tasks[facade]);
            joeLocations.Add(loc);
            joeTasks.Add(tasks[garden]);
            joeLocations.Add(loc);
            jimTasks.Add(tasks[moving]);
            jimLocations.Add(loc);

            /* DEFINING MINIMIZATION OBJECTIVE */
            cost = cp.Sum(cost, tardinessCost(house, dd, weight));
            cost = cp.Sum(cost, cp.LengthOf(house));
        }
示例#40
0
        public static void MakeHouse(List <IIntervalVar> allTasks,
                                     List <IIntervalVar>[] workerTasks,
                                     int id,
                                     int deadline)
        {
            /* CREATE THE INTERVAL VARIABLES. */
            String name;

            IIntervalVar[] tasks = new IIntervalVar[nbTasks];
            IIntervalVar[,] taskMatrix = new IIntervalVar[nbTasks, nbWorkers];

            for (int i = 0; i < nbTasks; i++)
            {
                name     = "H" + id + "-" + taskNames[i];
                tasks[i] = cp.IntervalVar(taskDurations[i], name);

                /* ALLOCATING TASKS TO WORKERS. */
                List <IIntervalVar> alttasks = new List <IIntervalVar>();
                for (int w = 0; w < nbWorkers; w++)
                {
                    if (HasSkill(w, i))
                    {
                        name = "H" + id + "-" + taskNames[i] + "-" + workerNames[w];
                        IIntervalVar wtask = cp.IntervalVar(taskDurations[i], name);
                        wtask.SetOptional();
                        alttasks.Add(wtask);
                        taskMatrix[i, w] = wtask;
                        workerTasks[w].Add(wtask);
                        allTasks.Add(wtask);
                        /* DEFINING MAXIMIZATION OBJECTIVE. */
                        skill = cp.Sum(skill, cp.Prod(SkillLevel(w, i), cp.PresenceOf(wtask)));
                    }
                }
                cp.Add(cp.Alternative(tasks[i], alttasks.ToArray()));
            }

            /* ADDING PRECEDENCE CONSTRAINTS. */
            tasks[moving].EndMax = deadline;
            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 SAME-WORKER CONSTRAINTS. */
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[masonry, joe]),
                                   cp.PresenceOf(taskMatrix[carpentry, joe]))));
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[roofing, jack]),
                                   cp.PresenceOf(taskMatrix[facade, jack]))));
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[carpentry, joe]),
                                   cp.PresenceOf(taskMatrix[roofing, joe]))));
            cp.Add(cp.Add(cp.Equiv(cp.PresenceOf(taskMatrix[garden, jim]),
                                   cp.PresenceOf(taskMatrix[moving, jim]))));
        }
示例#41
0
        public static void Main(String[] args)
        {
            CP cp = new CP();

            /* CREATE THE TIME-INTERVALS. */
            IIntervalVar masonry   = cp.IntervalVar(35, "masonry   ");
            IIntervalVar carpentry = cp.IntervalVar(15, "carpentry ");
            IIntervalVar plumbing  = cp.IntervalVar(40, "plumbing  ");
            IIntervalVar ceiling   = cp.IntervalVar(15, "ceiling   ");
            IIntervalVar roofing   = cp.IntervalVar(5, "roofing   ");
            IIntervalVar painting  = cp.IntervalVar(10, "painting  ");
            IIntervalVar windows   = cp.IntervalVar(5, "windows   ");
            IIntervalVar facade    = cp.IntervalVar(10, "facade    ");
            IIntervalVar garden    = cp.IntervalVar(5, "garden    ");
            IIntervalVar moving    = cp.IntervalVar(5, "moving    ");

            /* ADDING TEMPORAL CONSTRAINTS. */
            cp.Add(cp.EndBeforeStart(masonry, carpentry));
            cp.Add(cp.EndBeforeStart(masonry, plumbing));
            cp.Add(cp.EndBeforeStart(masonry, ceiling));
            cp.Add(cp.EndBeforeStart(carpentry, roofing));
            cp.Add(cp.EndBeforeStart(ceiling, painting));
            cp.Add(cp.EndBeforeStart(roofing, windows));
            cp.Add(cp.EndBeforeStart(roofing, facade));
            cp.Add(cp.EndBeforeStart(plumbing, facade));
            cp.Add(cp.EndBeforeStart(roofing, garden));
            cp.Add(cp.EndBeforeStart(plumbing, garden));
            cp.Add(cp.EndBeforeStart(windows, moving));
            cp.Add(cp.EndBeforeStart(facade, moving));
            cp.Add(cp.EndBeforeStart(garden, moving));
            cp.Add(cp.EndBeforeStart(painting, moving));

            /* DEFINING MINIMIZATION OBJECTIVE */
            int      useFunction = 1;
            INumExpr cost        = cp.NumExpr();

            cost = cp.Sum(cost, EarlinessCost(masonry, 25, 200.0, useFunction));
            cost = cp.Sum(cost, EarlinessCost(carpentry, 75, 300.0, useFunction));
            cost = cp.Sum(cost, EarlinessCost(ceiling, 75, 100.0, useFunction));
            cost = cp.Sum(cost, TardinessCost(moving, 100, 400.0, useFunction));
            cp.Add(cp.Minimize(cost));

            /* SOLVING. */
            if (cp.Solve())
            {
                Console.WriteLine("Optimal Value: " + cp.ObjValue);
                Console.WriteLine(cp.GetDomain(masonry));
                Console.WriteLine(cp.GetDomain(carpentry));
                Console.WriteLine(cp.GetDomain(plumbing));
                Console.WriteLine(cp.GetDomain(ceiling));
                Console.WriteLine(cp.GetDomain(roofing));
                Console.WriteLine(cp.GetDomain(painting));
                Console.WriteLine(cp.GetDomain(windows));
                Console.WriteLine(cp.GetDomain(facade));
                Console.WriteLine(cp.GetDomain(garden));
                Console.WriteLine(cp.GetDomain(moving));
            }
            else
            {
                Console.WriteLine("No solution found. ");
            }
        }
示例#42
0
        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]));
        }