示例#1
0
 public TaskProgress(BackpackTask backpackTask)
 {
     _backpackTask      = backpackTask;
     BackpackTaskId     = backpackTask.Id;
     _totalAmountOfWork = (int)Math.Round(Math.Pow(2, backpackTask.BackpackItems.Count) - 1);
     _currentProgress   = backpackTask.CombinationSets.Count;
 }
        private static void GenerateCombinationRecursive(BackpackTask backpackTask, List <Item> set, List <CombinationSet> result, TaskProgress service, CancellationToken token)
        {
            for (int i = 0; i < set.Count; i++)
            {
                if (token.IsCancellationRequested)
                {
                    return;
                }

                List <Item> temp = new List <Item>(set.Where((s, index) => index != i));

                if (temp.Count > 0 && !result.Where(l => l.ItemCombinations.Count == temp.Count).Any(l =>
                {
                    List <Item> items = l.ItemCombinations.Select(argItemCombination => argItemCombination.Item).ToList();
                    return(items.SequenceEqual(temp));
                }))
                {
                    CombinationSet combinationSet = new CombinationSet {
                        ItemCombinations = temp.Select(item => new ItemCombination {
                            Item = item
                        }).ToList()
                    };
                    result.Add(combinationSet);
                    CalculateCombinationSet(backpackTask, combinationSet, service, token);
                    GenerateCombinationRecursive(backpackTask, temp, result, service, token);
                }
            }
        }
示例#3
0
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Clear();
                Console.WriteLine(
                    "---------Меню---------\n" +
                    "1. Задача о рюкзаке\n" +
                    "2. RSA\n" +
                    "3. RSA .NET\n" +
                    "----------------------\n" +
                    "0. Выход"
                    );
                Console.Write("> ");
                string act = Console.ReadLine();
                switch (act)
                {
                case "1": BackpackTask.backpackTask(); break;

                case "2": RsaTask.myRSA(); break;

                case "3": RsaDotNetTask.dotnetRSA(); break;

                case "0": Environment.Exit(0); break;

                default:  Console.WriteLine("Неизвестная команда!"); break;
                }
            }
        }
        public async Task <string> NewBackpackTask(List <ItemDto> itemDtos, string taskName,
                                                   int backpackWeightLimit)
        {
            BackpackTask backpackTask = new BackpackTask
            {
                Name          = taskName,
                BackpackItems = Mapper.Map <List <ItemDto>, List <Item> >(itemDtos),
                WeightLimit   = backpackWeightLimit,
                StartTime     = DateTime.Now
            };

            var unitOfWork = UnitOfWork.UnitOfWorkFactory();

            unitOfWork.BackpackTaskRepository.Add(backpackTask);
            await unitOfWork.CompleteAsync();

            return(backpackTask.Id);
        }
示例#5
0
        public async Task ContinueBackpackTask_PassValidBackpackTask_ShouldComplete()
        {
            //  arrange
            List <ItemCombination> itemCombinations = new List <ItemCombination>();

            itemCombinations.Add(new ItemCombination {
                Item = _items[0]
            });
            itemCombinations.Add(new ItemCombination {
                Item = _items[1]
            });


            BackpackTask backpackTask = new BackpackTask();

            backpackTask.Id              = "id";
            backpackTask.Name            = "ContinueTask";
            backpackTask.WeightLimit     = 8;
            backpackTask.BackpackItems   = _items;
            backpackTask.CombinationSets = new List <CombinationSet>
            {
                new CombinationSet()
                {
                    Id = "AlreadyExist1",
                    ItemCombinations = itemCombinations
                },
            };



            BackpackTaskService service = new BackpackTaskService();

            _unitOfWork.BackpackTaskRepository.Add(Arg.Do <BackpackTask>(bc => backpackTask = bc));
            //  act
            _unitOfWork.BackpackTaskRepository.Get(Arg.Any <string>()).Returns(backpackTask);
            await service.StartBackpackTask("id", CancellationToken.None);

            //  assert
            //  assert
            Assert.AreEqual(31, backpackTask.CombinationSets.Count);
            Assert.AreEqual(46500, backpackTask.BestItemSetPrice);
            Assert.AreEqual(8, backpackTask.BestItemSetWeight);
            Assert.AreEqual(3, backpackTask.BestItemSet.Count);
        }
示例#6
0
        public async Task CreateNewBackpackTask_PassValidArgs_ShouldReturnBackpackTask()
        {
            //  arrange
            var taskName                     = "TaskName";
            var weightLimit                  = 8;
            BackpackTaskService service      = new BackpackTaskService();
            BackpackTask        backpackTask = null;

            _unitOfWork.BackpackTaskRepository.Add(Arg.Do <BackpackTask>(bc => backpackTask = bc));
            //  act
            string id = await service.NewBackpackTask(_itemDtos, taskName, weightLimit);

            //  assert
            Assert.NotNull(id);
            Assert.NotNull(backpackTask);
            Assert.AreEqual(taskName, backpackTask.Name);
            Assert.AreEqual(weightLimit, backpackTask.WeightLimit);
            Assert.AreEqual(_itemDtos.Count, backpackTask.BackpackItems.Count);
        }
        private static void CalculateCombinationSet(BackpackTask backpackTask, CombinationSet set,
                                                    TaskProgress service, CancellationToken token)
        {
            if (token.IsCancellationRequested)
            {
                return;
            }
            //  iterate over all item combinations
            //  calculate total weight and price of current item set
            var totalWeight = 0;
            var totalPrice  = 0;

            foreach (var itemCombination in set.ItemCombinations)
            {
                totalWeight += itemCombination.Item.Weight;
                totalPrice  += itemCombination.Item.Price;
            }

            //  check if we ok with totalWeight and current price of item set is greater that current best item set price
            if (totalWeight <= backpackTask.WeightLimit &&
                totalPrice > backpackTask.BestItemSetPrice)
            {
                //  update current solution
                backpackTask.BestItemSetPrice  = totalPrice;
                backpackTask.BestItemSetWeight = totalWeight;
                List <Item> items = new List <Item>();
                foreach (var itemCombo in set.ItemCombinations)
                {
                    items.Add(itemCombo.Item);
                }
                backpackTask.BestItemSet = new List <BestItemSet>();
                foreach (var item in items)
                {
                    backpackTask.BestItemSet.Add(new BestItemSet()
                    {
                        Item = item
                    });
                }
            }

            service.UpdateProgress();
        }
        public async Task StartBackpackTask(string id, CancellationToken token)
        {
            var          unitOfWork   = UnitOfWork.UnitOfWorkFactory();
            BackpackTask backpackTask = unitOfWork.BackpackTaskRepository.Get(id);
            TaskProgress taskProgress = new TaskProgress(backpackTask);

            CalculationService.StartCalculation(backpackTask, taskProgress, token);

            if (token.IsCancellationRequested)
            {
                await unitOfWork.CompleteAsync();

                return;
            }
            backpackTask.EndTime  = DateTime.Now;
            backpackTask.Complete = true;

            unitOfWork.CombinationSetRepository.RemoveRange(backpackTask.CombinationSets);
            await unitOfWork.CompleteAsync();
        }
        public static void StartCalculation(BackpackTask backpackTask, TaskProgress service, CancellationToken token)
        {
            List <Item>           set    = backpackTask.BackpackItems;
            List <CombinationSet> result = backpackTask.CombinationSets;

            if (set.Count > 0 && !result.Where(l => l.ItemCombinations.Count == set.Count).Any(l =>
            {
                List <Item> items = l.ItemCombinations.Select(argItemCombination => argItemCombination.Item).ToList();
                return(items.SequenceEqual(set));
            }))
            {
                CombinationSet combinationSet = new CombinationSet {
                    ItemCombinations = set.Select(item => new ItemCombination {
                        Item = item
                    }).ToList()
                };
                result.Add(combinationSet);
                CalculateCombinationSet(backpackTask, combinationSet, service, token);
            }

            GenerateCombinationRecursive(backpackTask, set, result, service, token);
        }
示例#10
0
        public async Task StartBackpackTask_PassValidBackpackTask_ShouldCalculateCorrect()
        {
            //  arrange
            var taskName                     = "TaskName";
            var weightLimit                  = 8;
            BackpackTaskService service      = new BackpackTaskService();
            BackpackTask        backpackTask = null;

            _unitOfWork.BackpackTaskRepository.Add(Arg.Do <BackpackTask>(bc => backpackTask = bc));
            string backpackTaskId = await service.NewBackpackTask(_itemDtos, taskName, weightLimit);

            //  act
            _unitOfWork.BackpackTaskRepository.Get(Arg.Any <string>()).Returns(backpackTask);
            await service.StartBackpackTask(backpackTaskId, CancellationToken.None);

            //  assert
            //  assert
            Assert.AreEqual(31, backpackTask.CombinationSets.Count);
//            Assert.AreEqual(46500, backpackTask.BestItemSetPrice);
            Assert.AreEqual(weightLimit, backpackTask.BestItemSetWeight);
            Assert.AreEqual(3, backpackTask.BestItemSet.Count);
            Assert.IsTrue(backpackTask.Complete);
        }
 public void Remove(BackpackTask backpackTask)
 {
     _context.BackpackTasks.Remove(backpackTask);
 }
 public void Add(BackpackTask backpackTask)
 {
     _context.BackpackTasks.Add(backpackTask);
 }
示例#13
0
 public string OloloPost([FromBody] BackpackTask someName)
 {
     return("OK");
 }