/** * Pred replikaciou sa naplni parovacia halda, z ktorej su vyberane casy prichdovo. V pripade ak nie je zvolena moznost skorsich prichodov, je * pomocou multipliera generovany cas prichodu pacienta bez skorsieho prichodu. V pripade ak vyjde, ze v nahodnom pokuse, ze dany pacient sa nedostvil * tak sa multiplier zvysi o 1 a po tom co dojde k neuspesnemu nahodnemu pokusu je multiplierom vynasobeny casovy rozostup medzi pacientami a je * aktualizovany cas objednania. */ override public void PrepareReplication() { base.PrepareReplication(); // Setup component for the next replication var sim = MySim as VacCenterSimulation; _generatorPravdepodobnosti = new OSPRNG.UniformContinuousRNG(0, 1, sim.GeneratorNasad); _haldaPrichodov = new PairingHeap <double, double>(); MyAgent.VygenerujNepridenych(); double casObjednania = 0; int multiplier = 1; double casPrichodu; double casovyRozostup = 0; if (sim.AktualneParametreSimulacie.SpecialnePrichody) { double pravdepodobnost; _generatorPravdepodobnostiSpecifickehoPrichodu = new OSPRNG.UniformContinuousRNG(0, 1, sim.GeneratorNasad); _generatorPravdepodobnostiDostaveniaVCas = new OSPRNG.UniformContinuousRNG(0, 1, sim.GeneratorNasad); _generatoryPrichodov = new OSPRNG.UniformContinuousRNG[] { new OSPRNG.UniformContinuousRNG(20 * 60, 60 * 60, sim.GeneratorNasad), new OSPRNG.UniformContinuousRNG(1 * 60, 20 * 60, sim.GeneratorNasad), new OSPRNG.UniformContinuousRNG(60 * 60, 80 * 60, sim.GeneratorNasad), new OSPRNG.UniformContinuousRNG(80 * 60, 240 * 60, sim.GeneratorNasad), }; for (int i = 0; i < MyAgent.PocetObjednanychPacientov; ++i) { multiplier = 1; while (_generatorPravdepodobnosti.Sample() < MyAgent.PocetNepridenychPacientov / (double)MyAgent.PocetObjednanychPacientov) { ++multiplier; } casovyRozostup = multiplier * MyAgent.CasMedziPrichodmi; if (casovyRozostup + casObjednania > sim.CasPrevadzkyVSekundach) { return; } casObjednania += casovyRozostup; if (!(_generatorPravdepodobnostiDostaveniaVCas.Sample() < 0.1)) { pravdepodobnost = _generatorPravdepodobnostiSpecifickehoPrichodu.Sample(); casPrichodu = DajCasPrichodu(casObjednania, pravdepodobnost); } else { casPrichodu = casObjednania; } _haldaPrichodov.Insert(casPrichodu, casPrichodu); if (casObjednania > sim.CasPrevadzkyVSekundach) { return; } } } else { for (int i = 0; i < MyAgent.PocetObjednanychPacientov; ++i) { multiplier = 1; while (_generatorPravdepodobnosti.Sample() < MyAgent.PocetNepridenychPacientov / (double)MyAgent.PocetObjednanychPacientov) { ++multiplier; } casovyRozostup = multiplier * MyAgent.CasMedziPrichodmi; if (casovyRozostup + casObjednania > sim.CasPrevadzkyVSekundach) { return; } casObjednania += casovyRozostup; _haldaPrichodov.Insert(casObjednania, casObjednania); if (casObjednania > sim.CasPrevadzkyVSekundach) { return; } } } }