示例#1
0
        private Dictionary <long, OptimisationModel> GetOptimizationModelMap(List <MeasurementUnit> measGenerators, float windSpeed, float sunlight)
        {
            float sumInGetOptModelMap = 0;
            float wholeSum            = 0;
            //lock (lockObj)
            //{
            Dictionary <long, OptimisationModel> optModelMap = new Dictionary <long, OptimisationModel>();

            foreach (var measUnit in measGenerators)
            {
                OptimisationModel om = null;

                if (generators.ContainsKey(measUnit.Gid))
                {
                    Generator g = generators[measUnit.Gid];

                    wholeSum += measUnit.CurrentValue;
                    if (g.GeneratorType == GeneratorType.Hydro || g.GeneratorType == GeneratorType.Solar || g.GeneratorType == GeneratorType.Wind)
                    {
                        sumInGetOptModelMap += measUnit.CurrentValue;
                    }

                    float percentage = (100 * (measUnit.CurrentValue)) / (g.MaxQ);

                    GeneratorCurveModel generatorCurveModel = generatorCurves.FirstOrDefault(x => x.LowerPoint <= percentage && x.HigherPoint >= percentage && x.GeneratorType.Split('_')[0] == g.GeneratorType.ToString());
                    om = new OptimisationModel(g, measUnit, windSpeed, sunlight, generatorCurveModel);

                    optModelMap.Add(om.GlobalId, om);
                }
            }

            GenAll       = wholeSum;
            GenRenewable = sumInGetOptModelMap;
            Diff         = wholeSum - sumInGetOptModelMap;

            Console.WriteLine("WholeSUm: " + wholeSum);
            Console.WriteLine("sumInGetOptModelMap: " + sumInGetOptModelMap);
            Console.WriteLine("Difference: " + (wholeSum - sumInGetOptModelMap));

            return(optModelMap);
            //}
        }
示例#2
0
        public OptimisationModel(Generator g,
                                 MeasurementUnit mu,
                                 float windSpeed,
                                 float sunlight,
                                 GeneratorCurveModel generatorCurveModel = null)
        {
            GlobalId              = g.GlobalId;
            MeasuredValue         = mu.CurrentValue;
            Fuel                  = new Tuple <GeneratorType, float>(g.GeneratorType, GetUnitPrice(g.GeneratorType)); //gorivo i cena po jedinici kolicine
            GenericOptimizedValue = 0;
            TypeGenerator         = g.GeneratorType;
            Renewable             = (g.GeneratorType.Equals(GeneratorType.Wind) || g.GeneratorType.Equals(GeneratorType.Solar) || g.GeneratorType.Equals(GeneratorType.Hydro)) ? true : false;
            measurementUnit       = mu;

            Price          = 0;
            MaxPower       = g.MaxQ;
            MinPower       = g.MinQ;
            EmissionFactor = SetEmissionFactor(g.GeneratorType);
            Curve          = generatorCurveModel ?? new GeneratorCurveModel();
        }
示例#3
0
        public float GetProfit(Dictionary <long, OptimisationModel> allGenerators)
        {
            float profitValue = 0;
            Dictionary <GeneratorType, float> maxPowerPerFuel = new Dictionary <GeneratorType, float>();

            float sumOfRenewables = allGenerators.Where(x => x.Value.Renewable).Select(u => u.Value.measurementUnit.CurrentValue).Sum();

            maxPowerPerFuel.Add(GeneratorType.Oil, generators.Where(x => x.Value.GeneratorType == GeneratorType.Oil).Sum(y => y.Value.MaxQ));
            maxPowerPerFuel.Add(GeneratorType.Coal, generators.Where(x => x.Value.GeneratorType == GeneratorType.Coal).Sum(y => y.Value.MaxQ));
            maxPowerPerFuel.Add(GeneratorType.Gas, generators.Where(x => x.Value.GeneratorType == GeneratorType.Gas).Sum(y => y.Value.MaxQ));

            maxPowerPerFuel[GeneratorType.Oil]  -= allGenerators.Where(x => x.Value.TypeGenerator == GeneratorType.Oil).Sum(y => y.Value.MeasuredValue);
            maxPowerPerFuel[GeneratorType.Coal] -= allGenerators.Where(x => x.Value.TypeGenerator == GeneratorType.Coal).Sum(y => y.Value.MeasuredValue);
            maxPowerPerFuel[GeneratorType.Gas]  -= allGenerators.Where(x => x.Value.TypeGenerator == GeneratorType.Gas).Sum(y => y.Value.MeasuredValue);

            foreach (var item in allTypes)
            {
                if (maxPowerPerFuel[item.Key] >= sumOfRenewables)
                {
                    //profitValue += (item.Value * (sumOfRenewables/1000f));
                    float percentage = (100 * (sumOfRenewables / 1000f)) / (maxPowerPerFuel[item.Key] / 1000f);
                    GeneratorCurveModel genCurveModel = generatorCurves.FirstOrDefault(x => x.LowerPoint <= percentage && x.HigherPoint >= percentage && x.GeneratorType.Contains(item.Key.ToString()));
                    float fuelQuantityPerMW           = (float)genCurveModel.A * percentage + (float)genCurveModel.B;                 //[t/MW]
                    float fuelQuantity = fuelQuantityPerMW * sumOfRenewables / 1000f;
                    profitValue += item.Value * fuelQuantity;
                    break;
                }
                else
                {
                    sumOfRenewables -= maxPowerPerFuel[item.Key];
                    float percentage = (100 * (sumOfRenewables / 1000f)) / (maxPowerPerFuel[item.Key] / 1000f);
                    percentage = percentage / 100f;
                    GeneratorCurveModel genCurveModel = generatorCurves.FirstOrDefault(x => x.LowerPoint <= percentage && x.HigherPoint >= percentage && x.GeneratorType.Contains(item.Key.ToString()));
                    float fuelQuantityPerMW           = (float)genCurveModel.A * percentage + (float)genCurveModel.B;                 //[t/MW]
                    float fuelQuantity = fuelQuantityPerMW * sumOfRenewables / 1000f;
                    profitValue += item.Value * fuelQuantity;
                    //profitValue += (item.Value * (sumOfRenewables / 1000f));
                }
            }
            return(profitValue);
        }
示例#4
0
        public float CalculatePrice(float energy)
        {
            if (Renewable)
            {
                return(0);
            }
            float price      = 0;
            float percentage = (100 * (energy)) / (MaxPower);

            Curve = CalculationEngine.generatorCurves.FirstOrDefault(x => x.LowerPoint <= percentage && x.HigherPoint >= percentage && x.GeneratorType.Split('_')[0] == TypeGenerator.ToString());
            if (Curve != null)
            {
                float fuelQuantityPerMW = (float)Curve.A * (percentage) + (float)Curve.B;       //[t/MW]
                float fuelQuantity      = fuelQuantityPerMW * (energy / 1000f);
                price  = Fuel.Item2 * fuelQuantity;
                PointX = percentage;
                PointY = fuelQuantityPerMW;
            }

            return(price);
        }