Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 找到最有价值的算法组合?_Algorithm_Linear Programming - Fatal编程技术网

Algorithm 找到最有价值的算法组合?

Algorithm 找到最有价值的算法组合?,algorithm,linear-programming,Algorithm,Linear Programming,我正在进行一个小项目,需要帮助根据用户的一些输入找到最好、最便宜的门票: 在什么时段之间(开始和结束日期) 在这段时间内,你是否跳过了一个或几个日期 您每天需要使用车票多少次 有x张票。一张票可以包括: 单程票,仅限使用一次,票价5美元 定期票(每天不限乘车次数),从1天/10美元、3天/30美元、7天/45美元起,您可以任意使用 我想我正在寻找某种算法,根据时段(包括或不包括跳过日期)以及票价来确定门票的最佳组合 此外,我想还需要考虑这样的情况:对我来说,买一张比我实际需要的时间更长的定期

我正在进行一个小项目,需要帮助根据用户的一些输入找到最好、最便宜的门票:

  • 在什么时段之间(开始和结束日期)
  • 在这段时间内,你是否跳过了一个或几个日期
  • 您每天需要使用车票多少次
有x张票。一张票可以包括:

  • 单程票,仅限使用一次,票价5美元
  • 定期票(每天不限乘车次数),从1天/10美元、3天/30美元、7天/45美元起,您可以任意使用
  • 我想我正在寻找某种算法,根据时段(包括或不包括跳过日期)以及票价来确定门票的最佳组合

    此外,我想还需要考虑这样的情况:对我来说,买一张比我实际需要的时间更长的定期票是一个更好、更便宜的结果,但根据我每天乘车的次数,它更便宜

    更新(基于Petr建议…)


    假设您将所有数据存储在某个天数数组中,并且每天都会记录下当天的乘车次数

    旁注:我将放宽持续时间24小时的票证条件,并假设每个定期票证都适用于该日期(即不从15:00开始,持续到第二天14:59)。这可以通过将其视为小时时间单位而不是天来解决

    次优解决方案:
    现在,让我们将当天购买单程车票的成本分配给所有日子,然后开始迭代数组,检查是否可以用更便宜的车票替换其中的一些车票。当没有进行任何更改时,您将完成。这里的问题是,您可能会错过最佳解决方案。您可以分配两张3天票(1-3天和7-9天),其中一张7天票(2-8天)和两张1天票更好

    树解决方案:(叶子中的数据)
    树选项是将其排列在树中,每个子树都包含该子树的最佳解决方案。然后,当考虑到遗漏部分的根的值时,每个子树根可以检查使用票据“覆盖”子树的一部分是否有用。

    也许排名树会在这里派上用场。

    您可以使用动态规划方法解决这个问题

    首先,为了简化算法,让我们为每个
    l
    计算可用于连续
    l
    天的最便宜单张票。例如:1天$10,2天$30(买一张3天的票,只使用2天),3天$30,4-7天$45,等等(显然会有一些最大值
    l
    ,超过这个值就没有这样的票了。)将这些结果表示为
    成本[l]

    现在主要解决动态规划问题。对于[
    begin
    end
    ]范围内的每个日期
    i
    ,计算
    ans[i]
    =至少从
    begin
    i
    的最小购票成本

    假设您已经计算了date
    i
    之前的所有值,那么date
    i
    的计算很简单。您需要一些在
    i
    日结束的票。假设它涵盖了
    l
    天的长度,那么最后一张票的价格将是
    cost[l]
    ,您还必须涵盖从
    begin
    i-l
    的天数,这将花费
    ans[i-l]
    (如果
    i-l
    begin
    之前,则为零)。因此,对于给定的
    i
    迭代所有可能的
    l
    s,并找到使解决方案最小化的方法

    这为您提供了
    O(NL)
    解决方案,其中
    N
    是天数,
    L
    是单个票据的最大跨度


    所有这些都假设每个被勾选的日期都是连续的几天。比如说,如果它涵盖了24个完整的小时(从购买的时间到第二天的同一时间),那么只需计算每个小时的答案。

    从我的例子来看,根据@Petr所说的,我真的不知道它如何解决这种情况,例如,这段时间涵盖了8天(每天两次旅行),结果如下:

    -- getCheapestTicket --
    DAYS TO COVER: 8 / TRIPS: 2
    TICKET: single / Units to cover days: 16 / Sum: 80 / Period: -1
    TICKET: 1 day / Units to cover days: 8 / Sum: 80 / Period: 1
    TICKET: 3 days / Units to cover days: 3 / Sum: 90 / Period: 3
    TICKET: 7 days / Units to cover days: 2 / Sum: 90 / Period: 7
    CHEAPEST TICKET: 1 day / PRICE PER UNIT: 10 / SUM: 80
    
    它应该给我这个组合的结果:

    7 days, $45
    1 day, $10
    
    或者这就是你所说的“(很明显,会有一些l的最大值,超过这个值就没有这样的票证了。)”


    如果能得到关于你想法的另一轮解释,那真是太好了

    请为您的问题提供示例输入和输出。你也应该读一些关于动态编程的书——闻起来像是一个很适合它的问题(尽管我不是100%确定,因为我不完全理解这个问题),我不确定我是否遵循了。根据你的建议,请看一下我的第一步。如果你看一下我的例子,你能给出一个更具体的答案吗?
    7 days, $45
    1 day, $10