在教学实验中,为了演示一个企业在一定时期内某种产品的订单走势,需要模拟生成一定时期内的订单。教学老师生成一系列的订单,需要选择产品、客户、订单的开始日期和结束日期,再选择一种算法。系统根据算法的预先配置,生成一系列的订单。
       综合考虑以上的需求,产生订单的过程是由开始和结束日期确定产生的订单的个数,在数学的坐标中表现为x轴上的整数点,对于每个x点产生相应的y值,这个y值就是订单的产品数量。算法的核心就是给出一个x值,求出对应的y值。计算y值需要一个公式,比如y=a*x+b,y=a*sin(b*x+c)+d,有了公式,还需要配置其中的参数,比如,a=100,b=0.3。有了参数,公式便可以成为方程式,此时给出一个x值便可以根据方程式求出相应的y值。在现实中的订单并不可能严格根据方程式来生成的,因此有可能需要一定范围内的偏差offset,即对于y值需要进行二次计算,在偏差的基础上模拟出真实的数据。
       基于以上的分析,做了以下的设计。1.定义一个接口,IDataGenerator,其中包括如下方法,setParams, getFormula,getEquation,generate。setParams方法用于向类设置一个HashMap,其中包含了所有公式需要的参数,比如对于y=a*x+b,需要有a=200,b=20,offset=10。GetFormula的作用是返回一个字符串,字符串的值为当前使用的公式,例y=a*x+b。在设置了参数setParams之后,具体的实现类就可以根据参数来形成具体的方程式,即getEquation方法,例:y=200x+20 offset=20。Generate方法是整个算法的核心实现部分,需要传入字符形式的开始日期和结束日期。2.定义一个抽象类AbstractGenerator,实现IDataGenerator接口,包含一些通用的方法,定义formula、equation、param变量,同时添加他们的get和set方法。由于子类中需要从Param中获取变量,因此在抽象类中增加了getDblValueFromParams和getIntValueFromParams方法。Generator方法首先根据开始日期和结束日期计算出以天为单位两个日期之间的时间间隔,也就是在坐标的X轴上从0开始到结束点的坐标,根据日期的长度定义一个二维数组,数组中存储字符串形式的日期和字符串形式的整数。根据数组的长度,循环计算每个日期对应的Y值,存储在数组中,最后返回数组。因此Abstract的子类需要根据算法计算出Y值,y值的计算方法需要根据相应得方程式得到,因此有一个需要被子类实现的抽象方法computeY()。由得到的y值根据生成的offset就生成的最终得y值,默认的curOffset()函数返回值为0,如果需要重新定义偏移量,可以在具体实现类中重新定义。3.定义具体的实现类,由于抽象类做了大量的工作,具体的实现类就变得相当简单,以LineGenerator为例子,在默认构造函数中设置公式,继承实现getEquation,返回具体的方程式。实现computeY()方法,在调用computeY()方法和getEquation()之前需要检查参数是否设置,computeY()方法很简单
public int computeY(long curX) {<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
       initParams();
       long result = Math.round(a *curX + b);
       return new Integer(String.valueOf(result)).intValue();
}
计算偏移量的方法也比较简单
protected int curOffset(){     
       Random rmd=new Random();
       return rmd.nextInt(2*offset)-offset;     
    }
参数a、b、offset在初始化参数的过程中赋值。
函数的使用方法如下:
       private HashMap params;
startDate = "<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2008-1-1";
endDate = "2008-2-1";
    params = new HashMap();
       params.put("a", "200");
       params.put("b", "0.3");
       params.put("c", "0");
       params.put("d", "0");
IDataGenerator generator = new LineGenerator();
generator.setParams(params);
String[][] result = generator.generate(startDate, endDate);
每增加一个新的算法,只需要实现Abstract接口便可以使用,使得程序的扩展变得相当容易。具有良好的可扩展性。文档的注释也比较全,需要源代码的同仁请自己下载,有不明白的地方或者有可以进一步改进的部分请联系本人。

转载于:https://blog.51cto.com/tianli/62939

订单×××的算法研究与实现相关推荐

  1. 基于灰色神经网络的订单需求预测算法研究

    基于灰色神经网络的订单需求预测算法研究 这灰色神经网络准确度就尼玛离谱,调试了半天还是那样,太菜了太菜了. %% 清空环境变量 clc clearload data%% 数据累加作为网络输入 [n,m ...

  2. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  3. 基于图机器学习的微生物网络关系预测算法研究

    龙亚辉预答辩公告 浏览次数:410日期:2021-03-19编辑:院研究生秘书 预答辩公告 论文题目 基于图机器学习的微生物网络关系预测算法研究 答辩人 龙亚辉 指导教师 骆嘉伟 答辩委员会 主席 王 ...

  4. 多倍体单体型组装算法研究

    多倍体单体型组装算法研究 喻昕   [摘要]:人类已知的疾病都与基因有着直接或者间接的联系,研究不同个体间基因序列的差异对于了解人类的遗传,以及预防疾病等方面都有着重要的作用.SNP是单核苷酸多态性, ...

  5. 基于癌症基因组学数据的miRNA 功能模块识别算法研究

    题目: 基于癌症基因组学数据的miRNA 功能模块识别算法研究 摘要: 大量研究表明miRNA 的异常表达与癌症的发生.发展有关,且miRNA 通常以组合的 方式发挥其协同调控作用.因此,研究miRN ...

  6. 让更多声音参与改变,美团外卖“订单分配”算法公开

    来源:美团Meituan 本文约1800字,建议阅读5分钟 不断推动算法透明化,积极落实算法取中. 近日,我们公布了外卖配送的"预估送达时间"算法.这之后,我们收到许多网友留言,除 ...

  7. 近期活动盘点:心电数据标注系统和深度学习诊断算法研究、2019年第六届清华大学大数据社会科学讲习班...

    想知道近期有什么最新活动?大数点为你整理的近期活动信息在此: 第四期医工结合研讨会:心电数据标注系统和深度学习诊断算法研究 2019年7月11日 7月11日,"医工结合系列研讨会第四期会议: ...

  8. 《基于压缩传感的匹配追踪重建算法研究》读书笔记

    基于压缩传感的匹配追踪重建算法研究 1.压缩感知与传统数据获取和处理过程比较: 压缩感知理论表明,在对信号获取的同时,就对数据进行适当的压缩. 传统的数据获取和处理过程主要包括:采样.压缩.传输.解压 ...

  9. 图像滤镜艺术---图像滤镜晕影调节算法研究

    原文:图像滤镜艺术---图像滤镜晕影调节算法研究 本文对滤镜中常见的晕影,晕角效果的实现做了研究,具体如下: 1 晕影调整算法 所谓晕影就是给图像四个角添加暗影效果,这暗影向图像中心逐渐淡化.我们使用 ...

最新文章

  1. 一篇文章学懂Shell脚本
  2. 李开复「预见2021」:自动化成企业升级转型刚需 | AI日报
  3. java获取进程端口_查看进程的端口号
  4. Android高版本开机广播,android3.1以上,假如程序没有启动过,怎么获取开机广播呢?...
  5. c语言三目运算符_C语言中的三目运算符是啥?有何用处?
  6. C++ 内建函数对象
  7. SystemExit: 2
  8. Linux系统设置VIP(虚拟IP)的两种方式
  9. 小米路由器3开启frp
  10. Mysql批量删除大量数据
  11. 高通 NFC开发基础知识 之 “NDEF及NFC Record”
  12. 华为路由器时间同步_好用实在价格亲民 - 华为路由WS5200四核版初体验
  13. SE、ECA、CA、SA、CBAM、ShuffleAttention、SimAM、CrissCrossAttention、SK、NAM、GAM、SOCA注意力模块、程序
  14. NetToPlcSim_PLC_西门子PLC访问DEMO
  15. Ubuntu 20.04没有声音播放时出现哒哒的噪音
  16. 常用小程序开发框架浅析
  17. 程序人生:从全栈工程师看技术人生
  18. 【R语言】必学包之plyr包
  19. 物联网的主要分为几个层次,主要有什么作用?
  20. idea控制台实现彩色输出

热门文章

  1. 重定向、别名、绝对路径、相对路径 详解
  2. MySQL MHA 高可用架构
  3. 关于整合spring+mybatis 第三种方式-使用注解
  4. DM***时使用OSPF时邻居不断UPDOWN
  5. 命题模式持续在变 你变不变
  6. CISCO NAT 经典配置合集
  7. json字符串拼接 json_encode 数组带有花括号{}和中括号[]
  8. 软件工程2018第二次团队作业
  9. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)
  10. Java NIO系列教程(九) ServerSocketChannel