コード例 #1
0
        private int bestellMengenBerechnung(Kaufteil k, int zeitpunkt, int periode)
        {
            int[] periodenBedarf = new int[4] { k.VerbrauchAktuell, k.VerbrauchPrognose1, k.VerbrauchPrognose2, k.VerbrauchPrognose3 };

            int bestellMenge = 0;
            for (int _periode = zeitpunkt; _periode <= periode; _periode++)
            {
                bestellMenge += periodenBedarf[_periode];
            }
            return bestellMenge;
        }
コード例 #2
0
ファイル: DataContainer.cs プロジェクト: rest1014/RoadRunner
        /// <summary>
        /// leigt ein neues Kteil an
        /// </summary>
        /// <param name="nr">Teil Nummer</param>
        /// <param name="preis">Einkaufspreispreis</param>
        /// <param name="bestellk">Bestellkosten</param>
        /// <param name="ldauer">Liefer dauer</param>
        /// <param name="abweichung">Abweichung.</param>
        /// <param name="diskontmenge">Diskontmenge.</param>
        /// <param name="bestand">Lagerbestand.</param>
        /// <param name="verw">Verwendung{K,D,H,KDH}</param>
        public void NewTeil(int nr, string bezeichnung, double preis, double bestellk, double ldauer, double abweichung, int diskontmenge, int bestand, string verw)
        {
            if (!this.teile.ContainsKey(nr))
            {
                Kaufteil kt = new Kaufteil(nr, bezeichnung);
                kt.Preis = preis;
                kt.Bestellkosten = bestellk;
                kt.Lieferdauer = ldauer;
                kt.Abweichung_lieferdauer = abweichung;
                kt.Diskontmenge = diskontmenge;
                kt.Lagerstand = bestand;
                kt.Verwendung = verw;
                this.teile[nr] = kt;

            }
            else
            {
                throw new InputException(string.Format("Es ist bereits ein Teil mit der nummer {0} vorhandet", nr));
            }
        }
コード例 #3
0
ファイル: DataContainer.cs プロジェクト: rest1014/RoadRunner
 /// <summary>
 /// Fügt ein neues K teil ein
 /// </summary>
 /// <param name="teil">Kaufteil Objekt</param>
 public void AddKTeil(Kaufteil teil)
 {
     if (!this.teile.ContainsKey(teil.Nummer))
     {
         this.teile[teil.Nummer] = teil;
     }
     else
     {
         throw new InputException(string.Format("Die Teilnummer {0} wird doppelt verwendet", teil.Nummer));
     }
 }
コード例 #4
0
        /// <summary>
        /// Wagner Within Algorithmus.
        /// Lieferzeit eingenommen.
        /// Lagerkosten auf verzoegerte Lieferzeit bezogen.
        /// 
        /// Falls negativer Lagerbestand auftritt werden die kosten * 1000 genommen.
        /// So werden Eilbestellungen attraktiv negativer Lagerbestand bei Eilbestellungen * 10
        /// </summary>
        /// <param name="k">Kaufteil</param>
        /// <param name="eil">Eilbestellung</param>
        /// <param name="nichtsBestellenInPeriode1">nichtsBestellenInPeriode1</param>
        /// <returns></returns>
        private int[] extendedWagnerWithinAlgorithm(Kaufteil k, Boolean eil, Boolean nichtsBestellenInPeriode1)
        {
            //akt. Lagerstand zu Periodenbeginn und ausstehende Lieferung
            int lagerBestand = k.Lagerstand + k.ErwarteteBestellung;
            // Spalten: 4 Perioden | Zeilen: (0) Lagerkosten + Bestellkosten, (1), (2), (3), (4) Lagerkosten
            int[,] ww = new int[4, 5];
            int[] bestPeriodOption = new int[4] { 0, 0, 0, 0 };

            // Keine Bestellung in Periode 1
            if (nichtsBestellenInPeriode1)
            {
                for (int periode = 0; periode < 4; periode++)
                {
                    double lagerKosten = lagerKostenBerechnung(k, 0, periode, 0, new int[4, 2], eil);
                    ww[periode, 4] = Convert.ToInt32(lagerKosten);
                }
            }
            else
            {
                for (int periode = 0; periode < 4; periode++)
                {
                    ww[periode, 4] = 200000;
                }
            }

            for (int zeitpunkt = 0; zeitpunkt < 4; zeitpunkt++)
            {
                for (int periode = zeitpunkt; periode < 4; periode++)
                {
                    // Spalten: | Zeilen:
                    int[,] vorhergehendeBestellungen = new int[4,4];
                    if (periode > 0)
                        vorhergehendeBestellungen = getKostenUndMenge(ww, bestPeriodOption, periode, k);
                    double bestPrePeriodCosts = (zeitpunkt > 0) ? ww[zeitpunkt - 1, bestPeriodOption[zeitpunkt - 1]] : 0;
                    double bestellKosten = eil ? k.Bestellkosten * 10 : k.Bestellkosten;

                    int bestellMenge = bestellMengenBerechnung(k, zeitpunkt, periode);

                    // hole vorherige Bestellungen und Kosten

                    // funktion wird bestraft wenn lager unterschritten wird
                    double lagerKosten = lagerKostenBerechnung(k, zeitpunkt, periode, bestellMenge, vorhergehendeBestellungen, eil);

                    // Kosten sind fixe Bestellkosten + lagerkosten + Kosten der besten Option der Vorperiode
                    ww[periode, zeitpunkt] = Convert.ToInt32(bestellKosten + lagerKosten + bestPrePeriodCosts);
                }
                bestPeriodOption[zeitpunkt] = findBestPeriodOption(ww, zeitpunkt);
            }

            int[,] result = getKostenUndMenge(ww, bestPeriodOption, 3, k);
            // GesamtKosten berechnen
            int gesamtKosten = ww[3, bestPeriodOption[3]];

            return new int[2] { gesamtKosten, result[0, 1] };
        }
コード例 #5
0
        private double lagerKostenBerechnung(Kaufteil k, int zeitpunkt, int periode, int bestellMenge, int[,] vorhergehendeBestellungen, Boolean eil)
        {
            int[] periodenBedarf = new int[4] { k.VerbrauchAktuell, k.VerbrauchPrognose1, k.VerbrauchPrognose2, k.VerbrauchPrognose3 };
            double lagerBestand = k.Lagerstand + k.ErwarteteBestellung;

            // Verbrauch vom Bestand abziehen
            for (int i = 0; i < zeitpunkt; i++)
            {
                lagerBestand -= periodenBedarf[i];
            }

            // einkommenden Bestellungen
            int[] bestellungen = new int[10];
            int lieferZeit = (int) Math.Round(k.Abweichung_lieferdauer + k.Lieferdauer);
            if (eil)
            {
                lieferZeit = (int)Math.Round(k.Lieferdauer / 2);
            }

            for (int period = 0; period < 4; period++) {
                bestellungen[period + lieferZeit] = vorhergehendeBestellungen[period, 1];
            }
            //bestellungen[(periode + lieferZeit)] += bestellMenge;

            double lagerKosten = 0;
            for (int i = zeitpunkt; i <= periode; i++)
            {
                // udpate Lagerbestand mit einkommenden Bestellungen
                for (int vorZeitpunktBestellungen = 0; vorZeitpunktBestellungen < zeitpunkt; vorZeitpunktBestellungen++)
                    lagerBestand += bestellungen[vorZeitpunktBestellungen];
                lagerBestand += bestellungen[i];

                if (lagerBestand - (periodenBedarf[i]) > 0)
                {
                    lagerKosten += (lagerBestand - (periodenBedarf[i] / 2)) * lagerKostenHebel * k.Preis;
                    lagerBestand -= periodenBedarf[i];
                }
                else
                {
                    lagerKosten += 100000;
                }
            }
            return lagerKosten;
        }
コード例 #6
0
        // 0: Kosten
        // 1: Menge
        private int[,] getKostenUndMenge(int[,] ww, int[] bestOptions, int periode, Kaufteil k)
        {
            int[,] ergebnis = new int[4,2];
            int bestellZeitPunkt = findBestPeriodOption(ww, periode);
            int[] periodenBedarf = new int[4] { k.VerbrauchAktuell, k.VerbrauchPrognose1, k.VerbrauchPrognose2, k.VerbrauchPrognose3 };

            int lastStep = periode;
            while (bestellZeitPunkt > 0)
            {
                if (ww[periode - 1, bestellZeitPunkt] == 0)
                {
                    int bestellMenge = bestellMengenBerechnung(k, bestellZeitPunkt, lastStep);
                    ergebnis[periode, 1] = bestellMenge;
                    ergebnis[periode, 0] = ww[lastStep, bestellZeitPunkt];
                    bestellZeitPunkt = bestOptions[periode - 1];
                    lastStep = periode - 1;
                }
                periode = periode - 1;

                // fals keine Bestellung das sinnvollste ist
                if (bestellZeitPunkt == 4) {
                    ergebnis[0,1] = 0;
                    break;
                }
            }

            // Menge berechnen fals etwas bestellt wird
            if (bestellZeitPunkt != 4)
            {
                int bestellMenge = bestellMengenBerechnung(k, bestellZeitPunkt, periode);
                ergebnis[0,1] = bestellMenge;
            }

            // Kosten auslesen
            ergebnis[0,0] = ww[periode, bestellZeitPunkt];

            return ergebnis;
        }
コード例 #7
0
 public Bestellposition(Kaufteil k, int menge_, bool eil_)
 {
     this.kaufteil = k;
     this.menge = menge_;
     this.eil = eil_;
 }
コード例 #8
0
ファイル: Kaufteil.cs プロジェクト: rest1014/RoadRunner
 public bool Equals(Kaufteil k)
 {
     if (this.nr == k.Nummer)
     {
         return true;
     }
     else
     {
         return false;
     }
 }