基于周期的价格计算算法

时间:2017-05-30 09:30:23

标签: algorithm

我正在为租赁公寓的公司创建系统。所有定价设置均基于某些时段。例如,“Junior Studio”类别中的公寓有价格期间:

30.05.2016 - 31.01.2017: 3000 EUR
01.02.2017 - Infinity: 4000 EUR

还有其他期间,如:税收,季节性价格(加/减一些百分比值),以及基于其他期间的费用。因此价格可能经常变化,例如:

31.05.2016 - 30.06.2016 (3500EUR because of some seasonal price period)
01.07-31.08.2016 (5000EUR other seasonal price period)
01.09.2016 - 31.01.2017 (3000 EUR)
01.02.2017 - 4000 EUR.

此外,如果有人想租房子,例如少于15天,则需要支付额外费用,比如15% - 这一切都是动态设置的。

现在问题出现在我们的页面上,我们应该让用户根据价格找到公寓。例如,一些用户想要找到价格在3000到4000欧元之间的公寓,并且租用公寓6个月。正如我所说,价格在这些时期可以改变5次,所以我想计算一个平均价格。

您是否知道如何实施此算法以合并所有指定的时间段?我们假设可能有500个可能的记录,因此动态计算这可能会导致性能问题。

更新

以下是一些代码,用于处理与一个建筑物的一个公寓类别相关的期间:

private RentPriceAggregatedPeriodsDto prepareRentPriceAggregator(Long buildingId, Long categoryId, LocalDate dateFrom, LocalDate dateTo, Integer duration) {
        List<CategoryPricePeriod> pricePeriods = categoryPricePeriodRepository.findCategoryPricePeriods(buildingId, categoryId, dateFrom, dateTo);
        List<SeasonalPricePeriod> seasonalPricePeriods = seasonalPricePeriodRepository.findSeasonalPricePeriods(buildingId, categoryId, dateFrom, dateTo);
        List<LastMinuteRatePeriod> lastMinuteRatePeriods = lastMinuteRatePeriodRepository.findLastMinuteRatePeriods(buildingId, categoryId, dateFrom, dateTo);
        List<TaxesDefinitionPeriodDto> taxesDefinition = taxesDefinitionService.findTaxPeriodsForBuildingAndCategory(buildingId, categoryId, TaxTypeCode.VAT,
                dateFrom, dateTo);
        Optional<SurchargePolicy> surcharge = surchargePolicyRepository.findForDurationAndRentalObjectCategoryIds(categoryId, buildingId, duration);

        return new RentPriceAggregatedPeriodsDto(pricePeriods, seasonalPricePeriods, lastMinuteRatePeriods, taxesDefinition, surcharge);
    }

根据所有这些期间,我准备了唯一价格周期列表:dateFrom, dateTo, currency, value。在这些步骤之后,我列出了一个类别的独特价格。然后,我需要计算每个独特价格周期中的预订天数并将其乘以,可能是圆形+乘以税,并将其相加以得到预订的最终价格。现在重新运行这些步骤,比如500次(多个建筑物中的多个类别)。

2 个答案:

答案 0 :(得分:1)

如评论中所述,动态平均6次数量500次不应导致任何性能问题。

即便如此,如果您想要O(1)性价比计算(即计算不应取决于上述期间的价格转换次数),您可以通过将日期定义为第0天,并计算除此之外的所有日子所需的总租金金额。当用户请求一段时间之间的平均租金时,从两天中减去总租金直到第0天,给出两者之间的租金。将此除以天数将给出平均租金。您还可以根据停留时间(添加15%的费用)等添加合适的乘数。这类似于在O(1)中查找数组中两个索引之间的值之和。这不是一个内存友好的建议,虽然可以修改它以减少内存使用。

优点是给出结果的计算不依赖于价格转换的数量。但是,公寓租金的每次额外变化都会导致一些预处理。

答案 1 :(得分:1)

我认为你实际上需要两种算法。一个用于在任何给定时间表示和查询对象价格。另一个用于计算在给定时间段内租用物品的价格。

至于对象价格的表示,您应该决定要支持的时间粒度,例如天或月。然后创建查找表或决策树,神经网络或任何内容,以查找给定对象或对象类在给定日期或月份的价格。您可以考虑您希望拥有的所有变量。如果您想支持租用完整日历月的特殊价格,请为此不同的粒度提供另一种数据结构,您可以使用月份而非日期查询。

然后,给定一段时间,您需要生成相应的日期或月份系列,查询每日或每月的个人价格,然后计算总和以获得总价。如果您愿意,您可以计算平均每日/每月价格。

我认为表演不会成为问题。在提出实际解决方案之前,至少不应该解决任何问题(因为,过早优化)。如果是,请考虑扩展数据库。