`

关于区间比例算法的实现总结

阅读更多
一:区间find/call选取(重量范围与运费)
PROFIT = {
    0...10 => ->(o){ 50 },
    10...30 => ->(o){ 40 },
    30...50 => ->(o){ o },
    50...200 => ->(o){ o * 0.5 },
    200...1000 => ->(o){ o * 0.4 },
    1000..BigDecimal::INFINITY => ->(o){ o * 0.3 }
  }

  def compute_profit_price
    result = PROFIT.find { |k, _| k.include? import_price }
    self.profit_price = result[1].call(import_price).to_d.ceil(2)
    self.save
  end


二:eval哈希表获取(金额范围与奖金点数)
GROSS_RATE =
 {"trader_grade_general" => [[" _ < 10000",0],
  ["10000 <= _ && _ < 15000",0.03],
  ["15000 <= _  && _ < 20000",0.05],
  ["20000 <= _  && _ < 25000",0.07],
  ["25000 <= _ && _ < 30000",0.09],
  ["30000 <= _  && _< 35000",0.11],
  ["35000 <= _  && _< 40000",0.13],
  ["_ >= 40000",0.05,40000]],
 "trader_grade_high" => [[" _ < 10000",0],
  ["10000 <= _ && _ < 15000",0.04],
  ["15000 <= _  && _ < 20000",0.06],
  ["20000 <= _  && _ < 25000",0.08],
  ["25000 <= _ && _ < 30000",0.1],
  ["30000 <= _  && _< 35000",0.12],
  ["35000 <= _  && _< 40000",0.14],
  ["40000 <= _  && _< 45000",0.16],
  ["45000 <= _  && _< 50000",0.18],
  ["_ >= 50000",0.06,50000]] }

  AMOUNT_RATE = 
  [["_ < 500",0.01],
  ["500 <= _ && _ <2000",0.009],
  ["2000 <= _ && _ <5000",0.008],
  ["5000 <= _ && _ < 10000",0.007],
  ["10000 <= _ && _ <50000",0.006],
  ["50000 <= _ && _ < 100000",0.005],
  ["100000 <= _ && _ < 500000",0.004],
  ["_ > 500000",0.003]]	



# 销售金额毛利
  def self.get_gross_rate(trader_type,amount)
    return_rtb_rate = 0
    base_trpe = GROSS_RATE[trader_type] || GROSS_RATE["trader_grade_general"]
    base_trpe.each_with_index do |rtb_rate,index|
      _ = amount
      if eval(rtb_rate[0])
      	case_amount = (index + 1 == base_trpe.size) ? (amount - rtb_rate[2]) : (amount % 5000)
        return_rtb_rate += rtb_rate[1] * case_amount
        break
      else
        return_rtb_rate += rtb_rate[1] * 5000
      end
    end
    return return_rtb_rate
  end


  # 毛利奖金
  def self.get_amount_rate(amount)
    return_rtb_rate = 0
    AMOUNT_RATE.each do |rtb_rate|
      _ = amount
      if eval(rtb_rate[0])
        return_rtb_rate = amount * rtb_rate[1]
        break
      end
    end
    return return_rtb_rate
  end


三:基于数据库的模型设计(产品包装范围与报价费用)

#数据库序列化字段记录
{:levels=>"24.999-49.999,49.999-99.999,99.999-199.999,199.999-499.999,499.999-", :prices=>"48,46,42,41,37", :area_prices=>""}
{:levels=>"2.999-99.999,99.999-499.999,499.999-", :prices=>"53,50,46", :area_prices=>"53,50,46"}


def price_of_package(package, package_unit, area = nil)
    return nil if self.rules.blank?
    return nil if !eval(self.rules).is_a?(Hash)
    price = nil
    #包装单位转化
    converted_package = convert_unit(package, package_unit, self.package_unit, self.direct_ship_chemical&.density)
    return nil if converted_package.nil?

    arr_levels = eval(self.rules)[:levels].split(',')
    arr_prices = eval(self.rules)[:prices].split(',')
    if area.present? && self.areas.present? && self.areas.include?(area)
       arr_prices = eval(self.rules)[:area_prices].split(',')
    end

    #散装包装
    if self.bulk_package?
      arr_levels.each.with_index do |p, i|
        arr_p = p.split('-') # 10-20 or 500-
        if converted_package > arr_p[0].to_d && ( (arr_p[1].present? && converted_package <= arr_p[1].to_d) || arr_p[1].blank? )
          price = arr_prices[i].to_d and break
        end
        # 如果超出所设置的最大包装,则取最大包装的价格
        if p == arr_levels.last
          price = arr_prices[i].to_d and break
        end
      end
    elsif self.buyout_package?
      #标准包装
      ls = arr_levels.sort{|x, y| x.to_f <=> y.to_f }
      ps = arr_prices.sort{|x, y| x.to_f <=> y.to_f }
      level_prices = ls.map.with_index{|x, i| [x.to_f, ps[i].to_f]}
      result = level_prices.select{|p| p[0] >= converted_package }
      price = result.present? ? result.first[1] : nil
    else
      # 1.超过最大包装,且是最大包装整数倍, 取最大包装 * 倍数
      # 2.小于最大包装,取区间内最大值的价格
      ls = arr_levels.sort{|x, y| x.to_f <=> y.to_f }
      ps = arr_prices.sort{|x, y| x.to_f <=> y.to_f }
      level_prices = ls.map.with_index{|x, i| [x.to_f, ps[i].to_f]}
      min = level_prices.first
      max = level_prices.last
      if converted_package > max[0]
        return nil if max[0] == 0
        price = converted_package * (max[1] / max[0])
      elsif converted_package < min[0]
        price = nil
      else
        front = level_prices.select{|p| p[0] <= converted_package }.last
        back = level_prices.select{|p| p[0] >= converted_package }.first
        if front[0] == back[0]
          price = front[1]
        else
          if converted_package <= (front[0] + back[0]) / 2.to_f
            price = converted_package * (front[1] / front[0])
          else
            price = converted_package * (back[1] / back[0])
          end
        end
      end
    end
    price
  end


四:设计一张整表和序列化字段存储的利弊

序列化字段,便于设置和存储。(需要程序代码反解析)
整表便于统计,和配置追加。(extra方案)
 serialize :extra, Array

 def compute_price(amount, extra_hash = {})
    extra_hash.stringify_keys!

    if self.contain_max
      range = { 'min-lte': amount.to_d, 'max-gte': amount.to_d }
    else
      range = { 'min-lte': amount.to_d, 'max-gt': amount.to_d }
    end

    query = range.merge(extra_hash.slice(*extra))
    charge = self.charges.default_where(query).first
    if charge 
      charge.subtotal = charge.final_price(amount)
      charge.default_subtotal = charge.subtotal
    else
      charge = self.charges.build
      charge.subtotal = 0
    end
    charge
  end


#serves记录费用类型,serve_charges记录费用类型区间
#serve_charges:中的nation/zone/danger等字段用serves的extra序列化字段反解析匹配。

create_table "serve_charges", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.bigint "serve_id"
    t.decimal "min", precision: 12, scale: 4, default: "0.0"
    t.decimal "max", precision: 12, scale: 4, default: "99999999.9999"
    t.decimal "price", precision: 10, scale: 2
    t.string "type"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "nation"
    t.string "zone"
    t.string "danger"
    t.string "is_use_courier"
    t.string "good_type"
    t.string "incoterms"
    t.decimal "base_price", precision: 10, scale: 2, default: "0.0"
    t.index ["serve_id"], name: "index_serve_charges_on_serve_id"
  end

  create_table "serves", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string "type"
    t.string "unit"
    t.string "name"
    t.string "scope"
    t.boolean "verified", default: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "default", default: false
    t.boolean "overall", default: true
    t.string "extra"
    t.boolean "contain_max", default: false
    t.string "deal_type"
    t.bigint "deal_id"
    t.index ["deal_type", "deal_id"], name: "index_serves_on_deal_type_and_deal_id"
  end
0
0
分享到:
评论

相关推荐

    PID算法的原理与单片机上的实现(最易理解)

    #### 四、基于单片机的PID算法实现 在单片机上实现PID控制算法,主要包括以下几个步骤: 1. **初始化参数**:设置比例、积分和微分系数\(K_p\)、\(K_i\)、\(K_d\),以及控制周期\(T\)。 2. **采集数据**:定期采集...

    PID的C语言算法实现

    总结来说,PID算法的C语言实现涉及到对控制对象的理解、算法离散化、参数整定以及编程技巧。掌握这些知识点对于从事工业控制和自动化领域的研发人员来说至关重要,因为它不仅能够解决常见的控制问题,还能够提供系统...

    MATLAB算法实战应用案例精讲-黄金正弦算法-GoldSA-MATLAB实现源代码

    总结来说,MATLAB中的黄金正弦算法(GoldSA)是一种基于黄金分割比例的优化技术,适用于非线性优化问题。通过理解算法原理并熟练运用MATLAB编程,我们可以解决实际工程和科研中的各种优化挑战。提供的源代码是实现这...

    黄金搜索算法动态实现

    这种方法基于黄金分割比例(约等于0.618)来缩小搜索区间,从而逐步逼近函数的极小值点。在实际应用中,该算法被广泛应用于优化问题、工程设计等领域。 #### 算法原理 黄金分割搜索算法的核心思想是通过两个测试...

    推荐ABTest的实现策略总结

    流量切分的实现可以通过一致性hash算法来保证流量的均匀性和随机性,然后将流量切分对象全集看作是一个区间段,最后将一致性hash结果对应到区间段上面,实现流量切分的过程。 5. 实验设计 在进行ABTest实验时,...

    大数据-算法-比例优势模型结合多重插补在区间删失数据中的应用.pdf

    这篇论文主要探讨了在大数据背景下,如何利用算法处理区间删失数据的问题,特别是结合比例优势模型(Proportional Odds Model, POM)和多重插补(Multiple Imputation, MI)方法进行数据分析。以下是对论文中涉及...

    asp.net做的大转盘,自己写的概率算法

    比如,可以将0到99映射到五个奖项,根据概率比例划分每个区间。 代码实现可能如下: ```csharp int totalWeight = 100; // 总概率 int[] weights = { 10, 20, 30, 25, 15 }; // 各奖项概率 int randomIndex = new ...

    遗传算法经典MATLAB代码

    本文将以一个具体的遗传算法MATLAB代码为例,详细介绍遗传算法的基本原理及其MATLAB实现。 #### 二、遗传算法基础知识 在深入讨论MATLAB实现之前,我们先来了解一下遗传算法的基本概念: 1. **编码**:将问题的解...

    算法上机作业

    总结,这个作业不仅涉及到基础的算法设计,如快速联合算法,还包含了概率模拟和统计分析,旨在提高学生的算法实现能力、问题解决能力和数据分析能力。同时,它也强调了算法在解决实际问题中的应用,如通过编程模拟...

    机器学习算法的总结,欢迎下载浏览观看

    SVM通过构造最大间隔超平面来实现分类,可以有效地处理高维数据,并且对于非线性问题,可通过核函数实现非线性映射。在实际应用中,SVM经常与网格搜索(grid search)和交叉验证(cross-validation)结合,用于模型...

    Genetic-Algorithm_matlab_遗传算法_

    以下是对MATLAB遗传算法实现及其相关知识点的详细说明: 1. **遗传算法基础**: - **编码**:遗传算法中,解决方案通常被编码为二进制或十进制的串,称为染色体。 - **初始种群**:算法开始时生成一个随机的初始...

    一维搜索 Matlab实现

    总结来说,这两种一维搜索算法在Matlab中的实现都有效地找到了函数的极值点。斐波那契法在精度上表现更好,而黄金分割法则在搜索次数上具有优势。实际应用中,选择哪种方法取决于对精度和计算效率的需求。对于更复杂...

    数据与算法课程:18 随机算法.pdf

    随机算法的设计简单,易于实现,特别是在面临多种选择时,随机方法往往比寻找最优解更高效。这类算法的核心在于生成随机数,真实计算机中无法生成真正的随机数,而是通过伪随机数生成器来模拟随机性。线性同余法是...

    遗传算法工具箱Gatbx

    总结起来,这个实例展示了如何利用遗传算法工具箱Gatbx求解一元函数优化问题,通过设定合适的参数和合理的算法流程,我们可以找到给定函数在特定区间内的最大值。对于更复杂的优化问题,遗传算法同样能提供有效的...

    cordic算法和切比雪夫逼近算法计算三角函数、反三角函数以及指数函数

    总结起来,Cordic算法和切比雪夫逼近算法是两种用于FPGA实现三角函数、反三角函数和指数函数计算的有效方法。Cordic算法以其迭代结构和简单的操作适合硬件实现,而切比雪夫逼近则提供了一种通过多项式逼近来获取高...

    应用GA和PSO算法求解10城市TSP问题

    通过MATLAB编程实现GA算法,并得到如下结果: - **最优解**:H-I-J-B-C-A-D-E-F-G,总距离为269.0671 km。 - **收敛情况**:算法在约300次迭代后收敛至最优解。 #### 三、PSO算法求解10城市TSP问题 ##### 3.1 PSO...

    GAOT工具箱 遗传算法工具箱

    总结来说,GAOT工具箱是一个强大的遗传算法实现平台,它不仅提供了高效的计算性能,还具备高度的定制性和灵活性,对于MATLAB用户来说是一个不可多得的优化工具。通过深入理解和熟练运用GAOT,用户可以更好地利用遗传...

    基于python的HOG特征提取算法代码设计与实现

    总结,HOG特征提取是计算机视觉中的重要工具,通过Python的OpenCV库,我们可以方便地实现这一算法,并将其应用于各种图像处理任务。通过深入理解HOG的工作原理和优化方法,我们可以更好地利用它来解决实际问题。

    遗传算法实例

    在给定的文件中,遗传算法被用于寻找函数 `f(x) = 10 * sin(5x) + 7 * cos(4x)` 在区间 [0, 10] 内的最大值。为了简化问题,变量 `x` 被编码为10位的二进制数,这意味着 `x` 的取值范围被离散化为 `[0, 1023]`,对应...

Global site tag (gtag.js) - Google Analytics