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); //} }
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(); }
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); }
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); }