Exemplo n.º 1
0
        private DayCalculation CalculateDay(List <DishParam> dishes)
        {
            var day = new DayCalculation(dishes.Count);

            for (int j = 0; j < dishes.Count; j++)
            {
                day.DishWeight[j] = dishes[j].PossibleWeight;


                if (!dishes[j].IsInterval)
                {
                    day.DishConstWeight[j] = dishes[j].PossibleWeight;
                }
                day.Calories      += dishes[j].CaloriesPer100 * dishes[j].PossibleWeight / 100;
                day.Proteins      += dishes[j].ProteinsPer100 * dishes[j].PossibleWeight / 100;
                day.Fats          += dishes[j].FatsPer100 * dishes[j].PossibleWeight / 100;
                day.Carbohydrates += dishes[j].CarbohydratesPer100 * dishes[j].PossibleWeight / 100;
            }
            decimal breakfast = dishes.Where(x => x.MealType == 0).Sum(x => x.PossibleWeight * x.CaloriesPer100);
            decimal lunch     = dishes.Where(x => x.MealType == 1).Sum(x => x.PossibleWeight * x.CaloriesPer100);
            decimal dinner    = dishes.Where(x => x.MealType == 2).Sum(x => x.PossibleWeight * x.CaloriesPer100);
            decimal sum       = breakfast + lunch + dinner;

            day.BreakfastCoefficient = (breakfast / sum * 100);
            day.DinnerCoefficient    = (dinner / sum * 100);
            day.LunchCoefficient     = (lunch / sum * 100);

            day.DayCoefficient = GetDayCoefficient(day);

            return(day);
        }
Exemplo n.º 2
0
        public CalculateModel CalculateDay(int dayId /*, int weight*/)
        {
            var day = _repository.GetDay(dayId);

            for (int i = 40; i <= 100; i += 5)
            {
                int weight = i;
                defaultDayOptions = new DayCalculation(day.Meals.Sum(x => x.Dishes.Count))
                {
                    Calories             = day.Week.DietProgram.Calories * weight,
                    Proteins             = day.Week.DietProgram.Proteins * weight,
                    Fats                 = day.Week.DietProgram.Fats * weight,
                    Carbohydrates        = day.Week.DietProgram.Carbohydrates * weight,
                    BreakfastCoefficient = 40,
                    LunchCoefficient     = 40,
                    DinnerCoefficient    = 20
                };

                var dishList = GetDishParamList(day.Meals).OrderByDescending(x => x.GetInterval).ToList();

                iterCount = 0;
                CalculateBestDay(dishList);

                WriteCalculation(day, dishList, i);
                bestDayOptions = null;
            }

            return(new CalculateModel());
        }
Exemplo n.º 3
0
        private decimal GetDayCoefficient(DayCalculation day)
        {
            decimal res = 0M;

            res += Math.Abs(defaultDayOptions.Calories - day.Calories) / defaultDayOptions.Calories;
            res += Math.Abs(defaultDayOptions.Proteins - day.Proteins) / defaultDayOptions.Proteins;
            res += Math.Abs(defaultDayOptions.Fats - day.Fats) / defaultDayOptions.Fats;
            res += Math.Abs(defaultDayOptions.Carbohydrates - day.Carbohydrates) / defaultDayOptions.Carbohydrates;
            res += Math.Abs(defaultDayOptions.BreakfastCoefficient - day.BreakfastCoefficient) / defaultDayOptions.BreakfastCoefficient;
            res += Math.Abs(defaultDayOptions.LunchCoefficient - day.LunchCoefficient) / defaultDayOptions.LunchCoefficient;
            res += Math.Abs(defaultDayOptions.DinnerCoefficient - day.DinnerCoefficient) / defaultDayOptions.DinnerCoefficient;
            res  = Math.Round(res, 10);
            return(res);
        }
Exemplo n.º 4
0
        public CalculateModel CustomDayCalculate(int weight, int dayId, Dictionary <int, int> constWeight)
        {
            var day = _repository.GetDay(dayId);

            defaultDayOptions = new DayCalculation(day.Meals.Sum(x => x.Dishes.Count))
            {
                Calories             = day.Week.DietProgram.Calories * weight,
                Proteins             = day.Week.DietProgram.Proteins * weight,
                Fats                 = day.Week.DietProgram.Fats * weight,
                Carbohydrates        = day.Week.DietProgram.Carbohydrates * weight,
                BreakfastCoefficient = 40,
                LunchCoefficient     = 40,
                DinnerCoefficient    = 20
            };

            var dishList = GetDishParamList(day.Meals /*day.Calculations.FirstOrDefault(x => x.ClientWeight == weight).DishCalculations*/, constWeight)
                           .OrderByDescending(x => x.GetInterval).ToList();

            CalculateBestDay(dishList);

            WriteCalculation(day, dishList, weight);

            return(new CalculateModel());
        }
Exemplo n.º 5
0
        private void CalculateBestDay(List <DishParam> dishes, int i = 0)
        {
            iterCount++;
            if (dishes[i].IsInterval && i < dishes.Count)
            {
                if (bestDayOptions != null && bestDayOptions.PossibleMin[i] > 0 && bestDayOptions.PossibleMax[i] > 0)
                {
                    dishes[i].PossibleMaxWeight = bestDayOptions.PossibleMax[i];
                    dishes[i].PossibleMinWeight = bestDayOptions.PossibleMin[i];
                }


                if (dishes[i].GetPossibleInterval <= 6)
                {
                    return;                                     //exit condition
                }
                var possWeight1 = dishes[i].PossibleMinWeight + (dishes[i].PossibleMaxWeight - dishes[i].PossibleMinWeight) / 4;
                dishes[i].PossibleWeight = possWeight1;

                var day1 = CalculateDay(dishes);
                if (bestDayOptions == null)
                {
                    bestDayOptions = day1;
                }
                if (bestDayOptions != null && bestDayOptions.DayCoefficient >= day1.DayCoefficient /*&& i + 1 == dishes.Count*/)
                {
                    bestDayOptions = day1;
                }
                if (i + 1 < dishes.Count)
                {
                    CalculateBestDay(dishes, i + 1);
                }


                var possWeight3 = dishes[i].PossibleMinWeight + (dishes[i].PossibleMaxWeight - dishes[i].PossibleMinWeight) / 2;
                dishes[i].PossibleWeight = possWeight3;

                var day3 = CalculateDay(dishes);
                if (bestDayOptions == null)
                {
                    bestDayOptions = day3;
                }
                if (bestDayOptions != null && bestDayOptions.DayCoefficient >= day3.DayCoefficient /*&& i + 1 == dishes.Count*/)
                {
                    bestDayOptions = day3;
                }
                if (i + 1 < dishes.Count)
                {
                    CalculateBestDay(dishes, i + 1);
                }


                var possWeight2 = dishes[i].PossibleMinWeight + (dishes[i].PossibleMaxWeight - dishes[i].PossibleMinWeight) / 4 * 3;
                dishes[i].PossibleWeight = possWeight2;

                var day2 = CalculateDay(dishes);
                if (bestDayOptions == null)
                {
                    bestDayOptions = day2;
                }
                if (bestDayOptions != null && bestDayOptions.DayCoefficient >= day2.DayCoefficient /*&& i + 1 == dishes.Count*/)
                {
                    bestDayOptions = day2;
                }
                if (i + 1 < dishes.Count)
                {
                    CalculateBestDay(dishes, i + 1);
                }


                if (i == 0 && dishes[i].GetPossibleInterval >= 6)
                {
                    for (int j = 0; j < dishes.Count; j++)
                    {
                        if ((dishes[j].PossibleMaxWeight + dishes[j].PossibleMinWeight) / 2 == bestDayOptions.DishWeight[j])
                        {
                            bestDayOptions.PossibleMax[j] = dishes[j].PossibleMinWeight + (dishes[j].PossibleMaxWeight - dishes[j].PossibleMinWeight) / 4 * 3;
                            bestDayOptions.PossibleMin[j] = dishes[j].PossibleMinWeight + (dishes[j].PossibleMaxWeight - dishes[j].PossibleMinWeight) / 4;
                        }
                        else if ((dishes[j].PossibleMaxWeight + dishes[j].PossibleMinWeight) / 2 > bestDayOptions.DishWeight[j])
                        {
                            bestDayOptions.PossibleMax[j] = dishes[j].PossibleMinWeight + (dishes[j].PossibleMaxWeight - dishes[j].PossibleMinWeight) / 2;
                            bestDayOptions.PossibleMin[j] = dishes[j].PossibleMinWeight;
                        }
                        else
                        {
                            bestDayOptions.PossibleMax[j] = dishes[j].PossibleMaxWeight;
                            bestDayOptions.PossibleMin[j] = dishes[j].PossibleMinWeight + (dishes[j].PossibleMaxWeight - dishes[j].PossibleMinWeight) / 2;
                        }
                    }
                    CalculateBestDay(dishes);
                }// repeat condition
            }
        }