public override void Update(ModelingTime modelingTime) { if (inputQueue[0].Count > 0) { //смотрим на токен var token = inputQueue[0].Peek(); //токен в первый раз? if (token.Progress < 0.1) { token.Progress = 1; token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; } //времени прошло больше чем фиксирвоаннное время if (modelingTime.Now - token.ProcessStartTime >= FixedTime) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; } } }
public void UpdateWithResTest() { // arrange DocumentationCoordinationProcedure procedure = new DocumentationCoordinationProcedure(); procedure.AddToken(new Token(bornTime: 0, complexity: 1000), 0); Token token = null; // act ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; for (modelingTime.Now = 0; modelingTime.Now < 80 && token == null; modelingTime.Now += modelingTime.Delta) { procedure.Update(modelingTime); token = procedure.GetOutputToken(0); procedure.ClearOutputs(); } // Asserts Assert.AreNotEqual(token, null); if (modelingTime.Now < 7 || modelingTime.Now > 61) { Assert.Fail(); } }
public override void Update(ModelingTime modelingTime) { if (inputQueue[0].Count() > 0) { Random rand = new Random(); var token = inputQueue[0].Peek(); if (token.Progress < 0.01) { token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; } double time = rand.Next(7, 60);//случайное число, т.к. сроки размыты // порядок дни/месяцы //базовое время зависит от сроков сдачи проекта разрабатываемого объекта, которое в данной работе не учитывается token.Progress += modelingTime.Delta / time; if (token.Progress > 0.99) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; } } }
public override void Update(ModelingTime modelingTime) { if (inputQueue[0].Count() > 0) { Random rand = new Random(); var token = inputQueue[0].Peek(); if (token.Progress < 0.0001) { token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; } double time = token.Complexity * 100; token.Progress += modelingTime.Delta / time; if (token.Progress > 0.99) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; } } }
public void UpdateWithResTest() { // arrange SampleTestingProcedure procedure = new SampleTestingProcedure(); procedure.AddToken(new Token(bornTime: 0, complexity: 1), 0); Token token = null; // act ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; for (modelingTime.Now = 0; modelingTime.Now < 1000 && token == null; modelingTime.Now += modelingTime.Delta) { procedure.Update(modelingTime); token = procedure.GetOutputToken(0); procedure.ClearOutputs(); } // Asserts Assert.AreNotEqual(token, null); if (modelingTime.Now < 99 || modelingTime.Now > 100) { Assert.Fail(); //ровно 100 для сложности 1 } }
public void SaveSubProcessTest() { Process process = new Process(); Process subprocess = new Process(); TracingProcedure procedure = new TracingProcedure(); procedure.AddResorce(new CadResource()); procedure.AddResorce(new WorkerResource()); procedure.AddResorce(new TechincalSupportResource()); ArrangementProcedure procedure2 = new ArrangementProcedure(); procedure2.AddResorce(new CadResource()); procedure2.AddResorce(new WorkerResource()); procedure2.AddResorce(new TechincalSupportResource()); subprocess.Blocks.Add(procedure); subprocess.Blocks.Add(procedure2); subprocess.Connections.Connect(procedure, 0, procedure2, 0); subprocess.StartBlock = procedure; subprocess.EndBlock = procedure2; process.Blocks.Add(subprocess); process.StartBlock = subprocess; process.EndBlock = subprocess; //act //добавляем на стартовый блок токен process.AddToken(new Token(0, complexity: 1), 0); //double i = 0; ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; //цикл до тех пор, пока на выходе не появится токен for (modelingTime.Now = 0; modelingTime.Now < 1000 && !process.EndBlockHasOutputToken; modelingTime.Now += modelingTime.Delta) { process.Update(modelingTime); } Process process2 = SaveTester <Process> .StartSaveTest(process); // Asserts Assert.AreEqual(process, process2); }
public void TestWithRes() { // arrange ElectricalSchemeSimulation electricalScheme = new ElectricalSchemeSimulation(); electricalScheme.AddToken(new Token(bornTime: 0, complexity: 100), 0); electricalScheme.AddResorce(new WorkerResource() { //Name = "Alleshka", //Position = "Работяга", WorkerQualification = Qualification.SecondCategory }); electricalScheme.AddResorce(new TechincalSupportResource() { Frequency = 1.5, Ram = 2, Vram = 1 }); electricalScheme.AddResorce(new CadResource()); Token token = null; // act ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; for (modelingTime.Now = 0; modelingTime.Now < 100 && token == null; modelingTime.Now += modelingTime.Delta) { electricalScheme.Update(modelingTime); token = electricalScheme.GetOutputToken(0); electricalScheme.ClearOutputs(); } // Asserts Assert.AreNotEqual(token, null); if (modelingTime.Now < 9.99 || modelingTime.Now > 10.01)//для образцовых моделей со сложностью 100 ремя долнжо быть 10 { Assert.Fail(); } }
public void UpdateWithResTest() { // arrange TracingProcedure procedure = new TracingProcedure(); procedure.AddResorce(new WorkerResource() { //Name = "Alleshka", //Position = "Работяга", WorkerQualification = Qualification.FirstCategory }); procedure.AddResorce(new CadResource() { }); procedure.AddResorce(new TechincalSupportResource() { Frequency = 1.5, Ram = 2, Vram = 1 }); procedure.AddToken(new Token(bornTime: 0, complexity: 1000), 0); Token token = null; // act ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; for (modelingTime.Now = 0; modelingTime.Now < 40 && token == null; modelingTime.Now += modelingTime.Delta) { procedure.Update(modelingTime); token = procedure.GetOutputToken(0); procedure.ClearOutputs(); } // Asserts Assert.AreNotEqual(token, null); if (modelingTime.Now < 10 || modelingTime.Now > 11) { Assert.Fail(); } }
public void SubprocessTest() { //arrange Process process = new Process(); Process subprocess = new Process(); SampleTestingProcedure procedure = new SampleTestingProcedure(); SampleTestingProcedure procedure2 = new SampleTestingProcedure(); subprocess.Blocks.Add(procedure); subprocess.StartBlock = procedure; subprocess.EndBlock = procedure; process.Blocks.Add(subprocess); process.Blocks.Add(procedure2); process.Connections.Connect(subprocess, 0, procedure2, 0); process.StartBlock = subprocess; process.EndBlock = procedure2; //act //добавляем на стартовый блок токен process.AddToken(new Token(0, complexity: 1), 0); //double i = 0; ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; //цикл до тех пор, пока на выходе не появится токен for (modelingTime.Now = 0; modelingTime.Now < 1000 && !process.EndBlockHasOutputToken; modelingTime.Now += modelingTime.Delta) { process.Update(modelingTime); } // Asserts if (modelingTime.Now < 197 || modelingTime.Now > 200) { Assert.Fail(); } }
public void UpdateTest() { //подготовка SchemaCreationProcedure procedure = new SchemaCreationProcedure(); procedure.AddResorce(new CadResource()); procedure.AddResorce(new WorkerResource() { WorkerQualification = Qualification.SecondCategory }); procedure.AddResorce(new TechincalSupportResource() { Frequency = 1.5, Ram = 2, Vram = 1 }); procedure.AddToken(new Token(0, 10), 0); //сам тест ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; Token token = null; for (modelingTime.Now = 0; modelingTime.Now <= 10 && token == null; modelingTime.Now += modelingTime.Delta) { procedure.Update(modelingTime); token = procedure.GetOutputToken(0); procedure.ClearOutputs(); } //првоерка выполения процедуры if (token == null) { Assert.Fail(); } //процервка времени выполнения процедуры if (modelingTime.Now < 9.1 || modelingTime.Now > 10.1)//для образцовых моделей со сложностью 10 ремя долнжо быть 10 { Assert.Fail(); } }
public void StartProcess() { // Arrange Process process1 = new Process(); SampleTestingProcedure procedure1 = new SampleTestingProcedure(); procedure1.AddResorce(new CadResource()); procedure1.AddResorce(new WorkerResource()); procedure1.AddResorce(new TechincalSupportResource()); SampleTestingProcedure procedure2 = new SampleTestingProcedure(); process1.Blocks.Add(procedure1); process1.Blocks.Add(procedure2); process1.Connections.Connect(procedure1, 0, procedure2, 0); process1.StartBlock = procedure1; process1.EndBlock = procedure2; //добавляем на стартовый блок токен process1.AddToken(new Token(0, complexity: 1), 0); //double i = 0; ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; //цикл до тех пор, пока на выходе не появится токен for (modelingTime.Now = 0; modelingTime.Now < 1000 && !process1.EndBlockHasOutputToken; modelingTime.Now += modelingTime.Delta) { process1.Update(modelingTime); } // act Process process2 = SaveTester <Process> .StartSaveTest(process1); // Asserts Assert.AreEqual(process1, process2); }
public override void Update(ModelingTime modelingTime) { for (int i = 0; i < this.InputQuantity; i++) { //если на всех блоках чего-нибудь нет, ничего не делаем if (inputQueue[i].Count() == 0) { return; } } //еасли на всех что-то есть, то это ошибка throw new Exception(String.Format("Ошибка блока {0}, блок должен выдывать токены во время работы функции AddToken, а не функции Update", this.Description)); //for (int i = 0; i < this.InputQuantity; i++) //{ // var token = inputQueue[i].Dequeue(); // token.ProcessEndTime = modelingTime.Now; // collector.Collect(token); // complexity += token.Complexity; //} //outputs[0] = new Token(modelingTime.Now, complexity/this.InputQuantity) { Parent = this }; }
public void UpdateWithRes() { // arrange PaperworkProcedure paperworkProcedure = new PaperworkProcedure(); paperworkProcedure.AddResorce(new WorkerResource() { //Name = "Alleshka", //Position = "Работяга", WorkerQualification = Qualification.FirstCategory }); paperworkProcedure.AddResorce(new TechincalSupportResource() { Frequency = 1.5, Ram = 2, Vram = 1 }); paperworkProcedure.AddToken(new Token(0, 10), 0); Token token = null; // act ModelingTime modelingTime = new ModelingTime() { Delta = 1, Now = 0 }; for (modelingTime.Now = 0; modelingTime.Now < 10 && token == null; modelingTime.Now += modelingTime.Delta) { paperworkProcedure.Update(modelingTime); token = paperworkProcedure.GetOutputToken(0); paperworkProcedure.ClearOutputs(); } // Asserts Assert.AreNotEqual(token, null); if (modelingTime.Now < 1 || modelingTime.Now > 30) { Assert.Fail(); } }
public override void Update(ModelingTime modelingTime) { if (inputQueue[0].Count() > 0) { Random rand = new Random(); var token = inputQueue[0].Peek(); var worker = resources.Find(res => res is WorkerResource) as WorkerResource; var cad = resources.Find(res => res is CadResource) as CadResource; var comp = resources.Find(res => res is TechincalSupportResource) as TechincalSupportResource; if (worker == null || cad == null || comp == null) { StringBuilder message = new StringBuilder("Компоновка электрической схемы. Ошибка: "); if (worker == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"Исполнитель\""); } if (cad == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"САПР\""); } if (comp == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"Техническое обеспечение\""); } throw new ArgumentNullException(message.ToString()); } int resourceCount = 0; if (token.Progress < 0.001) { token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; //блокируем ресурсы для него if (worker.TryGetResource()) { resourceCount++; } else { worker.ReleaseResource(); } if (cad.TryGetResource()) { resourceCount++; } else { cad.ReleaseResource(); } if (comp.TryGetResource()) { resourceCount++; } else { comp.ReleaseResource(); } } else { resourceCount = 3; } double time = token.Complexity / 100;//базовое время // Влияние ПК #region PcImpact double base_frequency = 1.5; //частота double base_memory_proc = 2; //объем памяти процессора double base_memory_video = 1; //объем памяти ведеокарты time += (base_frequency - comp.Frequency) / 1000; //порядок влияния на время time += (base_memory_proc - comp.Ram) / 10000; time += (base_memory_video - comp.Vram) / 10000; #endregion // Влияние рабочего #region WorkerImpact //временная задержка для анализа полученного результата time += 0.02 * rand.NextDouble(); //30(0,02 дня) минут - максимальное время для анализа #endregion if (resourceCount == 3 && worker.TryUseResource(modelingTime)) { token.Progress += modelingTime.Delta / time; } if (token.Progress > 0.999) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; // Освобождаем ресурсы worker.ReleaseResource(); comp.ReleaseResource(); cad.ReleaseResource(); } } }
public override void Update(ModelingTime modelingTime) { if (inputQueue[0].Count() > 0) { Random rand = new Random(); var token = inputQueue[0].Peek(); var worker = resources.Find(res => res is WorkerResource) as WorkerResource; var cad = resources.Find(res => res is CadResource) as CadResource; var comp = resources.Find(res => res is TechincalSupportResource) as TechincalSupportResource; if (worker == null || cad == null || comp == null) { StringBuilder message = new StringBuilder("2-D геометрия. Ошибка: "); if (worker == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"Исполнитель\""); } if (cad == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"САПР\""); } if (comp == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"Техническое обеспечение\""); } throw new ArgumentNullException(message.ToString()); } int resourceCount = 0; if (token.Progress < 0.001) { token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; //блокируем ресурсы для него if (worker.TryGetResource()) { resourceCount++; } else { worker.ReleaseResource(); } if (cad.TryGetResource()) { resourceCount++; } else { cad.ReleaseResource(); } if (comp.TryGetResource()) { resourceCount++; } else { comp.ReleaseResource(); } } else { resourceCount = 3; } double time = token.Complexity / 100;//базовое время // Влияние ПК #region PcImpact double base_frequency = 1.5; //частота double base_memory_proc = 2; //объем памяти процессора double base_memory_video = 1; //объем памяти ведеокарты time += (base_frequency - comp.Frequency) / 1000; //порядок влияния на время time += (base_memory_proc - comp.Ram) / 10000; time += (base_memory_video - comp.Vram) / 10000; #endregion // Влияние рабочего #region WorkerImpact //временная задержка для анализа полученного результата time += 0.02 * rand.NextDouble(); //30(0,02 дня) минут - максимальное время для анализа #endregion if (token.Complexity > 0.4) { //TODO типа здесь должна быть разводка вручную, но в реальности её нет /*double percent =rand.Next((int)(Complexity * 100/6), (int)(Complexity * 100/2));//что нужно трассировать вручную * double sred_pers = 20;// среднюю плату (20%) средней квалификации человек будет разводить 1 день * double loc_time = percent / sred_pers; * SeeResourcesForAlgorithm(number, ref time, current_process);*/ } if (resourceCount == 3 && worker.TryUseResource(modelingTime)) { token.Progress += modelingTime.Delta / time; } if (token.Progress > 0.999) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; // Освобождаем ресурсы worker.ReleaseResource(); comp.ReleaseResource(); cad.ReleaseResource(); } } }
public virtual bool TryUseResource(ModelingTime time) { return(true); }
private void StartModeling_Executed(object sender, RoutedEventArgs e) { try { ViewModelConverter converter = new ViewModelConverter(); //запихиваем содержимое области рисования в процесс foreach (var item in testTabControl.Items) { var tab = item as TabItem; var drawArea = tab.Content as DrawArea; converter.Map(drawArea.Children, tab.Header as Process); } ////запихиваем содержимое главной области рисования в процесс //converter.Map(drawAreas[0].Children, mainProcess); //добавляем на стартовый блок токен mainProcess.AddToken(new Token(0, complexity), 0); //double i = 0; ModelingTime modelingTime = new ModelingTime() { Delta = this.dt, Now = 0 }; for (modelingTime.Now = 0; modelingTime.Now < maxTime; modelingTime.Now += modelingTime.Delta) { mainProcess.Update(modelingTime); //на конечном блоке на выходе появился токен if (mainProcess.EndBlockHasOutputToken) { break; } } //TokenViewer show = new TokenViewer(mainProcess.TokenCollector as TokensCollector); //show.Show(); //Statictics(); //TODO сделать DataBinding listBox1.Items.Clear(); //добавляем ещё инцидентры в историю AccidentsCollector collector = AccidentsCollector.GetInstance(); collector.GetHistory().ForEach(item => listBox1.Items.Add(item)); ResultWindow resultWindow = new ResultWindow(mainProcess.Collector.GetHistory(), collector.GetHistory(), this.complexity); resultWindow.ShowDialog(); mainProcess.Collector.GetHistory().ForEach(item => listBox1.Items.Add(item)); mainProcess.Collector.GetHistory().Clear(); collector.GetHistory().Clear(); //выводим число токенов и время затраченное(в заголовке) //MessageBox.Show("Время, затраченное на имитацию " + modelingTime.Now.ToString(), "Имитация закончена"); } catch (NotImplementedException ex) { MessageBox.Show(ex.Message); } finally { foreach (var process in processes) { process.ClearProcess(); } } }
public override void Update(ModelingTime modelingTime) { // Смотрим, есть ли что на входе if (inputQueue[0].Count > 0) { Random rand = new Random(); var token = inputQueue[0].Peek(); var worker = resources.Find(res => res is WorkerResource) as WorkerResource; var comp = resources.Find(res => res is TechincalSupportResource) as TechincalSupportResource; // Если какого-то ресурса не хватает if ((worker == null) || (comp == null)) { StringBuilder errorList = new StringBuilder("Ошибка: "); if (worker == null) { errorList.Append(Environment.NewLine + "Отсутствует ресурс \"Исполнитель\""); } if (comp == null) { errorList.Append(Environment.NewLine + "Отсутствует ресурс \"Техническое обеспечение\""); } throw new ArgumentNullException(errorList.ToString()); } int resourceCount = 0; if (token.Progress < 0.01) { token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; // Блокируем ресурсы if (worker.TryGetResource()) { resourceCount++; } else { worker.ReleaseResource(); // <-- ??? } if (comp.TryGetResource()) { resourceCount++; } else { comp.ReleaseResource(); } } else { resourceCount = 2; } //общее время, которое должно бытьл затрачено на процедуру double time = token.Complexity; #region WorckerImpact // Влияние рабочего на скорость работы switch (worker.WorkerQualification) { case Qualification.LeadCategory: time -= time / rand.Next(1, 4); break; case Qualification.FirstCategory: time -= time / rand.Next(1, 5); //уменьшаем время, т.к. высокая категория\ break; case Qualification.SecondCategory: //базовое время подсчитано для второй категории break; case Qualification.ThirdCategory: time += time / rand.Next(1, 5); break; case Qualification.NoCategory: time += time / rand.Next(1, 4); break; } #endregion // Влияние ПК на скорость работы #region PCImpact { double frequency = comp.Frequency; double memory_proc = comp.Ram; double memory_video = comp.Vram; //базовые параметры: double base_frequency = 1.5; //частота double base_memory_proc = 2; //объем памяти процессора double base_memory_video = 1; //объем памяти ведеокарты time += (base_frequency - frequency) / 1000; //порядок влияния на время time += (base_memory_proc - memory_proc) / 10000; time += (base_memory_video - memory_video) / 100000; //диагональ влияет только на качество выполняемой исполнотелем работы, которое не считается в данной работе } #endregion #region MetodImpact // Влияние методички (необязательный ресурс) var metod = resources.Find(res => res is MethodolgicalSupportResource) as MethodolgicalSupportResource; // методологическое обеспечение увеличивает качество и чуть-чуть уменьшает время if ((metod != null) && (metod.TryGetResource())) { time -= 0.01 * rand.NextDouble(); //от 0 до 15 минут } #endregion // Если все ресурсы взяли, то выполняем задачу if (resourceCount == 2 && worker.TryUseResource(modelingTime)) { // Обновляем прогресс задачи token.Progress += modelingTime.Delta / time; } // Задача выполнена if (token.Progress >= 0.99) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; // Освобождаем ресурсы worker.ReleaseResource(); comp.ReleaseResource(); if (metod != null) { metod.ReleaseResource(); } } } }
public override void Update(ModelingTime modelingTime) { }
public override void Update(ModelingTime modelingTime) { if (inputQueue[0].Count() > 0) { Random rand = new Random(); var token = inputQueue[0].Peek(); var worker = resources.Find(res => res is WorkerResource) as WorkerResource; var cad = resources.Find(res => res is CadResource) as CadResource; var comp = resources.Find(res => res is TechincalSupportResource) as TechincalSupportResource; if (worker == null || cad == null || comp == null) { StringBuilder message = new StringBuilder("Моделирование электрической схемы. Ошибка: "); if (worker == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"Исполнитель\""); } if (cad == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"САПР\""); } if (comp == null) { message.Append(Environment.NewLine + "Отсутствует ресурс типа \"Техническое обеспечение\""); } throw new ArgumentNullException(message.ToString()); } int resourceCount = 0; if (token.Progress < 0.01) { token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; //блокируем ресурсы для него if (worker.TryGetResource()) { resourceCount++; } else { worker.ReleaseResource(); } if (cad.TryGetResource()) { resourceCount++; } else { cad.ReleaseResource(); } if (comp.TryGetResource()) { resourceCount++; } else { comp.ReleaseResource(); } } else { resourceCount = 3; } double time = token.Complexity / 10; // Влияние ПК #region PcImpact double base_frequency = 1.5; //частота double base_memory_proc = 2; //объем памяти процессора double base_memory_video = 1; //объем памяти ведеокарты time += (base_frequency - comp.Frequency) / 1000; //порядок влияния на время time += (base_memory_proc - comp.Ram) / 10000; time += (base_memory_video - comp.Vram) / 10000; #endregion // Влияние рабочего #region WorkerImpact switch (worker.WorkerQualification) { case Qualification.LeadCategory: time -= time / rand.Next(1, 4); break; case Qualification.FirstCategory: time -= time / rand.Next(1, 5); //уменьшаем время, т.к. высокая категория\ break; case Qualification.SecondCategory: //базовое время подсчитано для второй категории break; case Qualification.ThirdCategory: time += time / rand.Next(1, 5); break; case Qualification.NoCategory: time += time / rand.Next(1, 4); break; } #endregion //влияение методичики (необязательный ресурс) #region Methodical region var methodSupport = resources.Find(res => res is MethodolgicalSupportResource) as MethodolgicalSupportResource; //если есть методичка, то время немного экономится if ((methodSupport != null) && (methodSupport.TryGetResource())) { time -= 0.01 * rand.NextDouble(); //от 0 до 15 минут } #endregion if (resourceCount == 3 && worker.TryUseResource(modelingTime)) { token.Progress += modelingTime.Delta / time; } if (token.Progress > 0.99) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; // Освобождаем ресурсы worker.ReleaseResource(); comp.ReleaseResource(); cad.ReleaseResource(); if (methodSupport != null) { methodSupport.ReleaseResource(); } } } }
public override void Update(ModelingTime modelingTime) { //првоеряем, есть ли вообще что-то на входе if (inputQueue[0].Count > 0) { Random rand = new Random(); //смотрим на первыйтокен var token = inputQueue[0].Peek(); var worker = resources.Find(res => res is WorkerResource) as WorkerResource; var cad = resources.Find(res => res is CadResource) as CadResource; var computer = resources.Find(res => res is TechincalSupportResource) as TechincalSupportResource; if (worker == null || cad == null || computer == null) { throw new ArgumentNullException("SchemaCreationProcedure - не присустствуют все ресурсы"); } int resourceCount = 0; //токен в первый раз? if (token.Progress < 0.01) { token.ProcessedByBlock = this; token.ProcessStartTime = modelingTime.Now; //блокируем ресурсы для него //пробуем взять рабочего if (worker.TryGetResource()) { resourceCount++; } else { worker.ReleaseResource(); } //пробуем взять CAD if (cad.TryGetResource()) { resourceCount++; } else { cad.ReleaseResource(); } //пробеум взять методичку if (computer.TryGetResource()) { resourceCount++; } else { computer.ReleaseResource(); } } //токен тут уже был, ресурсы уже заблочены else { //поэтому сразу знаем, что все ресурсы есть resourceCount = 3; } //общее время, которое должно бытьл затрачено на процедуру double time = token.Complexity; //влияние ПК на скорость работы #region PC impact double frequency = computer.Frequency; double memory_proc = computer.Ram; double memory_video = computer.Vram; //базовые параметры: double base_frequency = 1.5; //частота double base_memory_proc = 2; //объем памяти процессора double base_memory_video = 1; //объем памяти ведеокарты //выражения полученные аналитическим способом time += (base_frequency - computer.Frequency) / 1000; //порядок влияния на время time += (base_memory_proc - computer.Ram) / 10000; time += (base_memory_video - computer.Vram) / 10000; //TODO ээ, нулевое влияние времени в случае если всё также???? #endregion //влияние рабочего на скорость работы #region Worker impact switch (worker.WorkerQualification) { case Qualification.LeadCategory: time -= time / rand.Next(1, 4); break; case Qualification.FirstCategory: time -= time / rand.Next(1, 5); //уменьшаем время, т.к. высокая категория\ break; case Qualification.SecondCategory: //базовое время подсчитано для второй категории break; case Qualification.ThirdCategory: time += time / rand.Next(1, 5); break; case Qualification.NoCategory: time += time / rand.Next(1, 4); break; } #endregion //влияение методичики (необязательный ресурс) #region Methodical region var methodSupport = resources.Find(res => res is MethodolgicalSupportResource) as MethodolgicalSupportResource; //если есть методичка, то время немного экономится if ((methodSupport != null) && (methodSupport.TryGetResource())) { time -= 0.01 * rand.NextDouble(); //от 0 до 15 минут } #endregion //если все ресурсы взяли, то выполняем задачу if (resourceCount == 3 && worker.TryUseResource(modelingTime)) { //обновляем прогресс задачи token.Progress += modelingTime.Delta / time; //делим общее время на dt } //задача выполнена if (token.Progress >= 0.99) { inputQueue[0].Dequeue(); token.ProcessEndTime = modelingTime.Now; collector.Collect(token); outputs[0] = new Token(modelingTime.Now, token.Complexity) { Parent = this }; //освобождаем все ресурсы worker.ReleaseResource(); cad.ReleaseResource(); computer.ReleaseResource(); if (methodSupport != null) { methodSupport.ReleaseResource(); } } } }