コード例 #1
0
        public int calculateTotalspan(KolejkaZadan kolejka, int[] kolejnoscZadan)
        {
            int Cmax         = 0;
            var liczbaZadan  = kolejka.zadania.Length;
            var liczbaMaszyn = kolejka.zadania[0].czasyOperacji.Length;

            int[,] macierzZadan = new int[liczbaZadan, liczbaMaszyn];

            for (int x = 0; x < liczbaZadan; x++)
            {
                for (int y = 0; y < liczbaMaszyn; y++)
                {
                    macierzZadan[x, y] = kolejka.zadania[x].czasyOperacji[y];
                }
            }

            int[,] cMaxMatrix = new int[liczbaZadan + 1, liczbaMaszyn + 1];
            for (int i = 1; i < liczbaZadan + 1; i++)
            {
                for (int z = 1; z < liczbaMaszyn + 1; z++)
                {
                    if (cMaxMatrix [i - 1, z] > cMaxMatrix [i, z - 1])
                    {
                        cMaxMatrix[i, z] += cMaxMatrix[i - 1, z] + macierzZadan[kolejnoscZadan[i - 1] - 1, z - 1];
                    }
                    else
                    {
                        cMaxMatrix[i, z] += cMaxMatrix[i, z - 1] + macierzZadan[kolejnoscZadan[i - 1] - 1, z - 1];
                    }
                }
            }

            Cmax = cMaxMatrix[liczbaZadan, liczbaMaszyn];
            return(Cmax);
        }
コード例 #2
0
        public int[] Przeglad(KolejkaZadan kolejka)
        {
            var liczbaZadan = kolejka.zadania.Length;

            int[] optymalnaKolejnosc  = new int[liczbaZadan];
            int[] poczatkowaKolejnosc = new int[liczbaZadan];
            int   cmax = int.MaxValue;

            for (int i = 0; i < liczbaZadan; i++)
            {
                poczatkowaKolejnosc[i] = i + 1;
            }
            var algorytmy = new Algorytmy();

            List <int[]> macierzPermutacji = ListToArray(returnPermutation(poczatkowaKolejnosc));
            int          checkedCmax       = int.MaxValue;

            foreach (int[] kolejnosc in macierzPermutacji)
            {
                checkedCmax = algorytmy.calculateTotalspan(kolejka, kolejnosc);
                if (checkedCmax < cmax)
                {
                    cmax = checkedCmax;
                    optymalnaKolejnosc = kolejnosc;
                }
            }

            return(optymalnaKolejnosc);
        }
コード例 #3
0
        public int[] Przeglad(KolejkaZadan kolejka)
        {
            var kolejnoscZadan = new int[kolejka.zadania.Length];

            for (int x = 0; x < kolejka.zadania.Length; x++)
            {
                kolejnoscZadan[x] = x + 1;
            }
            int[,] macierzZadan = Algorytmy.pasreMacierzZadan(kolejka, kolejnoscZadan);
            var liczbaZadan = kolejka.zadania.Length;

            int[] optymalnaKolejnosc  = new int[liczbaZadan];
            int[] poczatkowaKolejnosc = new int[liczbaZadan];
            int   cmax = int.MaxValue;

            for (int i = 0; i < liczbaZadan; i++)
            {
                poczatkowaKolejnosc[i] = i + 1;
            }

            List <int[]> macierzPermutacji = ListToArray(returnPermutation(poczatkowaKolejnosc));
            int          checkedCmax       = int.MaxValue;

            foreach (int[] kolejnosc in macierzPermutacji)
            {
                checkedCmax = Algorytmy.calculateTotalspan(kolejka, macierzZadan, kolejnosc);
                if (checkedCmax < cmax)
                {
                    cmax = checkedCmax;
                    optymalnaKolejnosc = kolejnosc;
                }
            }

            return(optymalnaKolejnosc);
        }
コード例 #4
0
        public static List <int> NehBasic(KolejkaZadan kz, List <Tuple <int, int> > tl)
        {
            List <int> sequence       = new List <int>();
            var        kolejnoscZadan = new int[kz.zadania.Length];

            for (int x = 0; x < kz.zadania.Length; x++)
            {
                kolejnoscZadan[x] = x + 1;
            }
            int[,] macierzZadan = Algorytmy.pasreMacierzZadan(kz, kolejnoscZadan);


            int _counter = 0;

            foreach (Tuple <int, int> t in tl)
            {
                int[] sq = new int[_counter + 1]; //stworzenie listy mozliwych dolozen ktora to jest zawsze +1 do kroku
                for (int i = 0; i < sq.Length; i++)
                {
                    List <int> clone = new List <int>(sequence);                             //kopia to mieszania
                    clone.Insert(i, t.Item1);                                                //ukladanie w po kolei
                    sq[i] = Algorytmy.calculateTotalspan(kz, macierzZadan, clone.ToArray()); //obliczenie nowego cmaxa by sprawdzic ile wynosi
                }
                int minIndex = Array.IndexOf(sq, sq.Min());
                sequence.Insert(minIndex, t.Item1);//dodanie do prawdziwej sekwencji najlepszego wariantu
                _counter++;
            }

            return(sequence);
        }
コード例 #5
0
        /*
         * Funkcja obliczajaca sumy czasow operacji dla kazdego zadania
         * a nastepnie zwracajaca tablice tych sum.
         */
        private static int[] WyznaczPriorytety(KolejkaZadan kz)
        {
            int[] priorytety = new int[kz.zadania.Length];

            for (int i = 0; i < priorytety.Length; i++)
            {
                priorytety[i] = kz.zadania[i].czasyOperacji.Sum();
            }

            return(priorytety);
        }
コード例 #6
0
        /*
         * Funkcja sortujaca nierosnaco otrzymane priorytety zadan.
         *
         * Na wyjsciu lista krotek. Krotka wyglada tak: (indeks, priorytet)
         */
        public static List <Tuple <int, int> > ZwrocPosortowanePriorytety(KolejkaZadan kz)
        {
            List <Tuple <int, int> > tl = new List <Tuple <int, int> >();

            int[] pp = WyznaczPriorytety(kz);
            for (int i = 0; i < pp.Length; i++)
            {
                tl.Add(new Tuple <int, int>(i + 1, pp[i]));
            }
            tl = tl.OrderByDescending(s => s.Item2).ToList();

            return(tl);
        }
コード例 #7
0
        public static int[,] pasreMacierzZadan(KolejkaZadan kolejka, int[] kolejnoscZadan)
        {
            var liczbaZadan  = kolejnoscZadan.Length;
            var liczbaMaszyn = kolejka.zadania[0].czasyOperacji.Length;

            int[,] macierzZadan = new int[liczbaZadan, liczbaMaszyn];

            for (int x = 0; x < liczbaZadan; x++)
            {
                for (int y = 0; y < liczbaMaszyn; y++)
                {
                    macierzZadan[x, y] = kolejka.zadania[x].czasyOperacji[y];
                }
            }
            return(macierzZadan);
        }
コード例 #8
0
        public static bool ZapiszWynik(Stopwatch sw, int cmax, KolejkaZadan kz, string algName, int nrInst = 0)
        {
            TimeSpan     ts            = sw.Elapsed;
            StreamWriter plikWyjsciowy = File.AppendText("result.txt");

            if (nrInst != 0)
            {
                plikWyjsciowy.WriteLine("\n--Instancja " + nrInst.ToString() + "--\n" +
                                        "L. maszyn: " + kz.zadania[0].czasyOperacji.Length.ToString() +
                                        "\tL. zadan: " + kz.zadania.Length.ToString() + "\n");
            }
            plikWyjsciowy.Write(algName + ":  " + "Cmax = " + cmax.ToString() + "\tCzas = ");
            plikWyjsciowy.Write("{0:00}:{1:00}.{2}\n", ts.Minutes, ts.Seconds, ts.Milliseconds);

            plikWyjsciowy.Flush();
            plikWyjsciowy.Close();
            return(true);
        }
コード例 #9
0
        public int[] AlgorytmJohnsona(KolejkaZadan kolejka)
        {
            var liczbaZadan  = kolejka.zadania.Length;
            var liczbaMaszyn = kolejka.zadania[0].ZwrocLiczbeMaszyn();

            int[,] macierzZadan      = new int[liczbaZadan, liczbaMaszyn];
            int[,] transMacierzZadan = new int[liczbaMaszyn, liczbaZadan];
            int[] tmpHolder = new int[liczbaMaszyn];
            int   iteracja  = liczbaZadan;

            int[] kolejnoscJohnsona = new int[iteracja];
            int   outOfRange        = 123456;

            for (int x = 0; x < liczbaZadan; x++)
            {
                tmpHolder = kolejka.zadania[x].ZwrocCzasy();
                for (int y = 0; y < liczbaMaszyn; y++)
                {
                    macierzZadan[x, y] = tmpHolder[y];
                }
            }


            if (liczbaMaszyn == 2)
            {
                for (int x = 0; x < liczbaMaszyn; x++)
                {
                    for (int y = 0; y < liczbaZadan; y++)
                    {
                        transMacierzZadan = Transpose(macierzZadan);
                    }
                }

                int[] kopiaMaszyny1 = new int[liczbaZadan];
                int[] kopiaMaszyny2 = new int[liczbaZadan];
                for (int i = 0; i < liczbaZadan; i++)
                {
                    kopiaMaszyny1[i] = transMacierzZadan[0, i];
                    kopiaMaszyny2[i] = transMacierzZadan[1, i];
                }
                int pozycja1, pozycja2 = liczbaZadan;

                for (int j = 0; j < iteracja; j++)
                {
                    int lowest1 = kopiaMaszyny1[0];
                    int lowest2 = kopiaMaszyny2[0];
                    pozycja1 = 0;
                    pozycja2 = 0;
                    for (int i = 1; i < liczbaZadan; i++)
                    {
                        if (kopiaMaszyny1[i] < lowest1)
                        {
                            lowest1  = kopiaMaszyny1[i];
                            pozycja1 = i;
                        }
                        if (kopiaMaszyny2[i] < lowest2)
                        {
                            lowest2  = kopiaMaszyny2[i];
                            pozycja2 = i;
                        }
                    }
                    if (lowest1 == lowest2)
                    {
                        if (pozycja1 <= pozycja2)
                        {
                            kolejnoscJohnsona[j]    = pozycja1 + 1;
                            kopiaMaszyny1[pozycja1] = kopiaMaszyny2[pozycja1] = outOfRange;
                        }
                        else
                        {
                            kolejnoscJohnsona[iteracja - 1] = pozycja2 + 1;
                            iteracja--;
                            kopiaMaszyny1[pozycja2] = kopiaMaszyny2[pozycja2] = outOfRange;
                            j--;
                        }
                    }

                    if (lowest1 < lowest2)
                    {
                        kolejnoscJohnsona[j]    = pozycja1 + 1;
                        kopiaMaszyny1[pozycja1] = kopiaMaszyny2[pozycja1] = outOfRange;
                    }
                    if (lowest1 > lowest2)
                    {
                        kolejnoscJohnsona[iteracja - 1] = pozycja2 + 1;
                        iteracja--;
                        kopiaMaszyny1[pozycja2] = kopiaMaszyny2[pozycja2] = outOfRange;
                        j--;
                    }
                }
            }

            else if (liczbaMaszyn > 2)
            {
                int[] kopiaMaszyny11 = new int[liczbaZadan];
                int[] kopiaMaszyny22 = new int[liczbaZadan];
                int   srodek         = (liczbaMaszyn + 1) / 2;
                int[] tmpHolder2     = new int[liczbaMaszyn];
                int[,] macierzZadan2      = new int[liczbaZadan, 2];
                int[,] transMacierzZadan2 = new int[2, liczbaZadan];

                int  midN  = liczbaMaszyn / 2;
                int  midNR = liczbaMaszyn % 2;
                bool isOdd = false;

                if (midNR != 0)
                {
                    isOdd = true;
                }

                for (int j = 0; j < liczbaZadan; j++)
                {
                    for (int k = 0; k < liczbaMaszyn; k++)
                    {
                        if (k < midN)
                        {
                            macierzZadan2[j, 0] += macierzZadan[j, k];
                            if (isOdd && !(k + 1 < midN))
                            {
                                macierzZadan2[j, 0] += macierzZadan[j, k + 1];
                            }
                        }
                        else if (k >= midN)
                        {
                            macierzZadan2[j, 1] += macierzZadan[j, k];
                        }
                    }
                }
                for (int i = 0; i < liczbaZadan; i++)
                {
                    Console.WriteLine(macierzZadan2[i, 0] + "  " + macierzZadan2[i, 1]);
                }

                for (int i = 0; i < 2; i++)
                {
                    for (int j = 0; j < liczbaZadan; j++)
                    {
                        transMacierzZadan2 = Transpose(macierzZadan2);
                    }
                }

                for (int i = 0; i < liczbaZadan; i++)
                {
                    kopiaMaszyny11[i] = transMacierzZadan2[0, i];
                    kopiaMaszyny22[i] = transMacierzZadan2[1, i];
                }
                int pozycja1, pozycja2 = liczbaZadan;

                for (int j = 0; j < iteracja; j++)
                {
                    int lowest1 = kopiaMaszyny11[0];
                    int lowest2 = kopiaMaszyny22[0];
                    pozycja1 = 0;
                    pozycja2 = 0;
                    for (int i = 1; i < liczbaZadan; i++)
                    {
                        if (kopiaMaszyny11[i] < lowest1)
                        {
                            lowest1  = kopiaMaszyny11[i];
                            pozycja1 = i;
                        }
                        if (kopiaMaszyny22[i] < lowest2)
                        {
                            lowest2  = kopiaMaszyny22[i];
                            pozycja2 = i;
                        }
                    }
                    if (lowest1 == lowest2)
                    {
                        if (pozycja1 <= pozycja2)
                        {
                            kolejnoscJohnsona[j]     = pozycja1 + 1;
                            kopiaMaszyny11[pozycja1] = kopiaMaszyny22[pozycja1] = outOfRange;
                        }
                        else
                        {
                            kolejnoscJohnsona[iteracja - 1] = pozycja2 + 1;
                            iteracja--;
                            kopiaMaszyny11[pozycja2] = kopiaMaszyny22[pozycja2] = outOfRange;
                            j--;
                        }
                    }

                    if (lowest1 < lowest2)
                    {
                        kolejnoscJohnsona[j]     = pozycja1 + 1;
                        kopiaMaszyny11[pozycja1] = kopiaMaszyny22[pozycja1] = outOfRange;
                    }
                    if (lowest1 > lowest2)
                    {
                        kolejnoscJohnsona[iteracja - 1] = pozycja2 + 1;
                        iteracja--;
                        kopiaMaszyny11[pozycja2] = kopiaMaszyny22[pozycja2] = outOfRange;
                        j--;
                    }
                }
            }
            return(kolejnoscJohnsona);
        }