Beispiel #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);
            }
        }
Beispiel #2
0
        public static void Main(String[] args)
        {
            workersUsage = cp.CumulFunctionExpr();
            cash         = cp.CumulFunctionExpr();
            List <IIntExpr>     ends     = new List <IIntExpr>();
            List <IIntervalVar> allTasks = new List <IIntervalVar>();

            /* CASH PAYMENTS */
            for (int p = 0; p < 5; ++p)
            {
                cash.Add(cp.Step(60 * p, 30000));
            }

            MakeHouse(0, 31, ends, allTasks);
            MakeHouse(1, 0, ends, allTasks);
            MakeHouse(2, 90, ends, allTasks);
            MakeHouse(3, 120, ends, allTasks);
            MakeHouse(4, 90, ends, allTasks);

            cp.Add(cp.Le(0, cash));

            cp.Add(cp.Le(workersUsage, nbWorkers));

            cp.Add(cp.Minimize(cp.Max(ends.ToArray())));

            /* EXTRACTING THE MODEL AND SOLVING. */
            cp.SetParameter(CP.IntParam.FailLimit, 10000);
            if (cp.Solve())
            {
                Console.WriteLine("Solution with objective " + cp.ObjValue + ":");
                for (int i = 0; i < allTasks.Count; i++)
                {
                    Console.WriteLine(cp.GetDomain(allTasks[i]));
                }
                int segs = cp.GetNumberOfSegments(cash);
                for (int i = 0; i < segs; i++)
                {
                    Console.WriteLine(
                        "Cash is " + cp.GetSegmentValue(cash, i) +
                        " from " + cp.GetSegmentStart(cash, i) +
                        " to " + (cp.GetSegmentEnd(cash, i) - 1)
                        );
                }
            }
            else
            {
                Console.WriteLine("No Solution found.");
            }
        }
Beispiel #3
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]));
        }
Beispiel #4
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]));
        }
Beispiel #5
0
        public static void Main(String[] args)
        {
            CP cp = new CP();
            List <IIntExpr>     ends     = new List <IIntExpr>();
            List <IIntervalVar> allTasks = new List <IIntervalVar>();
            ITransitionDistance ttime    = cp.TransitionDistance(2);

            ttime.SetValue(dirty, clean, 1);
            workers = cp.CumulFunctionExpr();
            IStateFunction[] houseState = new IStateFunction[nbHouses];
            for (int i = 0; i < nbHouses; i++)
            {
                houseState[i] = cp.StateFunction(ttime);
                MakeHouse(cp, i, ends, allTasks, houseState[i]);
            }
            cp.Add(cp.Le(workers, nbWorkers));
            cp.Add(cp.Minimize(cp.Max(ends.ToArray())));

            /* EXTRACTING THE MODEL AND SOLVING. */
            cp.SetParameter(CP.IntParam.FailLimit, 10000);
            if (cp.Solve())
            {
                for (int i = 0; i < allTasks.Count; i++)
                {
                    Console.WriteLine(cp.GetDomain(allTasks[i]));
                }
                for (int h = 0; h < nbHouses; h++)
                {
                    for (int i = 0; i < cp.GetNumberOfSegments(houseState[h]); i++)
                    {
                        Console.Write("House " + h + " has state ");
                        int s = cp.GetSegmentValue(houseState[h], i);
                        if (s == clean)
                        {
                            Console.Write("Clean");
                        }
                        else if (s == dirty)
                        {
                            Console.Write("Dirty");
                        }
                        else if (s == CP.NoState)
                        {
                            Console.Write("None");
                        }
                        else
                        {
                            Console.Write("Unknown (problem)");
                        }
                        Console.Write(" from ");
                        if (cp.GetSegmentStart(houseState[h], i) == CP.IntervalMin)
                        {
                            Console.Write("Min");
                        }
                        else
                        {
                            Console.Write(cp.GetSegmentStart(houseState[h], i));
                        }
                        Console.Write(" to ");
                        if (cp.GetSegmentEnd(houseState[h], i) == CP.IntervalMax)
                        {
                            Console.WriteLine("Max");
                        }
                        else
                        {
                            Console.WriteLine((cp.GetSegmentEnd(houseState[h], i) - 1));
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("No solution found. ");
            }
        }
Beispiel #6
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);
            }
        }
Beispiel #7
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);
        }
    }
Beispiel #8
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.");
            }
        }
 //----- 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);
     }
 }
Beispiel #10
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.");
            }
        }
Beispiel #11
0
        public static void Main(String[] args)
        {
            workersUsage = cp.CumulFunctionExpr();
            cash = cp.CumulFunctionExpr();
            List<IIntExpr> ends = new List<IIntExpr>();
            List<IIntervalVar> allTasks = new List<IIntervalVar>();

            /* CASH PAYMENTS */
            for (int p = 0; p < 5; ++p)
                cash.Add(cp.Step(60 * p, 30000));

            MakeHouse(0, 31, ends, allTasks);
            MakeHouse(1, 0, ends, allTasks);
            MakeHouse(2, 90, ends, allTasks);
            MakeHouse(3, 120, ends, allTasks);
            MakeHouse(4, 90, ends, allTasks);

            cp.Add(cp.Le(0, cash));

            cp.Add(cp.Le(workersUsage, nbWorkers));

            cp.Add(cp.Minimize(cp.Max(ends.ToArray())));

            /* EXTRACTING THE MODEL AND SOLVING. */
            cp.SetParameter(CP.IntParam.FailLimit, 10000);
            if (cp.Solve())
            {
                Console.WriteLine("Solution with objective " + cp.ObjValue + ":");
                for (int i = 0; i < allTasks.Count; i++)
                {
                    Console.WriteLine(cp.GetDomain(allTasks[i]));
                }
                int segs = cp.GetNumberOfSegments(cash);
                for (int i = 0; i < segs; i++)
                {
                    Console.WriteLine(
                      "Cash is " + cp.GetSegmentValue(cash, i) +
                      " from " + cp.GetSegmentStart(cash, i) +
                      " to " + (cp.GetSegmentEnd(cash, i) - 1)
                    );
                }
            }
            else
            {
                Console.WriteLine("No Solution found.");
            }
        }
Beispiel #12
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]));
        }
Beispiel #13
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));
            }
        }
Beispiel #14
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);
            }
        }
Beispiel #15
0
        public static void Main(String[] args)
        {
            CP cp = new CP();
            List<IIntExpr> ends = new List<IIntExpr>();
            List<IIntervalVar> allTasks = new List<IIntervalVar>();
            ITransitionDistance ttime = cp.TransitionDistance(2);
            ttime.SetValue(dirty, clean, 1);
            workers = cp.CumulFunctionExpr();
            IStateFunction[] houseState = new IStateFunction[nbHouses];
            for (int i = 0; i < nbHouses; i++) {
                houseState[i] = cp.StateFunction(ttime);
                MakeHouse(cp, i, ends, allTasks, houseState[i]);
            }
            cp.Add(cp.Le(workers, nbWorkers));
            cp.Add(cp.Minimize(cp.Max(ends.ToArray())));

            /* EXTRACTING THE MODEL AND SOLVING. */
            cp.SetParameter(CP.IntParam.FailLimit, 10000);
            if (cp.Solve()) {
                for (int i = 0; i < allTasks.Count; i++) {
                    Console.WriteLine(cp.GetDomain(allTasks[i]));
                }
                for (int h = 0; h < nbHouses; h++) {
                    for (int i = 0; i < cp.GetNumberOfSegments(houseState[h]); i++) {
                    Console.Write("House " + h + " has state ");
                    int s = cp.GetSegmentValue(houseState[h], i);
                    if (s == clean)                 Console.Write("Clean");
                    else if (s == dirty)            Console.Write("Dirty");
                    else if (s == CP.NoState)       Console.Write("None");
                    else                            Console.Write("Unknown (problem)");
                    Console.Write(" from ");
                    if (cp.GetSegmentStart(houseState[h], i) == CP.IntervalMin)  Console.Write("Min");
                    else Console.Write(cp.GetSegmentStart(houseState[h], i));
                    Console.Write(" to ");
                    if (cp.GetSegmentEnd(houseState[h], i) == CP.IntervalMax)    Console.WriteLine("Max");
                    else Console.WriteLine((cp.GetSegmentEnd(houseState[h], i) - 1));
                    }
                }
            } else {
                Console.WriteLine("No solution found. ");
            }
        }
Beispiel #16
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]));
        }