コード例 #1
0
ファイル: FixedTimeBlock.cs プロジェクト: Alleshka/Gidra
        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
                    };
                }
            }
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
        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
                    };
                }
            }
        }
コード例 #4
0
        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
                    };
                }
            }
        }
コード例 #5
0
        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
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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();
            }
        }
コード例 #8
0
        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();
            }
        }
コード例 #9
0
        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();
            }
        }
コード例 #10
0
        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();
            }
        }
コード例 #11
0
        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);
        }
コード例 #12
0
 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 };
 }
コード例 #13
0
        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();
            }
        }
コード例 #14
0
        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();
                }
            }
        }
コード例 #15
0
        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();
                }
            }
        }
コード例 #16
0
ファイル: AbstractResource.cs プロジェクト: Alleshka/Gidra
 public virtual bool TryUseResource(ModelingTime time)
 {
     return(true);
 }
コード例 #17
0
        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();
                }
            }
        }
コード例 #18
0
        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();
                    }
                }
            }
        }
コード例 #19
0
 public override void Update(ModelingTime modelingTime)
 {
 }
コード例 #20
0
        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();
                    }
                }
            }
        }
コード例 #21
0
        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();
                    }
                }
            }
        }