예제 #1
0
        public static bool Intersect(StartFinish deadline1, StartFinish deadline2)
        {
            int t1s = deadline1.start;
            int t1f = deadline1.finish;
            int t2s = deadline2.start;
            int t2f = deadline2.finish;

            if (t1s <= t2s && t2s < t1f)
            {
                return(true);
            }
            if (t1s < t2f && t1f >= t2f)
            {
                return(true);
            }
            if (t2s <= t1s && t1s < t2f)
            {
                return(true);
            }
            if (t2s < t1f && t2f >= t1f)
            {
                return(true);
            }
            return(false);
        }
예제 #2
0
        private void Compute()
        {
            int         m1 = 0;
            int         m2 = 0;
            double      currentSolution;
            double      nextSolution;
            double      delta    = 0;
            int         t        = (S.getlenL() / 2) + T.t1;
            StartFinish position = new StartFinish(S.getlenL() / 2, t);

            currentSolution = solver.ProbOfCompletion(position.start, position.finish);

            for (int i = 0; i < m0; i++)
            {
                //  Console.WriteLine(" Iteration =" + i + " ");
                position     = solver.GetNeighbour(position.start, position.finish); // new neighbor
                nextSolution = solver.ProbOfCompletion(position.start, position.finish);
                //   Console.WriteLine($"nextSolution {nextSolution}");
                if (nextSolution > currentSolution)
                {
                    m1++;
                    delta += nextSolution - currentSolution;
                }
                currentSolution = nextSolution;
                //  Console.WriteLine("Current =" + currentSolution);
            }
            m2     = m0 - m1;
            deltaF = delta / m1;
            X      = 0.8;
            double f = (double)m2 / ((double)m2 * X - (double)m1 * (1 - X));

            // Console.WriteLine("f " + f);
            c = deltaF / (Math.Log(f));

            epsilon = c / m0;
            this.m1 = m1;
            this.m2 = m2;

            PrintParameters();
        }
예제 #3
0
        public static StartFinish Merge(StartFinish deadline1, StartFinish deadline2)
        {
            int t1 = 0;
            int t2 = 0;

            if (deadline1.start >= deadline2.start) // d2 старт раньше
            {
                t1 = deadline2.start;
            }
            else
            {
                t1 = deadline1.start;
            }
            if (deadline1.finish >= deadline2.finish)
            {
                t2 = deadline1.finish;
            }
            else
            {
                t2 = deadline2.finish;
            }
            return(new StartFinish(t1, t2));
        }
예제 #4
0
        private void Rebuild(Task task, StartFinish deadline)
        {
            int numberOfSegment = 0;

            for (int i = 0; i < tasksInSegments.Count; i++)
            {
                if (tasksInSegments[i].Contains(task))
                {
                    tasksInSegments[i].Remove(task);
                    numberOfSegment = i;
                    if (tasksInSegments[i].Count == 0)
                    {
                        tasksInSegments.RemoveAt(i);
                        segment.RemoveAt(i);
                    }
                    else
                    {
                        segment[numberOfSegment] = new StartFinish(-1, -1);
                        foreach (Task t in tasksInSegments[numberOfSegment])
                        {
                            if (Intersect(t.deadline, segment[numberOfSegment]))
                            {
                                segment[numberOfSegment] = Merge(t.deadline, segment[numberOfSegment]);
                            }
                            else
                            {
                                segment[numberOfSegment] = new StartFinish(t.deadline.start, t.deadline.finish);
                            }
                        }
                    }
                }
            }
            bool isbroken = false;

            for (int i = 0; i < segment.Count; i++)
            {
                if (Intersect(deadline, segment[i]))
                {
                    tasksInSegments[i].Add(task);
                    segment[i] = Merge(segment[i], deadline);
                    isbroken   = true;
                }
            }
            if (!isbroken)
            {
                segment.Add(new StartFinish(deadline.start, deadline.finish));
                tasksInSegments.Add(new List <Task>()
                {
                    task
                });
            }

            /*     for (int i=0; i<segment.Count;i++)
             *   {
             *       Console.WriteLine($"Segment {segment[i].start} {segment[i].finish}");
             *       Console.WriteLine($"Tasks in it");
             *       foreach(var item in tasksInSegments[i])
             *       {
             *           Console.WriteLine(item.deadline.start+" "+item.deadline.finish);
             *       }
             *   }
             */
        }
예제 #5
0
        public void StartManagement()
        {
            m0 = 1000;
            int    iteraion = 0;
            Random rnd      = new Random();
            double r;
            bool   moved = true;

            while (moved)
            {
                int number = 0;
                iteraion++;
                moved = false;
                foreach (var item in tasks)
                {
                    number++;
                    double ck = 2.7;
                    Console.WriteLine($"Task{number} {item.deadline.start} {item.deadline.finish}");
                    double      acceptProbability;
                    List <Task> bestTasks       = new List <Task>();
                    List <Task> localtask       = new List <Task>();
                    StartFinish currentDeadline = new StartFinish(item.deadline.start, item.deadline.finish);
                    StartFinish bestDeadline    = new StartFinish(item.deadline.start, item.deadline.finish);
                    StartFinish deadline        = new StartFinish(item.deadline.start, item.deadline.finish);
                    double      nextSolution    = 0;
                    double      currentSolution = Welfare(new List <Task>(tasks));
                    double      bestSolution    = currentSolution;
                    while (ck > epsilon)

                    {
                        for (int k = 0; k < m0; k++)
                        {
                            r = rnd.NextDouble();
                            GSolver solver = new GSolver(this.S, item);
                            deadline = solver.GetNeighbour(currentDeadline.start, currentDeadline.finish);
                            Rebuild(item, deadline);
                            item.deadline = new StartFinish(deadline.start, deadline.finish);
                            nextSolution  = CurWelf(out localtask);

                            if (nextSolution > bestSolution)
                            {
                                bestSolution = nextSolution;
                                bestDeadline = new StartFinish(deadline.start, deadline.finish);
                                moved        = true;
                                bestTasks    = new List <Task>();
                                foreach (var task1 in localtask)
                                {
                                    bestTasks.Add(new Task(task1.B, task1.t1, task1.t2)
                                    {
                                        deadline = new StartFinish(task1.deadline.start, task1.deadline.finish), solution = task1.solution
                                    });
                                }

                                Console.WriteLine("New System");
                                Console.WriteLine($"New welfare {bestSolution}");
                                int num = 0;
                                foreach (var ttt in localtask)
                                {
                                    num++;

                                    Console.WriteLine($"{num}Deadline {ttt.deadline.start} {ttt.deadline.finish} {ttt.solution}");
                                }
                            }
                            if (nextSolution > currentSolution)
                            {
                                currentSolution = nextSolution;
                                currentDeadline = new StartFinish(deadline.start, deadline.finish);
                            }
                            else
                            {
                                acceptProbability = Math.Exp((currentSolution - nextSolution) / ck);
                                if (r < acceptProbability)
                                {
                                    currentSolution = nextSolution;
                                    currentDeadline = new StartFinish(deadline.start, deadline.finish);
                                }
                            }
                        }

                        ck = alpha * ck;
                    }
                    item.deadline = new StartFinish(bestDeadline.start, bestDeadline.finish);
                    int q = 0;
                    foreach (var Tt in bestTasks)
                    {
                        tasks[q].solution = Tt.solution;
                        tasks[q].deadline = new StartFinish(Tt.deadline.start, Tt.deadline.finish);
                        q++;
                    }
                }
            }

            finalWelfare = Welfare(new List <Task>(tasks));
            Console.WriteLine($"Initial objective function {initWelfare}");
            Console.WriteLine($"Final {finalWelfare}");
            double cost = finalWelfare - initWelfare;

            Console.WriteLine($"Cost of anarchy {cost}");
        }
예제 #6
0
        public void StartPlaying()
        {
            int    iteraion = 0;
            Random rnd      = new Random();
            double r;
            bool   moved = true;

            while (moved)
            {
                int index = 0;
                iteraion++;
                moved = false;
                foreach (var item in tasks)
                {
                    index++;
                    double ck = 2.7;
                    m0 = 700;
                    Console.WriteLine($"Task{index} {item.deadline.start} {item.deadline.finish}");
                    List <StartFinish> Localdeadlines = new List <StartFinish>();
                    List <Task>        LocalTasks     = new List <Task>();
                    double             acceptProbability;
                    StartFinish        currentDeadline = new StartFinish(item.deadline.start, item.deadline.finish);
                    StartFinish        bestDeadline    = new StartFinish(item.deadline.start, item.deadline.finish);
                    StartFinish        deadline        = new StartFinish(item.deadline.start, item.deadline.finish);
                    double             nextSolution    = 0;
                    double             currentSolution = item.solution;
                    double             bestSolution    = item.solution;
                    while (ck > epsilon)

                    {
                        for (int k = 0; k < m0; k++)
                        {
                            r = rnd.NextDouble();
                            GSolver solver = new GSolver(this.S, item);
                            deadline = solver.GetNeighbour(currentDeadline.start, currentDeadline.finish);
                            Rebuild(item, deadline);
                            item.deadline = new StartFinish(deadline.start, deadline.finish);
                            nextSolution  = CurWelf(out LocalTasks, index);

                            if (nextSolution > bestSolution)
                            {
                                bestSolution = nextSolution;
                                bestDeadline = new StartFinish(deadline.start, deadline.finish);
                                moved        = true;
                                for (int y = 0; y < tasks.Length; y++)
                                {
                                    tasks[y].solution = LocalTasks[y].solution;
                                    tasks[y].deadline = new StartFinish(LocalTasks[y].deadline.start, LocalTasks[y].deadline.finish);
                                }

                                Console.WriteLine("New System");
                                int num = 0;
                                foreach (var ttt in tasks)
                                {
                                    num++;
                                    if (ttt != item)
                                    {
                                        Console.WriteLine($"{num}Deadline {ttt.deadline.start} {ttt.deadline.finish} {ttt.solution}");
                                    }
                                    else
                                    {
                                        Console.WriteLine($"{num}Deadline {bestDeadline.start} {bestDeadline.finish} {bestSolution} ");
                                    }
                                }
                            }
                            if (nextSolution > currentSolution)
                            {
                                currentSolution = nextSolution;
                                currentDeadline = new StartFinish(deadline.start, deadline.finish);
                            }
                            else
                            {
                                acceptProbability = Math.Exp((currentSolution - nextSolution) / ck);
                                if (r < acceptProbability)
                                {
                                    currentSolution = nextSolution;
                                    currentDeadline = new StartFinish(deadline.start, deadline.finish);
                                }
                            }
                        }

                        ck = alpha * ck;
                    }
                    item.deadline = new StartFinish(bestDeadline.start, bestDeadline.finish);
                    item.solution = bestSolution;
                }
            }
            Console.WriteLine("END");
            Console.WriteLine(iteraion);
            // Console.WriteLine($"Initial Welfare {Welfare(new List<Task>(tasks))}");
            initWelfare = Welfare(new List <Task>(tasks));
        }
예제 #7
0
        public void SimulatedAnnealing()
        {
            int number = 0;

            foreach (Task T in tasks)
            {
                number++;
                Console.WriteLine($" Task number {number}");

                this.T      = T;
                this.solver = new GSolver(this.S, T);
                int k = 0;

                Compute();

                double      ck = c; // temperature
                double      r;
                double      acceptProbability;
                double      bestSolution    = 0;
                StartFinish bestDeadline    = new StartFinish(0, 0);
                StartFinish currentDeadline = new StartFinish(0, 0);
                double      currentSolution;
                double      nextSolution;
                int         t              = (T.t2 + T.t1) / 2;
                StartFinish deadline       = new StartFinish(0, t);
                List <Task> intersectTasks = new List <Task>();
                intersectTasks.Add(T);
                List <StartFinish> intersectDd = new List <StartFinish>();
                intersectDd.Add(deadline);
                for (int j = 0; j < segment.Count; j++)
                {
                    if (Intersect(deadline, segment[j]))
                    {
                        foreach (Task tk in tasksInSegments[j])
                        {
                            intersectTasks.Add(tk);
                            intersectDd.Add(tk.deadline);
                        }
                    }
                }
                currentSolution = solver.ProbOfCompletionModern(intersectDd, intersectTasks);
                currentDeadline = deadline;
                Random rnd = new Random();
                while (ck > epsilon)
                {
                    for (int i = 0; i < m0; i++)
                    {
                        r = rnd.NextDouble();
                        intersectTasks = new List <Task>();
                        intersectTasks.Add(T);
                        intersectDd = new List <StartFinish>();
                        intersectDd.Add(deadline);
                        for (int j = 0; j < segment.Count; j++)
                        {
                            if (Intersect(deadline, segment[j]))
                            {
                                foreach (Task tk in tasksInSegments[j])
                                {
                                    intersectTasks.Add(tk);
                                    intersectDd.Add(tk.deadline);
                                }
                            }
                        }
                        nextSolution = solver.ProbOfCompletionModern(intersectDd, intersectTasks);
                        if (nextSolution > bestSolution)
                        {
                            bestSolution = nextSolution;
                            bestDeadline = new StartFinish(deadline.start, deadline.finish);
                        }
                        if (nextSolution > currentSolution)
                        {
                            currentSolution = nextSolution;
                            currentDeadline = new StartFinish(deadline.start, deadline.finish);
                        }
                        else
                        {
                            acceptProbability = Math.Exp((currentSolution - nextSolution) / ck);
                            if (r < acceptProbability)
                            {
                                currentSolution = nextSolution;
                                currentDeadline = new StartFinish(deadline.start, deadline.finish);
                            }
                        }
                        solver = new GSolver(this.S, T);
                        int t1 = currentDeadline.start;
                        int t2 = currentDeadline.finish;
                        deadline = solver.GetNeighbour(t1, t2);
                    }

                    ck = alpha * ck;
                }
                this.deadlines.Add(new StartFinish(bestDeadline.start, bestDeadline.finish));
                T.setDD(new StartFinish(bestDeadline.start, bestDeadline.finish));
                this.solutions.Add(bestSolution);
                T.solution = bestSolution;
                T.index    = number;
                bool isbroken = false;
                for (int xy = 0; xy < segment.Count; xy++)       //
                {
                    if (Intersect(bestDeadline, segment[xy]))
                    {
                        segment[xy] = Merge(bestDeadline, segment[xy]);
                        tasksInSegments[xy].Add(T);
                        isbroken = true;
                    }
                }
                if (!isbroken)
                {
                    segment.Add(new StartFinish(bestDeadline.start, bestDeadline.finish));
                    Console.WriteLine(bestDeadline.start + " " + bestDeadline.finish);
                    tasksInSegments.Add(new List <Task>()
                    {
                        T
                    });
                }
            }
            PrintSolutions();
            List <StartFinish> Localdeadlines = new List <StartFinish>();
            List <Task>        LocalTasks     = new List <Task>();

            foreach (var item in tasks)
            {
                for (int i = 0; i < tasksInSegments.Count; i++)
                {
                    if (tasksInSegments[i].Contains(item))
                    {
                        Localdeadlines = new List <StartFinish>();
                        LocalTasks     = new List <Task>();
                        GSolver solver = new GSolver(this.S, item);
                        LocalTasks.Add(item);
                        Localdeadlines.Add(item.deadline);
                        foreach (var td in tasksInSegments[i])
                        {
                            if (td != item)
                            {
                                LocalTasks.Add(td);
                                Localdeadlines.Add(td.deadline);
                            }
                        }
                    }
                }
                item.solution = solver.ProbOfCompletionModern(Localdeadlines, LocalTasks);
                Console.WriteLine($"Deadline {item.deadline.start} {item.deadline.finish}  ObjectiveF {item.solution}");
            }
        }
예제 #8
0
        public StartFinish GetNeighbour(int t1, int t2)
        {
            double random1 = rnd.NextDouble();

            StartFinish sf  = new StartFinish(t1, t2);
            int         max = T.t2;
            int         min = T.t1;

            if ((t2 - t1) > max || (t2 - t1) < min)
            {
                throw new InvalidDistanceException("wrong arguments");


                return(sf);
            }
            if (random1 <= 0.25)
            {  // move t1 left
                if (t1 == 0 || (t2 - t1) == max)
                {
                    return(sf = GetNeighbour(t1, t2));
                }
                else
                {
                    t1 = t1 - 1;
                    return(sf = new StartFinish(t1, t2));
                }
            }
            if (random1 > 0.25 & random1 <= 0.5)
            { // move t1 right
                if ((t2 - t1) == min)
                {
                    return(sf = GetNeighbour(t1, t2));
                }
                else
                {
                    t1 = t1 + 1;
                    return(sf = new StartFinish(t1, t2));
                }
            }
            if (random1 > 0.5 & random1 <= 0.75)
            { // move t2 left
                if ((t2 - t1) == min)
                {
                    return(sf = GetNeighbour(t1, t2));
                }
                else
                {
                    t2 = t2 - 1;
                    return(sf = new StartFinish(t1, t2));
                }
            }
            if (random1 > 0.75)
            {  // move t2 right
                if ((t2 - t1) == max || t2 == S.getlenL() - 1)
                {
                    return(sf = GetNeighbour(t1, t2));
                }
                else
                {
                    t2 = t2 + 1;
                    return(sf = GetNeighbour(t1, t2));
                }
            }

            return(sf);
        }