public override async Task <Result> Resolve(ProblemStatement input)
        {
            var stopWatch     = Stopwatch.StartNew();
            var smallestPizza = input.PizzaTypes.Select(type => type.Slices).Min();
            var maxSlices     = input.MaximumNumberOfSlices;
            var pizzas        = input.PizzaTypes;
            var currentSlices = 0;
            var orderedPizzas = new List <int>();

            while (currentSlices < maxSlices)
            {
                PizzaType pizzaToUse     = null;
                var       possiblePizzas = pizzas.Where(pizza => pizza.Slices <= maxSlices - currentSlices).ToList();
                pizzaToUse = possiblePizzas.LastOrDefault();
                //if (possiblePizzas.Count >= 2)
                //{
                //    pizzaToUse = possiblePizzas[possiblePizzas.Count - 2];
                //} else if (possiblePizzas.Count == 1)
                //{
                //    pizzaToUse = possiblePizzas.First();
                //}
                if (pizzaToUse is null)
                {
                    break;
                }
                pizzas.Remove(pizzaToUse);
                orderedPizzas.Add(pizzaToUse.Type);
                currentSlices += pizzaToUse.Slices;
            }
            var result = await Task.FromResult(new Result(orderedPizzas));

            _logger.LogInformation("Resolved by MDW in {0}s", (float)stopWatch.ElapsedMilliseconds / 1000);
            _logger.LogInformation("Rest is {0} slices when smallest item in set is {1}", maxSlices - currentSlices, smallestPizza);
            return(result);
        }
예제 #2
0
        protected void contentsParams_Deactivate(object sender, EventArgs e)
        {
            ProblemStatement ps = new ProblemStatement();

            ps.Author       = authorTB.Text;
            ps.InputFormat  = inputFormatTB.Text;
            ps.OutputFormat = outputFormatTB.Text;
            ps.InputSample  = inputSampleTB.Text;
            ps.OutputSample = outputSampleTB.Text;
            ps.Text         = textTB.Text;

            problem.Statement = ps;
            problem.Name      = nameTB.Text;
            problem.Store();
        }
예제 #3
0
        public void LockedTest2()
        {
            var problemStatement = new ProblemStatement
            {
                chores = new List <ChoreCore>
                {
                    createChore("c1", 1, 2, 3, 3, "u2"),
                    createChore("c2", 2, 2, 3, 3),
                    createChore("c3", 1, 1, 1, 3),
                    createChore("c4", 2, 3, 3, 2),
                    createChore("c7", 2, 1, 2, 3)
                },
                users = new List <UserCore>
                {
                    new UserCore
                    {
                        userId = "u1",
                        shareOfChoresPercent = 0.2
                    },
                    new UserCore
                    {
                        userId = "u2",
                        shareOfChoresPercent = 0.3
                    },
                    new UserCore
                    {
                        userId = "u3",
                        shareOfChoresPercent = 0.4
                    },
                    new UserCore
                    {
                        userId = "u4",
                        shareOfChoresPercent = 0.1
                    },
                }
            };

            var assService = new AssignmentService();
            var result1    = assService.Solve(problemStatement);

            Assert.Equal(1, result1.Item1.TotalDiff);
        }
예제 #4
0
        public void Test()
        {
            var problemStatement = new ProblemStatement
            {
                chores = new List <ChoreCore>
                {
                    createChore("c1", 1, 2, 3),
                    createChore("c2", 2, 2, 3),
                    createChore("c3", 1, 1, 1),
                    createChore("c4", 3, 2, 2),
                    createChore("c5", 1, 2, 1),
                    createChore("c6", 1, 2, 2),
                    createChore("c7", 2, 1, 2)
                },
                users = new List <UserCore>
                {
                    new UserCore
                    {
                        userId = "u1",
                        shareOfChoresPercent = 0.33333
                    },
                    new UserCore
                    {
                        userId = "u2",
                        shareOfChoresPercent = 0.111111
                    },
                    new UserCore
                    {
                        userId = "u3",
                        shareOfChoresPercent = 0.666666
                    },
                }
            };

            var assService = new AssignmentService();
            var result1    = assService.GetBuckets(problemStatement.users, problemStatement.chores);

            Assert.Equal(3, result1.Count());
        }
예제 #5
0
 public Problem(IServiceProvider serviceProvider, ApplicationDbContext dbContext, Model.Problem model) : base(serviceProvider, dbContext, model)
 {
     this.statement          = MessagePackSerializer.Deserialize <ProblemStatement>(model._Statement);
     this.submissionProvider = ServiceProvider.GetRequiredService <ProblemSubmissionProvider>();
 }
예제 #6
0
 public ActionResult <Solution> Post([FromBody] ProblemStatement problem)
 {
     var(solution, _) = _assignmentService.Solve(problem);
     return(new OkObjectResult(solution));
 }
예제 #7
0
        public (Solution, MetaData) Solve(ProblemStatement problemStatement, bool print = false)
        {
            //clean data - users might not have effort ratings - add locked chores to user - and shares might be missing
            foreach (var chore in problemStatement.chores)
            {
                foreach (var user in problemStatement.users)
                {
                    var effortRating = chore.effortRatings.FirstOrDefault(e => e.userId == user.userId);
                    if (effortRating == null)
                    {
                        chore.effortRatings.Add(new EffortRating
                        {
                            userId = user.userId,
                            effort = chore.effortRatings.Min(e => e.effort)
                        });
                    }

                    if (!problemStatement.CustomShareOfChores)
                    {
                        user.shareOfChoresPercent = 1.0 / (double)problemStatement.users.Count();
                    }

                    user.lockedChores = problemStatement.chores.Where(c => c.lockedToUserId == user.userId).ToArray();
                    var exactActualEffort          = problemStatement.chores.Sum(c => c.effort) * user.shareOfChoresPercent;
                    var percentAfterMyLockedChores = (1 - (user.lockedChores.Sum(c => c.effort) / exactActualEffort)) * user.shareOfChoresPercent;
                    user.percentAfterMyLockedChores = percentAfterMyLockedChores > 0 ? percentAfterMyLockedChores : 0;
                }
            }

            //Adjust problem after locked chores
            var usersToSolve                 = problemStatement.users.Where(u => u.percentAfterMyLockedChores > 0);
            var usersFullOfChores            = problemStatement.users.Where(u => u.percentAfterMyLockedChores == 0);
            var choresToSolve                = problemStatement.chores.Select(c => c);
            var sumOfSharePercentAfterLocked = problemStatement.users.Sum(u => u.percentAfterMyLockedChores);
            var adjustRatio = 1 / sumOfSharePercentAfterLocked;

            foreach (var user in usersToSolve)
            {
                user.shareOfChoresPercent = user.percentAfterMyLockedChores * adjustRatio;
            }
            foreach (var chore in choresToSolve)
            {
                chore.effortRatings = chore.effortRatings.Where(e => !usersFullOfChores.Any(u => u.userId == e.userId)).ToList();
            }

            choresToSolve = choresToSolve.Where(c => string.IsNullOrEmpty(c.lockedToUserId));
            var solutions = new List <Solution>();

            if (choresToSolve.Count() != 0)
            {
                var bucketsPermutations = GetBuckets(usersToSolve, choresToSolve);
                foreach (var buckets in bucketsPermutations)
                {
                    Debug.WriteLine($"Solving for permutation {buckets.Select(kvp => kvp.Value).ToArray()}:");
                    var(solution, metadata) = SolveForBuckets(choresToSolve.ToArray(), usersToSolve.ToArray(), buckets, print);
                    if (solution.IsPerfect)
                    {
                        return(solution, metadata);
                    }
                    solutions.Add(solution);
                }
            }
            else
            {
                //All chores locked, just add a empty solution
                solutions.Add(new Solution
                {
                    choreToUserMap = new List <KeyValuePair <string, string> >()
                });
            }
            var bestSolution = solutions.OrderBy(s => s.TotalDiff).ThenBy(s => s.MaximumDiff).First();

            foreach (var user in problemStatement.users)
            {
                foreach (var chore in user.lockedChores)
                {
                    bestSolution.choreToUserMap.Add(new KeyValuePair <string, string>(user.userId, chore.choreId));
                }
            }
            return(bestSolution, null);
        }