Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以最少的访问量(最有效)从FIFO位置选择项目_C#_Performance_Algorithm_Entity Framework_Neural Network - Fatal编程技术网

C# 如何以最少的访问量(最有效)从FIFO位置选择项目

C# 如何以最少的访问量(最有效)从FIFO位置选择项目,c#,performance,algorithm,entity-framework,neural-network,C#,Performance,Algorithm,Entity Framework,Neural Network,我的数据库中有一个项目列表,其中包含各个位置的库存:我使用的是实体框架和C# 公共类项目{ 公共int ID{get;set;} 公共字符串代码{get;set;} 公共整数{get;set;} 公共字符串名称{get;set;} 公共列表清单{get;set;} } 公共类目录{ 公共int ID{get;set;} 公共整数数量{get;set;} 公共位置位置{get;set;} public int LocationID{get;set;} 公共项项{get;set;} 公共int It

我的数据库中有一个项目列表,其中包含各个位置的库存:我使用的是实体框架和C#

公共类项目{
公共int ID{get;set;}
公共字符串代码{get;set;}
公共整数{get;set;}
公共字符串名称{get;set;}
公共列表清单{get;set;}
}
公共类目录{
公共int ID{get;set;}
公共整数数量{get;set;}
公共位置位置{get;set;}
public int LocationID{get;set;}
公共项项{get;set;}
公共int ItemID{get;set;}
}
公共类位置{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
例如,假设我需要:

  • 50瓶可乐
  • 100瓶百事可乐
我有(年龄、姓名-数量、位置)

  • 2,可乐-25,Loc1
  • 2、百事可乐-100、Loc1
  • 2,可乐-25,Loc2
  • 1、可乐-50、Loc3
我需要能够按照最有效的顺序对列表进行排序,该过程有两条规则:

  • 需要先挑选最老的物品(最低年龄优先)
  • 需要访问尽可能少的地点
  • 在某些情况下,会出现冲突,有一种方法可以通过访问多个项目的单个位置来提高效率,但它会留下一个旧产品,这是可以的,但它必须遵守某种阈值,该阈值由我们保存的位置访问次数或其他决定

    不管怎样,我都不知道从哪里开始编码


    如何做到这一点?

    如果我们忘记了年龄信息和项目数量,这相当于集合覆盖问题,它已经是NP难问题;增加这些额外的要求只会让事情变得更加困难

    蛮力枚举
    我可能只会尝试按位置数量的递增顺序枚举所有可能的位置集:即所有单个位置,然后是所有位置对,等等。在每个点向集合添加位置时,如果它不包含我仍然需要的项目,我会忽略它

    您所需要的是一种以增量方式生成所有子集的方法(即,这样我们就不会浪费时间考虑包含我们早期决定不需要的位置的子集),在生成每种类型时,跟踪您仍然需要的每种类型的项目数*。这有一个简单的递归;在这里搜索“生成所有子集”,或者谷歌应该会找到它。要以递增的大小顺序生成它们,您需要一个从1到| locations |的最外层循环,递归函数将获取一个额外的参数,记录剩余要添加的位置数,您最初将其设置为该循环计数器,并在每次递归调用时减少

    *注意:这实际上并不像上面所说的那么简单,因为如果我们在当前的部分解决方案中添加一个包含旧项目的新位置,我们希望能够使用这些项目,而不是我们先前选择的项目。因此,我们需要跟踪的不仅仅是我们仍然需要选择的每种类型的项目数量:我们还需要跟踪,对于每种项目类型,我们已经选择的每个年龄段的该类型项目数量。我认为最简单的方法是,在我们完成部分解决方案之前,根本不承诺选择项目;相反,我们跟踪我们访问的所有地点的项目和年龄的“池”,并在最后从中进行选择。具体地说,当我们构造一个部分解决方案时,对于每种所需的项目类型,我们都会保留一个按年龄递减顺序排序的列表(或者更好的是一个堆/优先级队列——更新速度更快),其中包含一个(年龄,可用计数)对,用于我们访问过的每个位置以及存储该项目的位置。然后,当我们完成部分解决方案的构造后,我们可以从这个列表的前面(或弹出堆)读取对,直到我们提取了足够的项;这些将是我们能从参观过的地点中得到的最古老的物品

    如何比较解决方案 在找到“最佳”解决方案之前,我们需要定义“最佳”的含义,这意味着我们需要一种方法来比较两个解决方案,看看哪一个更好——换句话说,我们需要一个有效解决方案集的顺序。对于这个问题,我们只有模糊的、相互竞争的需求,我们应该更喜欢访问少数位置的解决方案,以及使用旧项目的解决方案。这还不足以完全指定一个顺序,因此折衷办法是寻找一小部分解决方案。我认为报告每种规模(位置数量)的“最佳”解决方案是有用的——如果最多有30个库存记录,那么最多会有30个这样的解决方案,这应该是一个足够小的列表,供一个人使用

    < P >即使我们只考虑特定大小的解决方案,我们仍然没有足够的信息在问题规范中选择一个特定的顺序-是一个2位置的解决方案,使用25天的可乐项目和50天的百事可乐项目比使用50天的可乐项目和25天的百事可乐项目的2个位置解决方案更好还是更差?尽管如此,我们仍然可以在“显而易见”的情况下寻找做出正确选择的订单,例如当一个解决方案中最旧的项目比另一个解决方案中最新的项目更新时。以下两个订单都具有此属性

    按最新项目排序:到目前为止,您可以跟踪从当前部分解决方案(位置集)的某个位置获取的最新项目。最新产品越旧,解决方案就越好


    按平均项目年龄排序:有许多对大小相同的解决方案,之前的排序无法区分——具体来说,只要两个解决方案中的最新项目相同(或只是具有相同的年龄)
    public class Item {
        public int ID { get; set; }
        public string Code { get; set; }
        public int Age { get; set; }
        public string Name { get; set; }
        public List<Inventory> Inventory { get; set; }
    
    }
    public class Inventory {
        public int ID { get; set; }
        public int Qty { get; set; }
        public Location Location { get; set; }
        public int LocationID { get; set; }
    
        public Item Item { get; set; }
        public int ItemID { get; set; }
    }
    public class Location {
        public int ID { get; set; }
        public string Name { get; set; }
    }