Esempio n. 1
0
 protected override bool IsNewMaximum(DefinitionDto definition, long[,] stateSpace, PositionDto maxPrize, int indexPrice, int indexItem)
 {
     return(indexPrice > maxPrize.X &&
            indexItem == definition.Items.Count - 1 &&
            stateSpace[indexPrice, indexItem] > 0 &&
            stateSpace[indexPrice, indexItem] <= definition.Capacity);
 }
        public IEnumerable <BitArray> CorrectGeneration(DefinitionDto definition, List <BitArray> generation)
        {
            foreach (var fenotyp in generation)
            {
                while (definition.Capacity < definition.Items.Select((item, itemIndex) => fenotyp[itemIndex] ? item.Weight : 0).Sum())
                {
                    var newMin = new { Index = -1, Value = double.MaxValue };
                    for (var indexGen = 0; indexGen < definition.Items.Count; indexGen++)
                    {
                        var item  = definition.Items[indexGen];
                        var ratio = (double)item.Price / item.Weight;
                        if (fenotyp[indexGen] && ratio < newMin.Value)
                        {
                            newMin = new { Index = indexGen, Value = ratio };
                        }
                    }

                    if (newMin.Index != -1)
                    {
                        fenotyp[newMin.Index] = false;
                    }
                }
                yield return(fenotyp);
            }
        }
        protected override IEnumerable <BitArray> SelectByCriteria(DefinitionDto definition, Random random, List <BitArray> generation)
        {
            for (int index = StartCount; index < generation.Count; index++)
            {
                var tournament = GenerateTournament(random, generation)
                                 .Select((fenotyp, tournamentInde) => new
                {
                    Index   = tournamentInde,
                    Fenotyp = fenotyp,
                    Score   = GetScoreItem(fenotyp, definition)
                })
                                 .Where(tuple => tuple.Score.Weight <= definition.Capacity)
                                 .ToList();
                if (!tournament.Any())
                {
                    yield return(generation[random.Next(0, generation.Count)]);

                    continue;
                }
                var max = tournament.Max(item => item.Score.Price);
                if (max != 0)
                {
                    yield return(tournament.First(item => item.Score.Price == max).Fenotyp);
                }
            }
        }
Esempio n. 4
0
        public override (ResultDto, long) Compute(DefinitionDto definition)
        {
            var random     = new Random();
            var generation = InitializeGeneration(definition, random);

            for (var generationIndex = 0; generationIndex < Generations; generationIndex++)
            {
                var generationSelection = SelectionStrategy.Select(definition, random, generation).ToList();
                var generationNew       = CrossStrategy.Cross(definition.Items.Count, random, generationSelection, PopulationSize, CrossoverProbability).ToList();

                Mutation(random, generationNew);

                generation = generationNew;
                //var currentResult = GetResult(definition, generation);
                //Debug.WriteLine($"{generationIndex}\t{currentResult.Item1.Price}\t{currentResult.Item1.Weight}");
            }

            var result      = GetResult(definition, generation);
            var resultBools = new List <bool>();

            for (int index = 0; index < result.Item2.Count; index++)
            {
                resultBools.Add(result.Item2[index]);
            }
            return(new ResultDto(definition.Id, result.Item1.Price, resultBools), 0L);
        }
Esempio n. 5
0
        private long GetMax(DefinitionDto definition, long[,] stateSpace, int indexValue, int indexItem)
        {
            var without = GetWithoutSum(stateSpace, indexValue, indexItem);
            var with    = GetWithSum(stateSpace, indexValue, indexItem, definition.Items[indexItem]);

            return(GetTableValue(without, with));
        }
Esempio n. 6
0
        public override (ResultDto, long) Compute(DefinitionDto definition)
        {
            var searchSpace = new RemainderDto[definition.Capacity + 1, definition.Items.Count + 1];
            var counter     = 0L;

            return(ComputeResultRecursively(definition, new List <bool>(), 0, 0, searchSpace, ref counter), counter);
        }
Esempio n. 7
0
        public override (ResultDto, long) Compute(DefinitionDto definition)
        {
            var counter = 0L;
            var result  = ComputeResultRecursively(definition, new List <bool>(), 0, ref counter);

            return(result, counter);
        }
Esempio n. 8
0
        private ResultDto ComputeResultRecursively(DefinitionDto definition, List <bool> result, long weight, long price,
                                                   RemainderDto[,] searchSpace, ref long counter)
        {
            if (weight > definition.Capacity)
            {
                return(null);
            }
            if (result.Count == definition.Items.Count)
            {
                counter++;
                return(new ResultDto(definition.Id, GetSum(result, definition.Items).Price, result));
            }

            var cachedResult = searchSpace[weight, result.Count];

            if (cachedResult != null)
            {
                return(new ResultDto(definition.Id,
                                     GetSum(result, definition.Items).Price + cachedResult.Price,
                                     result.Concat(cachedResult.Result).ToList()));
            }

            var newResult = GetNewResult(definition, result, weight, price, searchSpace, ref counter);

            if (newResult != null)
            {
                CacheRemainder(result, weight, price, searchSpace, newResult);
            }

            return(newResult);
        }
Esempio n. 9
0
        public override (ResultDto, long) Compute(DefinitionDto definition)
        {
            var ratioItems = definition.Items.Select((item, index) => (index, new RatioItemDto(item.Weight, item.Price))).OrderByDescending(item => item.Item2.Ratio).ToList();
            var list       = Enumerable.Repeat(false, ratioItems.Count).ToList();
            var weightSum  = 0L;
            var priceSum   = 0L;

            foreach (var ratioItem in ratioItems)
            {
                if (weightSum + ratioItem.Item2.Weight <= definition.Capacity)
                {
                    weightSum            += ratioItem.Item2.Weight;
                    priceSum             += ratioItem.Item2.Price;
                    list[ratioItem.Item1] = true;
                }
                else
                {
                    list[ratioItem.Item1] = false;
                }
            }

            var suitaibleWeight = definition.Items
                                  .Select((item, index) => (index, new RatioItemDto(item.Weight, item.Price)))
                                  .Where(item => item.Item2.Weight <= definition.Capacity).ToList();
            var newMax       = suitaibleWeight.Max(item => item.Item2.Price);
            var mostPrecious = suitaibleWeight.First(item => item.Item2.Price == newMax);

            if (mostPrecious.Item2.Price > priceSum)
            {
                list = Enumerable.Repeat(false, ratioItems.Count).ToList();
                list[mostPrecious.Item1] = true;
                priceSum = mostPrecious.Item2.Price;
            }
            return(new ResultDto(definition.Id, priceSum, list), 1);
        }
 private IEnumerable <long> GetScore(DefinitionDto definition, List <BitArray> generation)
 {
     foreach (var item in generation.Select(fenotyp => GetScoreItem(fenotyp, definition)))
     {
         yield return(item.Weight > definition.Capacity
             ? 0
             : item.Price);
     }
 }
        public IEnumerable <BitArray> Select(DefinitionDto definition, Random random, List <BitArray> generation)
        {
            var correctedGeneration = CorrectionStrategy.CorrectGeneration(definition, generation).ToList();
            var elites          = SelectElites(definition, correctedGeneration).ToList();
            var childrenByScore = SelectByCriteria(definition, random, generation.ToList());
            var result          = RemoveWeakests(definition, elites.Concat(childrenByScore).ToList());

            return(result);
        }
 private IEnumerable <BitArray> RemoveWeakests(DefinitionDto definition, List <BitArray> generation)
 {
     return(generation
            .Select(fenotyp => new { Fenotyp = fenotyp, Score = GetScoreItem(fenotyp, definition) })
            .OrderBy(tuple => tuple.Score.Price)
            .Skip(WeakestsCount)
            .Select(item => item.Fenotyp)
            .ToArray());
 }
 public static int InsertCategory(string categoryName)
 {
    DefinitionDto dto = new DefinitionDto();
    dto.DefinitionType = CONST.DEFINITION.DEFINITION_TYPE_CATEGORY;
    dto.Value1 = categoryName;
    int id = DefinitionDao.Insert(dto);
    dto.DefinitionId = id;
    ListCategories.Add(dto);
    return id;
 }
Esempio n. 14
0
        public override (ResultDto, long) Compute(DefinitionDto definition)
        {
            var searchSpaceSize = GetSearchSpaceSize(definition);
            var searchSpace     = new long[searchSpaceSize, definition.Items.Count];

            var referencePoint = GetMaxPricePoint(definition, searchSpaceSize, searchSpace);
            var result         = ReconstructItems(searchSpace, referencePoint.X, referencePoint.Y, definition);

            return(new ResultDto(definition.Id, GetResultValue(result, definition), result), definition.Items.Count *searchSpaceSize);
        }
            public void ReturnMostValuableItem()
            {
                var items = new List <ItemDto>
                {
                    new ItemDto(51, 52),
                    new ItemDto(90, 60),
                };
                var definition = new DefinitionDto(1, 100, items);
                var result     = Strategy.Compute(definition);

                Assert.AreEqual(items[1].Price, result.Item1.Price);
            }
        private IEnumerable <BitArray> SelectElites(DefinitionDto definition, List <BitArray> generation)
        {
            var elites = generation
                         .Select(fenotyp => new { Fenotyp = fenotyp, Score = GetScoreItem(fenotyp, definition) })
                         .Where(tuple => tuple.Score.Weight <= definition.Capacity)
                         .OrderByDescending(tuple => tuple.Score.Price)
                         .Take(ElitesCount).ToArray();

            StartCount = elites.Length - WeakestsCount;

            return(elites.Select(item => item.Fenotyp));
        }
      public static bool UpdateAuthorization(DefinitionDto dto, String name, List<String> FeaturesName)
      {
         var featureMap = FeatureAttributeService.GetFeaturePropertiesNameMap();
         List<int> values = FeaturesName.Select(n => featureMap.GetValue(n)).Where(n => n != 0).ToList();
         var authorizationMap = FeatureAttributeService.GetAuthorizationMap();
         FeatureAttributeService.UpdateAuthorizationNameMap(name, values);
         authorizationMap.Remove(dto.Value1);
         authorizationMap[name] = values;

         dto.Value1 = name;
         dto.Value2 = String.Join(",", values);
         return DefinitionDao.Update(dto);
      }
 public static bool UpdateCategory(DefinitionDto dto)
 {
    DefinitionDto oldDto = ListCategories.FirstOrDefault(n => n.DefinitionId == dto.DefinitionId);
    bool result = DefinitionDao.Update(dto);
    if (result)
    {
       if (oldDto != null)
          ListCategories.Remove(oldDto);
       ListCategories.Add(dto);
       ListCategories.OrderBy(n => n.DefinitionId);
    }
    return result;
 }
            public void ReturnSumOfSmallItems()
            {
                var items = new List <ItemDto>
                {
                    new ItemDto(51, 52),
                    new ItemDto(50, 50),
                    new ItemDto(30, 30),
                    new ItemDto(20, 19),
                };
                var definition = new DefinitionDto(1, 100, items);
                var result     = Strategy.Compute(definition);

                Assert.AreEqual(items[0].Price + items[2].Price, result.Item1.Price);
            }
Esempio n. 20
0
        private IEnumerable <bool> GetPath(long[,] stateSpace, int x, int y, DefinitionDto definition)
        {
            for (int index = 0; index <= y; index++)
            {
                var without   = GetWithoutSum(stateSpace, x, y - index);
                var isWithSum = without != stateSpace[x, y - index];
                if (isWithSum)
                {
                    x = x - (int)GetCompositionValue(definition.Items[y - index]);
                }

                yield return(isWithSum);
            }
        }
Esempio n. 21
0
        public override (ResultDto, long) Compute(DefinitionDto definition)
        {
            var sum       = 0L;
            var maxPrices = Enumerable.Reverse(definition.Items).Select(item =>
            {
                sum += item.Price;
                return(sum);
            }).Reverse().ToList();
            long max     = -1;
            int  counter = 0;
            var  result  = ComputeResultRecursively(definition, new List <bool>(), maxPrices, ref max, 0, 0, ref counter);

            return(result, counter);
        }
Esempio n. 22
0
        private List <BitArray> InitializeGeneration(DefinitionDto definition, Random random)
        {
            var generation = new List <BitArray>();

            for (int generationIndex = 0; generationIndex < PopulationSize; generationIndex++)
            {
                generation.Add(new BitArray(definition.Items.Count));
                for (int itemIndex = 0; itemIndex < definition.Items.Count; itemIndex++)
                {
                    generation.Last().Set(itemIndex, random.Next(0, 100) > 50);
                }
            }

            return(generation);
        }
Esempio n. 23
0
        private ItemDto GetScoreItem(BitArray fenotyp, DefinitionDto definition)
        {
            var price  = 0L;
            var weight = 0L;

            for (int index = 0; index < fenotyp.Count; index++)
            {
                if (fenotyp[index])
                {
                    price  += definition.Items[index].Price;
                    weight += definition.Items[index].Weight;
                }
            }
            return(new ItemDto(weight, price));
        }
Esempio n. 24
0
        private ResultDto GetWithResult(DefinitionDto definition, List <bool> result, long weight, long price, RemainderDto[,] searchSpace, ref long counter)
        {
            var       item       = definition.Items[result.Count];
            var       sumWeight  = weight + item.Weight;
            ResultDto resultWith = null;

            if (sumWeight <= definition.Capacity)
            {
                resultWith = ComputeResultRecursively(definition, new List <bool>(result)
                {
                    true
                }, sumWeight, price + item.Price, searchSpace, ref counter);
            }

            return(resultWith);
        }
Esempio n. 25
0
        private ResultDto GetNewResult(DefinitionDto definition, List <bool> result, long weight, long price, RemainderDto[,] searchSpace, ref long counter)
        {
            var resultWith    = GetWithResult(definition, result, weight, price, searchSpace, ref counter);
            var resultWithout = ComputeResultRecursively(definition, new List <bool>(result)
            {
                false
            }, weight, price, searchSpace, ref counter);

            var returnValue = resultWithout;

            if (IsWithBetter(resultWith, resultWithout))
            {
                returnValue = resultWith;
            }
            return(returnValue);
        }
Esempio n. 26
0
        private (ItemDto, BitArray) GetResult(DefinitionDto definition, List <BitArray> generation)
        {
            var candidates = generation
                             .Select(generationItem => (GetScoreItem(generationItem, definition), generationItem))
                             .Where(item => item.Item1.Weight <= definition.Capacity)
                             .ToList();

            if (!candidates.Any())
            {
                return(new ItemDto(0, 0), new BitArray(definition.Items.Count));
            }
            var maxPrice = candidates.Max(item => item.Item1.Price);
            var result   = candidates.First(item => item.Item1.Price == maxPrice);

            return(result);
        }
      public static DefinitionDto InsertAuthorization(String name, List<String> FeaturesName)
      {
         var featureMap = FeatureAttributeService.GetFeaturePropertiesNameMap();
         List<int> values = FeaturesName.Select(n => featureMap.GetValue(n)).Where(n => n != 0).ToList();

         DefinitionDto dto = new DefinitionDto();
         dto.DefinitionType = CONST.DEFINITION.DEFINITION_TYPE_AUTHORIZATION;
         dto.Value1 = name;
         dto.Value2 = String.Join(",", values);
         int id = DefinitionDao.Insert(dto);
         dto.DefinitionId = id;

         var authorizationMap = FeatureAttributeService.GetAuthorizationMap();
         authorizationMap[name] = values;
         FeatureAttributeService.UpdateAuthorizationNameMap(name, values);
         return dto;
      }
Esempio n. 28
0
        protected PositionDto GetMaxPricePoint(DefinitionDto definition, long searchSpaceSiz, long[,] stateSpace)
        {
            var referencePoint = new PositionDto(0, 0, 0);

            for (var indexValue = 0; indexValue < searchSpaceSiz; indexValue++)
            {
                for (var indexItem = 0; indexItem < definition.Items.Count; indexItem++)
                {
                    stateSpace[indexValue, indexItem] = GetMax(definition, stateSpace, indexValue, indexItem);
                    if (IsNewMaximum(definition, stateSpace, referencePoint, indexValue, indexItem))
                    {
                        referencePoint = new PositionDto(indexValue, indexItem, stateSpace[indexValue, indexItem]);
                    }
                }
            }

            return(referencePoint);
        }
        protected override IEnumerable <BitArray> SelectByCriteria(DefinitionDto definition, Random random, List <BitArray> generation)
        {
            var score    = GetScore(definition, generation).ToList();
            var sumScore = score.Sum();

            for (var newGenerationIndex = StartCount; newGenerationIndex < generation.Count; newGenerationIndex++)
            {
                var randomValue = random.Next(0, (int)sumScore);
                var sumValue    = 0L;
                var counter     = -1;
                do
                {
                    counter++;
                    sumValue += score[counter];
                } while (sumValue <= randomValue);

                yield return(generation[counter]);
            }
        }
Esempio n. 30
0
        public override (ResultDto, long) Compute(DefinitionDto definition)
        {
            var maxValue = Math.Pow(2, definition.Items.Count);
            var maxPrice = 0L;
            var bestSeed = 0L;

            for (long index = 0; index < maxValue; index++)
            {
                var sumItem = GetSum(index, definition.Items);

                if (sumItem[0] <= definition.Capacity && sumItem[1] > maxPrice)
                {
                    maxPrice = sumItem[1];
                    bestSeed = index;
                }
            }

            return(new ResultDto(definition.Id, maxPrice, GetItems(bestSeed, definition.Items.Count)), (long)maxValue);
        }