Beispiel #1
0
        /// <summary>
        /// считаем стоимость целевой функции
        /// </summary>
        /// <param name="res"></param>
        /// <returns></returns>
        private double CalcFunctionWeight(Board board, PlacingAndTracingStepResources res, AverageValueDelegate experimentResult)
        {
            double timePrice = 6.25;//6.25$ в час
            double moneyPart = res.server.Price;

            moneyPart += res.workstation.Price;
            TimeSpan time = experimentResult(board, res, 1);

            moneyPart += (time.TotalHours + 1) * timePrice;
            moneyPart  = (int)moneyPart;

            return(moneyPart);
        }
Beispiel #2
0
        private TimeSpan AverageValueExperiment(Board board, PlacingAndTracingStepResources resources, int count)
        {
            TimeSpan result = new TimeSpan();

            for (int i = 0; i < count; i++)
            {
                IProcedure   input       = new Input();
                IProcedure   placing     = new Placing();
                IProcedure   tracing     = new Tracing();
                IProcedure   displaying  = new Displaying();
                IProcedure   displaying2 = new Displaying();
                IProcedure   evaluation  = new Evaluation();
                IProcedure   evaluation2 = new Evaluation();
                IProcedure   storing     = new Storing();
                Designer     designer    = resources.designer;
                Designer     designer2   = resources.designer2;
                Computer     comp1       = resources.workstation;
                Computer     comp2       = resources.workstation2;
                Computer     serv        = resources.server;
                AbsrtactTask tempTask    = board;

                input.AddResource(designer);
                input.AddResource(comp1);

                placing.AddResource(comp1);
                placing.AddResource(designer);
                placing.AddResource(resources.algorithm);



                displaying.AddResource(comp1);
                displaying.AddResource(designer);

                evaluation.AddResource(designer);
                evaluation.AddResource(comp1);

                //commont
                tempTask = input.PerformProcedure(tempTask);
                //placing
                do
                {
                    tempTask = placing.PerformProcedure(tempTask);
                    tempTask = displaying.PerformProcedure(tempTask);
                    tempTask = evaluation.PerformProcedure(tempTask);
                    if (tempTask is Board)
                    {
                        if ((tempTask as Board).quality != Board.Quality.Bad)
                        {
                            break;
                        }
                    }
                } while (true);
                storing.AddResource(serv);
                storing.AddResource(designer);
                tempTask = storing.PerformProcedure(tempTask);

                //tracing
                //do a job before tracing
                tracing.AddResource(comp2);
                tracing.AddResource(resources.algorithm2);

                displaying2.AddResource(comp2);
                displaying2.AddResource(designer2);

                evaluation2.AddResource(designer2);
                evaluation2.AddResource(comp2);

                //tracing step
                do
                {
                    tempTask = tracing.PerformProcedure(tempTask);
                    tempTask = displaying2.PerformProcedure(tempTask);
                    tempTask = evaluation2.PerformProcedure(tempTask);
                    if (tempTask is Board)
                    {
                        if ((tempTask as Board).quality != Board.Quality.Bad)
                        {
                            break;
                        }
                    }
                } while (true);
                //change employee
                storing.RemoveResource(designer);
                storing.AddResource(designer2);
                tempTask = storing.PerformProcedure(tempTask);

                result += (tempTask as Board).DevelopTime;
            }
            return(TimeSpan.FromHours(result.TotalHours / count));
        }
Beispiel #3
0
        public PlacingAndTracingStepResources Optimize(Board board, AverageValueDelegate experimentResult, out double cost)
        {
            Random rand = new Random();

            currentConfiguration            = new PlacingAndTracingStepResources();
            currentConfiguration.algorithm  = new MatrixPlacingAlgorithm();
            currentConfiguration.algorithm2 = new WaveTracingAlgorythm();
            currentConfiguration.designer   = new Designer();
            currentConfiguration.designer2  = new Designer();
            currentConfiguration.server     = new Computer()
            {
                CpuFrequency = 3.5e6
            };
            currentConfiguration.workstation = new Computer()
            {
                CpuFrequency = 2.5e6
            };
            currentConfiguration.workstation2 = new Computer()
            {
                CpuFrequency = 2.5e6
            };
            bestConfiguration = currentConfiguration;
            temperature       = StartTemperature;
            currentIteration  = 0;


            while (temperature > EndTemperature)
            {
                PlacingAndTracingStepResources prevConfig;
                prevConfig = currentConfiguration;

                currentConfiguration              = new PlacingAndTracingStepResources();
                currentConfiguration.algorithm    = prevConfig.algorithm;
                currentConfiguration.algorithm2   = prevConfig.algorithm2;
                currentConfiguration.designer     = prevConfig.designer;
                currentConfiguration.designer2    = prevConfig.designer;
                currentConfiguration.server       = prevConfig.server;
                currentConfiguration.workstation  = prevConfig.workstation;
                currentConfiguration.workstation2 = prevConfig.workstation2;


                ///изменение одного параметра
                switch (rand.Next(0, 5))
                {
                case 0:
                    if (currentConfiguration.algorithm is MatrixPlacingAlgorithm)
                    {
                        currentConfiguration.algorithm = new TightPlacingAlgorithm();
                    }
                    else
                    {
                        currentConfiguration.algorithm = new MatrixPlacingAlgorithm();
                    }
                    break;

                case 1:
                    if (currentConfiguration.algorithm2 is WaveTracingAlgorythm)
                    {
                        currentConfiguration.algorithm2 = new TrunkTracingAlgorythm();
                    }
                    else if (currentConfiguration.algorithm2 is TrunkTracingAlgorythm)
                    {
                        currentConfiguration.algorithm2 = new BeamTracingAlgorythm();
                    }
                    else
                    {
                        currentConfiguration.algorithm2 = new WaveTracingAlgorythm();
                    }
                    break;

                case 2:
                    currentConfiguration.server.CpuFrequency = rand.Next(2, 9) * 0.5e6;
                    break;

                case 3:
                    currentConfiguration.workstation.CpuFrequency = rand.Next(2, 9) * 0.5e6;
                    break;

                case 4:
                    currentConfiguration.workstation2.CpuFrequency = rand.Next(2, 9) * 0.5e6;
                    break;
                }

                //выбираем лучший
                if (CalcFunctionWeight(board, bestConfiguration, experimentResult) >= CalcFunctionWeight(board, currentConfiguration, experimentResult))
                {
                    bestConfiguration = currentConfiguration;
                }
                //или рандомно
                else
                {
                    double P = CalculateProbaility(CalcFunctionWeight(board, currentConfiguration, experimentResult) - CalcFunctionWeight(board, bestConfiguration, experimentResult), temperature);
                    if (rand.NextDouble() <= P)
                    {
                        bestConfiguration = currentConfiguration;
                    }
                }
                //запоминаем лучший результат в любом случае
                currentConfiguration = bestConfiguration;

                //Охлаждаем
                temperature -= DeltaTemperature;
                currentIteration++;
            }
            cost = CalcFunctionWeight(board, bestConfiguration, experimentResult);
            return(bestConfiguration);
        }