.net 如何获得按产品分组的最佳方法,包括每个产品的平均记录数

yfjy0ee7  于 2022-12-24  发布在  .NET
关注(0)|答案(1)|浏览(172)

我尝试做的是按产品分组,并确保相同的产品总是被安排在相同的日期计数,daysScheduled不能超过产品类型MILK、CHAIR、TABLE、TV = 4产品类型,max scheduledDays将是4,scheduledDays可以是另一个输入,也可以是产品列表

int daysScheduled = 2

IList<Product> products = new List<Product>();
products.Add(new Product("CHAIR", "456"));
products.Add(new Product("CHAIR", "456"));
products.Add(new Product("TABLE", "789"));
products.Add(new Product("TABLE", "789"));
products.Add(new Product("TV", "567"));
products.Add(new Product("TV", "567"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));

分组方式不佳,因为第二天有两个产品(9条记录),其中一个可以移动到第一天,以便有更好的分组方式(平均记录),请注意,不可能拆分产品,如果移动了一个产品,则该产品的所有记录也应移动

// DAY 1 => type of products=2, records=4 
products.Add(new Product("CHAIR", "456"));
products.Add(new Product("CHAIR", "456"));
products.Add(new Product("TABLE", "789"));
products.Add(new Product("TABLE", "789"));

    // DAY 2 => type of products=2, records=9
products.Add(new Product("TV", "567"));
products.Add(new Product("TV", "567"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));

预期结果,因为平均记录每天的数量几乎相同

// DAY 1 => type of products=3, records=6 
products.Add(new Product("CHAIR", "456"));
products.Add(new Product("CHAIR", "456"));
products.Add(new Product("TABLE", "789"));
products.Add(new Product("TABLE", "789"));
products.Add(new Product("TV", "567"));
products.Add(new Product("TV", "567"));

    // DAY 2 => type of products=1, records=7
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));
products.Add(new Product("MILK", "123"));

pdta.保持添加产品的顺序
我该怎么做?请帮帮忙

qhhrdooz

qhhrdooz1#

如果我理解正确的话,需要将N个不同类型的项目(类型数- X)放置在Z个“天”中,这样一种类型的项目将被放置在同一个“天”中,如果可能的话,“天”中的项目数应该相同,等于N/Z。
解决方案1是将所有项目按类型分组,然后检查将这些组划分为Z“天”的所有可能组合,并找出最佳结果。该解决方案可以给予最准确的结果,但在时间方面非常昂贵- O(X^Z)
解决方案2是使用Greedy algorithm,这种算法经常用于解决类似的优化问题,它不能保证给予最好的结果,但它的时间复杂度要低得多,因此,在当前任务中,我们需要按类型对项目进行分组,按项目数降序排序,然后挑选项目,直到项目数小于或等于N/Z

var maxSize = products.Count / typeNumber;
var result = new List<List<Product>>();
var size = maxSize;
foreach (var itemsOfType in products
             .GroupBy(p => p.Type)
             .Select(g => g.ToList())
             .OrderByDescending(g => g.Count))
{
    if (size + itemsOfType.Count > maxSize)
    {
        result.Add(new List<Product>(itemsOfType.Count));
        size = 0;
    }
    result[^1].AddRange(itemsOfType);
    size += itemsOfType.Count;
}

相关问题