Beispiel #1
0
        public IEnumerable <PowerPlantInputDto> Compute(PayLoadDto dto)
        {
            var payload = _payLoadConverter.ToModel(dto);

            var powerPlantByMeritOrder = payload.PowerPlants.OrderBy(p => p.ComputePricePerMwh()).ThenBy(p => p.Pmin);

            var load = payload.Load;

            GenericPowerPlant prec = null;

            foreach (var p in powerPlantByMeritOrder)
            {
                if (load == 0)
                {
                    p.Power = 0;
                    continue;
                }


                var delta = load - p.Power;

                if (delta == 0)
                {
                    load = 0;
                }

                if (delta > 0)
                {
                    load = delta;
                    prec = p;
                }

                if (delta < 0)
                {
                    if (load >= p.Pmin && load <= p.Pmax)
                    {
                        p.Power = (float)Math.Round(load, 1);
                        load    = 0;
                    }

                    else if (prec != null)
                    {
                        prec.Power = p.Power + load - p.Pmin;
                        p.Power    = p.Pmin;
                        prec       = null;
                        load       = 0;
                    }
                }
            }

            var dtos = _converter.ToDtos(powerPlantByMeritOrder);

            return(dtos);
        }
 public IActionResult ProductionPlan(PayLoadDto payload)
 {
     try
     {
         var dtos      = _service.Compute(payload);
         var responses = (from dto in dtos select new { name = dto.Name, p = dto.Power }).ToArray();
         return(Ok(responses));
     }
     catch (Exception ex)
     {
         return(BadRequest(ex.Message));
     }
 }
        public void CanComputeSamePriceButDiffrentPminLowPlan()
        {
            /****
             * setup
             *
             */
            IPowerPlantConverter converter        = new PowerPlantConverter();
            IFuelConverter       fuelconverter    = new FuelConverter();
            IPayLoadConverter    payLoadConverter = new PayLoadConverter(converter, fuelconverter);
            var service = new PowerPlantService(converter, payLoadConverter);

            //fuel Dictionnary

            var fuelsDict = new Dictionary <string, float> {
                { "gas(euro/MWh)", 13.4f },
                { "kerosine(euro/MWh)", 50.8f },
                { "co2(euro/ton)", 20f },
                { "wind(%)", 60f }
            };

            var pw1 = new PowerPlantInputDto {
                Name = "gasfirebig1", Type = "gasfired", Efficiency = 0.53f, Pmax = 460, Pmin = 100
            };


            var pw2 = new PowerPlantInputDto {
                Name = "gasfirebig2", Type = "gasfired", Efficiency = 0.53f, Pmax = 460, Pmin = 100
            };


            var pw3 = new PowerPlantInputDto {
                Name = "gasfiredsomewhatsmaller", Type = "gasfired", Efficiency = 0.53f, Pmax = 210, Pmin = 40
            };


            var pw4 = new PowerPlantInputDto {
                Name = "tj1", Type = "turbojet", Efficiency = 0.3f, Pmax = 16, Pmin = 0,
            };


            var pw5 = new PowerPlantInputDto {
                Name = "windpark1", Type = "windturbine", Efficiency = 1f, Pmax = 150, Pmin = 0
            };


            var pw6 = new PowerPlantInputDto {
                Name = "windpark2", Type = "windturbine", Efficiency = 1f, Pmax = 36, Pmin = 0
            };



            var powerPlants = new List <PowerPlantInputDto> {
                pw1, pw2, pw3, pw4, pw5, pw6
            }.ToArray();


            //3 the payload
            var payload = new PayLoadDto
            {
                Load        = 190,
                Fuels       = fuelsDict,
                PowerPlants = powerPlants
            };



            //act

            var result = service.Compute(payload);

            var exceptedResult = new[] {
                new PowerPlantInputDto {
                    Name = "windpark1", Power = 90
                },
                new PowerPlantInputDto {
                    Name = "windpark2", Power = 21.6f
                },
                new PowerPlantInputDto {
                    Name = "gasfirebig1", Power = 0
                },
                new PowerPlantInputDto {
                    Name = "gasfirebig2", Power = 0
                },
                new PowerPlantInputDto {
                    Name = "gasfiredsomewhatsmaller", Power = 78.4f
                },
                new PowerPlantInputDto {
                    Name = "tj1", Power = 0
                }
            };

            var hashet = new HashSet <PowerPlantInputDto>(result);

            Assert.IsTrue(hashet.SetEquals(exceptedResult));
        }