精华内容
下载资源
问答
  • 线性规划模型详解及实际应用反思

    万次阅读 多人点赞 2018-09-02 18:49:45
    三、实际应用 前言  这一部分写于2019.2.4.离写这篇文章已经过去5个月之久了。这个例子是本人2018年全国数学建模中应用的,最终获得了全国一等奖。现在我拿出这个例子反思以下在复杂情况时,是否可以应用线性...

    一、线性规划的定义
       线性规划一般用于求解最优化问题。线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最
    小的问题。该方法在建立方程时非常简单快速,但不利于人工计算。但随着计算机技术的发展,特别是在计算机能处理成千上万个约束条件和决策变量的线性规划问题之后,线性规划的适用领域更为广泛了,已成为现代管理中经常采用的基本方法之一。
      线性规划的中心思想:求解出符合各约束条件的目标函数最优解。因为目标函数及约束条件均为线性函数,故被称为线性规划问题。如果其中有一个公式不是线性,则不是线性规划问题。
      目标函数:根据要求的参数与各决策变量间的关系建立函数。
      约束条件:根据各决策变量间的关系写出等式或不等式及决策变量的范围。
    例如下述问题:

    某机床厂生产甲、乙两种机床,每台销售后的利润分别为 4000 元与 3000 元。生产甲机床需用 A、B机器加工,加工时间分别为每台2 小时和 1 小时;生产乙机床需用 A、B、C 三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时数分别为 A 机器 10 小时、 B 机器 8 小时和 C 机器 7 小时,问该厂应生产甲、乙机床各几台,才能使总利润最大?

    上述问题的数学模型:设该厂生产 x 1 x_1 x1台甲机床和 x 2 x_2 x2乙机床时总利润最大,则应满足:

    这里写图片描述

    其中 x 1 x_1 x1 x 2 x_2 x2称之为决策变量,(1)式被称为问题的目标函数,(2)中的几个不等式是问题的约束条件。

    二、用MATLAB求解
      
    1、MATLAB中线性规划的标准形式为:
    这里写图片描述
    (1) c T c^T cT为目标函数中决策变量的系数矩阵,例如:本题中c=[4;3]
    (2)A为约束条件中决策变量的系数矩阵,在写程序时可用a表示,例如:本题中a=[2,1;1,1;0,1;-1,0;0,-1];其中注意 x 1 x_1 x1 x 2 x_2 x2大于等于0,在程序中的写法。转化为标准形式时符号取反时,系数应乘以-1。
    (3)在约束条件中有等式时,Aep表示等式中系数矩阵,beq表示等式结果。
    (4)LB 和 UB 分别是变量 x 的下界和上界。
    (5)本题中函数形式为x=linprog(-c,a,b,[],[],zeros(2,1))。标准形式为min,而本题中求max故c取相反数。两个[]是aep和beq的位置,本题约束条件中没有等式,故不用。zeros(2,1)控制参数,表示决策变量有2个,目标值有1个。

    2.本题MATLAB程序

    c=[4;3];
    a=[2,1;1,1;0,1;-1,0;0,-1];
    b=[10;8;7;0;0];
    x=linprog(-c,a,b,[],[],zeros(2,1))
    value=c'*x
    

    结果:
    这里写图片描述
                   
                               三、实际应用

    前言
       这一部分写于2019.2.4.离写这篇文章已经过去5个月之久了。这个例子是本人2018年全国数学建模中应用的,最终获得了全国一等奖。现在我拿出这个例子反思以下在复杂情况时,是否可以应用线性规划模型(或者说,已明确线性规划模型适用,应如何建立线性规划模型)。

    问题背景

    (1)结合附件 1 给出的专用服装材料的某些参数值以及附件 2 给出的测量得到假人皮肤外侧的温度,对环境温度为 75ºC、II 层厚度为 6mm、IV 层厚度为5 mm、工作时间为 90 分钟的情形开展实验,建立数学模型,计算温度分布,并生成温度分布的 Excel 文件。
    (2)当环境温度为 65ºC、IV 层的厚度为 5.5 mm 时,确定 II 层的最优厚度,确保工作 60 分钟时,假人皮肤外侧温度不超过47ºC,且超过 44ºC 的时间不超过 5 分钟。
    (3)当环境温度为 80ºC 时,确定 II 层和 IV 层的最优厚度,确保工作30分钟时,假人皮肤外侧温度不超过 47ºC,且超过 44ºC 的时间不超过 5 分钟。

    所建模型

    针对问题二
    在这里插入图片描述
    针对问题三(双层规划模型,目标函数没有列出)
    在这里插入图片描述
    总结与反思

    1. 线性规划模型适用的情况明确 ,在问题二中已明确指出求最优厚度,因此可以确定线性规划可以应用。
    2. 看似复杂,实则简单 ,问题二中,就是建立了一个F1、F2与最优厚度的模型。由于该题各参数之间联系不明确需要推导(推导过程复杂),导致目标函数和约束条件函数过于复杂,其原理与线性规划一致。因此,我认为复杂类问题推导目标函数和约束条件是关键,但这并不影响线性规划模型的应用。
    3. 灵活运用规划类模型 ,现在有许多规划类模型(例如整数规划、双层规划、多目标规划等等)已经十分成熟,而且解决各类问题也十分方便。
    4. 复杂的规划模型,最优化求解是关键, 建立完模型不等于可以立刻得出答案,类似于双层规划模型这种,最优化求解是该模型是否良好关键。目前比较好的方法有梯度下降法、牛顿法、共轭梯度法等等,详细可见[https://www.cnblogs.com/maybe2030/p/4751804.html]。
    5. 模型是否可靠?、求解是否准确? ,这是本人到现在依然存在的疑惑,由于我也是刚刚接触建模没有多长时间,建立模型时(特别是模型复杂时)许多细节完全照搬网上的理论,对于模型的检验也没有完整的理论去检验,仅凭一面之词很难说明问题。(今后如需利用这方面知识需要注意)
    6. 模型简单,是否可以在建模比赛中使用? ,这个问题很难解答,首先我认为数学建模是为了解决实际问题,只要模型能够准确、可靠的解决问题就能给使用。其次、规划类模型是解决某类数学问题的唯一途径。
    展开全文
  • 线程池的实际应用场景

    万次阅读 2019-05-31 18:19:26
    实际应用中使用java中的线程池,我构建了一个线程数为5个线程池,然后采用分段批量提取的方式每500条为一组数据进行图片信息的提取,然后再把这些通过Threadpool的execute方法交给线程池中的线程进行处理,即充分...

    在实际应用中使用java中的线程池,我构建了一个线程数为5个线程池,然后采用分段批量提取的方式每500条为一组数据进行图片信息的提取,然后再把这些通过Threadpool的execute方法交给线程池中的线程进行处理,即充分使用了CPU硬件资源又加快了大数据情况下程序的处理效率。

    展开全文
  • 多线程的实际应用场景

    千次阅读 2020-12-07 23:59:11
    业务场景 我们公司做的是加油业务,用户可以在app上通过当前位置和目标位置来查询地图路线以及路线途径的所有加油站,路线查询会调用高德地图提供的接口,途径油站则根据返回的路线信息进行查询,所以当用户输入起始...

    业务场景

    我们公司做的是加油业务,用户可以在app上通过当前位置和目标位置来查询地图路线以及路线途径的所有加油站,路线查询会调用高德地图提供的接口,途径油站则根据返回的路线信息进行查询,所以当用户输入起始位置和目标位置点击查询后会做以下几步操作:

    1. 调用高德地图接口获取路线
    2. 根据高德地图返回的路线信息去查询途径的所有油站

    问题点

    公司发展很快,入驻平台的油站很多,当用户输入的起始地和目标地距离很远时,那么途径油站的数量会很大,单独采取普通查询库的方式会很耗时,并且途径油站的数据必须是实时的,所以无法使用缓存来提高接口响应效率。第一步是调用高德地图API,也会存在一定的延迟。那么我们应该怎么优化呢?

    为了降低接口耗时,提高用户体验,我们需要对接口实现进行优化,调用高德API我们无法优化,所以只能优化查询途径油站这部分。

    优化思路

    当油站过多时,一次查询会很耗时,所以我们可以考虑分批多线程并发的去查询,将一段很长的路线按照路径长度分成若干个条件,比如一段路径长达800km,我们可以将这800km的查询参数拆分成若干个距离较小的参数集合(ps:举例方便大家理解,实际路径规划查询都是根据经纬度、距离等多重参数进行查询的)。比如,{[0,50],[50,100],[100,150]…[750,800]},这时我们开启多个线程去并发的根据新的查询条件去查询,最后将结果拼接封装返回,从而达到降低查询时间的目的。

    虽然思路很容易理解,但是实现起来有两个需要注意的地方,我列出来看看大家有没有考虑到。

    • 根据业务场景,这里不是单纯的异步查询就可以的,而是需要所有的线程都执行完后并且组合查询结果后进行返回,所以这里需要进行同步控制。这里我们使用jdk提供的CountDownLatch同步组件实现。
    • 线程内操作需要有返回值,使用Callable接口以及FutureTask搭配实现。

    具体实现

    ​ 1.通常来说,我们定义线程需要实现Runnable接口,但是对于需要返回值的线程,就需要线程实现Callable接口了。

    @Component
    @Slf4j
    @Scope("protoType") // 这里需要注意Spring默认注入的Bean都是单例的,当前业务场景下肯定需要多个线程去执行查询操作,所以这里声明组件为protoType模式
    public class PathPlanTask implements Callable<List<Object>> {
    	// 查询参数
        private PathPlanPartQuery pathPlanPartQuery;
        
        private CountDownLatch countDownLatch;
        
        @Override
        public List<Object> call() throws Exception {
            try {
                //TODO 业务查询
                List<Object> result = queryList(pathPlanPartQuery);
                // 返回结果
                return result;
            }catch (Exception e){
                // 错误日志打印
                log.error("query PathByGasstation error!");
            }finally{
                // 类似 i-- 的操作,当减到0的时候,countDownLatch.await()就会放行,否则会一直阻塞。
                countDownLatch.countDown();
            }
        }
        
        public void setPathPlanPartQuery(PathPlanPartQuery pathPlanPartQuery){
            this.pathPlanPartQuery = pathPlanPartQuery;
        }
    
        public void setCountDownLatch(CountDownLatch countDownLatch){
            this.countDownLatch = countDownLatch;
        }
    
        private List<Object> queryList(PathPlanPartQuery pathPlanPartQuery) {
            // TODO 具体查询逻辑,这里省略
            return Lists.newArrayList();
        }
    
    }
    

    ​ 2.Callable通常和FutureTask搭配使用,通过FutureTask的get方法获取到线程的返回值。

    // 通常定义为工具类进行获取
    private static final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(8, 20, 1000,
            TimeUnit.SECONDS, new ArrayBlockingQueue<>(50), new ThreadPoolExecutor.AbortPolicy());
    
    // 业务代码
     private List<Object> queryGasInfoBaseDtoList(List<PathPlanQueryParam> queryParamList) {
            long stMills = System.currentTimeMillis();
         	// 定义线程池来进行多线程的管理,通过Util获取静态的线程池
            
    		// 定义countDownLatch,构造函数传递参数集合的size,该集合具体参数可以参考
         	// 上面举的例子,{[0,50],[50,100],[100,150]...[750,800]}
            CountDownLatch countDownLatch = new CountDownLatch(queryParamList.size());
    		// 批量查询,定义FutureTask集合
            List<FutureTask<List<GasInfoBaseResponseDto>>> futureTaskList = Lists.newArrayList();
            try {
                // 遍历查询参数集合
                for (PathPlanQueryParam queryParam : queryParamList) {
                    // 这里使用getBean方式获取。
                    PathPlanTask pathPlanTask =
                        ApplicationContextProvider.getBean("pathPlanTask", PathPlanTask.class);
                	// 设置countDownLatch
                    pathPlanTask.setCountDown(countDownLatch);
                    // 获取查询参数
                    PathPlanPartQuery pathPlanPartQuery = getPathPlanPartQuery(queryParam);
                    pathPlanTask.setPathPlanPartQuery(pathPlanPartQuery);
                    // 定义FutureTask,将定义好的Callable实现类作为构造参数
                    FutureTask<List<GasInfoBaseResponseDto>> futureTask = new FutureTask<>(pathPlanTask);
                    // 交给线程池去执行
                    poolExecutor.submit(futureTask);
                    // 添加futureTask集合
                    futureTaskList.add(futureTask);
                }
                // 这里会一直进行阻塞,直到countDownLatch.countDown()方法将创建时传递的size参数减为0后放行。
                // 这块可以保证多个线程全部执行完后进行最终返回。
                countDownLatch.await();
    			
                // 多个线程执行完后我们拼接最终结果
                List<Object> gasInfoDtoList = Lists.newArrayList();
                for (FutureTask<List<Object>> futureTask : futureTaskList) {
                    // 通过futrueTask的get方法获取返回值,当线程还在执行未返回时执行futureTask.get()会被阻塞
                    List<Object> baseResponseDtoList = futureTask.get();
                    if (CollectionUtils.isNotEmpty(baseResponseDtoList)) {
                        gasInfoDtoList.addAll(baseResponseDtoList);
                    }
                }
                return gasInfoDtoList;
            } catch (Exception e) {
                log.error("queryGasInfoBaseDtoList_err", e);
            } finally {
                log.info("queryGasInfoBaseDtoList_requestId:{},batchTimes:{},cost:{}", pointRequestOld.getRequestId(),
                    pointRequestOld.getBatchTimes(), System.currentTimeMillis() - stMills);
            }
            return null;
        }
    

    总结

    以上是我在工作中遇到的多线程实际应用的场景,总结下来就是通过线程池开启多个Callable线程去分批查询数据, 引入CountDownLatch组件来控制查询结束时机,而后利用FutureTask的get方法获取最终结果拼装返回。

    后面我会更新一些多线程的底层知识,通过源码来介绍AQS、CountDownLatch、线程池等等的工作原理,欢迎大家的关注!

    展开全文
  • 详细盘点C语言在工作中的实际应用

    千次阅读 2020-03-05 10:41:02
    今天就来给大家详细盘点C语言的实际应用。 01 可编程芯片 给大家找了几块芯片: 51单片机是电子、自动化等专业同学的必修课程。它体积大、处理能力低,虽然缺点明显了一点,但非常适合学习入门。单片机里面跑的程序...

    前两天有个大一的同学问我:为什么要学习C语言,听学长说好像要用它过国家的二级?!

    这个回答很实用,因为相关专业的同学如果过不了国家二级的话,连毕业都困难。但是C语言的作用绝非这个。今天就来给大家详细盘点C语言的实际应用。

    01 可编程芯片

    给大家找了几块芯片:

    在这里插入图片描述
    51单片机是电子、自动化等专业同学的必修课程。它体积大、处理能力低,虽然缺点明显了一点,但非常适合学习入门。单片机里面跑的程序就是C语言。我们可以通过C语言来控制硬件电路。这也体现了C语言指针的特性,单片机里面的寄存器其实就是地址,而C语言正好可以操作地址。

    在这里插入图片描述

    比51单片机更高端一些的就是ARM的CortexM系列,它的处理能力更强。虽然芯片厂家给我们提供了很多库,但是它终归还是C语言写的,运行在C语言的环境下。

    所以,给大家总结的第一条就是: C语言可以直接操作硬件,针对芯片编程可以使用C语言。

    02 操作系统

    在这里插入图片描述

    如果说再高端一点的芯片,可能就要提到ARM Cortex A系列了。比如图上的华为AI智能音箱,搭载联发科MT8516AAAA移动处理器芯片。高效节能,专为支持云端服务的智能语音助手产品而设计。MT8516配备四核心64位ARM Cortex-A35,主频达1.3GHz。

    使用Cortex A系列的芯片,就不得不提操作系统Linux。操作系统由三部分组成:bootloader、内核、文件系统。核心代码全部由C语言编写。这也体现了C语言的优势:
    可以直接操作硬件(驱动)
    执行效率高

    C语言的第二个作用: 编写操作系统(操作硬件的底层代码+内核代码)。

    03 应用程序

    图上的AI音箱是怎么通过手机控制的呢?其实中间还有一个我们看不见的服务器,手机把消息发送给服务器,服务器再转发给音箱。音箱接收和发送指令的过程也离不开C语言。所以,对于一些更注重逻辑处理的小型应用程序,也会使用C语言来编写。

    C语言是一门面向过程的语言,没有过多的UI界面,这也是为什么我们写完C语言只能在黑乎乎的界面上运行(终端)。

    服务器端的程序其实也算是应用程序,但是由于服务器端往往都是大型软件项目,C语言可用的库和框架太少,所以服务器程序一般都会选择面向对象语言,基本不会使用C语言开发。

    C语言的第三个作用: 编写运行在操作系统之上的应用程序,而且都是我们看不见的程序。

    很多专业在大一的时候就会开设C语言课程,这也相当于是大家在所有计算机语言里面的母语。没有C语言,就没有操作系统,没有操作系统,其他语言还怎么运行呢!

    所以学好C语言不仅仅只是为了过二级,生活中处处都有C语言。

    最后,推荐一下我自己的C语言视频,如果有需要的话,可以试试看。

    在这里插入图片描述

    展开全文
  • 二叉树的实际应用(应用场景)

    万次阅读 多人点赞 2019-03-20 22:22:10
    即带权路径长度最短的树),在数据压缩上有重要应用,提高了传输的有效性,详见《信息论与编码》。 海量数据并发查询,二叉树复杂度是O(K+LgN)。二叉排序树就既有链表的好处,也有数组的好处,在处理大批量的动态的...
  • 冒泡排序的实际应用

    千次阅读 2017-03-23 22:00:44
    冒泡排序的实际应用 1.小规模数据排序 如,4个数进行排序时,通常手动写6次比较的冒泡排序。 #define cs(a,b) (if(a>b){int t; t = a; a = b; b = t;}) cs(a,b); cs(b,c); cs(c,d); cs(a,b); cs(b,c); cs(a,b); 2....
  • 贝叶斯定理的实际应用

    万次阅读 2018-03-27 16:22:10
    实际上,贝叶斯定理更多的被应用在商业中,比如,一个30岁女性单身顾客在网上点开了一件商品M,那么可以根据贝叶斯定理判断,这个顾客购买商品M的可能性,从而调整价格。 根据历史数据可以计算出: P(A)= 浏览...
  • HashMap的实际应用

    千次阅读 2017-07-03 17:23:33
    原告 张三 李四 一个key 多个value 后面的value通过拼接实现 1.先实例化----String类型’  HashMap map = new HashMap 2通过for循环遍历 for (int i = 0; i  CNAnliParty party = partyArray.get(i);... 
  • k-means算法实际应用

    万次阅读 2018-03-11 17:41:29
    还提供了一些其它有趣的信息,例如从中可以定量分析出各个球队之间的差距,例如,在亚洲一流队伍中,日本与沙特水平最接近,而伊朗则相距他们较远,这也和近几年伊朗没落的实际相符。另外,乌兹别克斯坦和巴林虽然...
  • 实际应用场景下,面对多种数据降维方法,我们应该清楚地了解各降维方法的原理,熟知其优劣,将其合理地应用于需处理的问题中。下面,将从实际应用的角度,对各降维算法逐个进行优劣分析。 PCA 优点: 能够从数据...
  • 因为在前面一次博文分享中,有讲到K-means算法的实际应用场景,大家可以直接调转到那里去: 基于改进的K-means算法在共享交通行业客户细分中的应用 那篇博文使用的K-means算法是sklearn中的K-means++算法。 K-...
  • 矩阵的逆以及实际应用

    千次阅读 2017-01-28 22:56:33
    矩阵的逆以及实际应用
  • 用matlab解决实际应用

    万次阅读 2016-08-29 21:21:47
    题目一题目二遇到的问题 The input character is not valid in MATLAB statements or expressions. 解决方法:文件名2_2.m不能以数字开头 一个m文件同时画多幅图片 解决方法:在plot之前加 fugure(1), figure(2) ...
  • 朴素贝叶斯的实际应用

    千次阅读 2016-04-19 17:43:49
    关于朴素贝叶斯的来龙去脉公式推导这里不多谈,分享一下在毕业设计中如何将这一算法实际应用到预处理的过程中。 1.应用环境 需求是将爬虫的数据的content部分在预处理的环节中进行分类打上标签,可以考虑的分类方法...
  • 链表的实际应用1

    千次阅读 2015-04-25 23:44:41
    在上次的《链表的基本应用》中,大致的说明了;链表的基本算法和概念,但这也只是书面的介绍而已,而它到底怎么用连我自己也不是很清楚,所以现在在练一些可以用链表来做题的题目,做了几道题,觉得还可以,所以现在...
  • SVM(支持向量机)算法原理和实际应用

    万次阅读 2016-12-23 15:09:35
    的说法是 1 对svm有个直观的了解,最好的解释是下面这个 http://www.zhihu.com/question/21094489 ...
  • 思维导图xmind原文件下载 人工智能思维导图 人工智能学习思维导图 人工智能基础
  • AI:机器学习、深度学习在实际应用(工业应用)中的步骤流程框架、实际场景(案例)之详细攻略 目录 机器学习/深度学习场景实际应用 1、分类问题案例 2、回归问题案例 3、聚类问题案例 机器学习/深度学习应用...
  • k-means算法实际应用的一个例子

    万次阅读 2011-07-25 09:25:39
    下面,我们来看看k-means算法一个有趣的应用示例:中国男足近几年到底在亚洲处于几流水平?  今年中国男足可算是杯具到家了,几乎到了过街老鼠人人喊打的地步。对于目前中国男足在亚洲的地位,各方也是各执一词,有...
  • js闭包在实际开发中的应用

    千次阅读 2019-03-09 16:31:21
    js闭包实际开发中应用 闭包简单来说就是函数中的函数,也可以把它理解为一种现象,就是说一个函数要访问另外一个目标函数内部的变量,就要在目标函数中再定义一个函数(以此来把作用域链往下延长一段,目的就是为了...
  • 设计模式在实际开发中的应用

    万次阅读 2018-11-06 10:44:06
    我相信有些人学了设计模式,依然不知道设计模式的应用场景,感觉我们日常开发中,仅仅写些逻辑,调下接口,连接下数据库就完事儿了。感觉设计模式都被框架运用的淋淋尽致,似乎没有我们可发挥的余地了。设计模式到底...
  • 区块链实际应用中痛点

    万次阅读 2018-08-09 11:07:21
    这里主要说明区块链和实际应用结合中出现的痛点。 1、数据共识速度 区块链是由挖矿产生的区块按照时间顺序连接起来的,本身是一个可以不断增长的账本数据库。由于系统的初始设定,不同区块链产生区块的速度不...
  • ML:人工智能之机器学习ML解决实际应用问题的思路总过程(最全) 目录 详细思路结构 详细思路结构
  • 三、实际应用 原文:Real-world applications 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 概率图模型有许多不同的实际应用。 我们总结了概率图形模型的下列应用,这些只是他们许多实际应用...
  • python在实际工作中的应用有哪些

    千次阅读 2020-03-16 00:51:41
    python在实际工作中的应用有哪些 无论是工作还是生活,Python都是一个既实用又有趣的技能。 Python的应用领域广泛,下图可概括: ...
  • 单片机在实际生活上的应用

    万次阅读 2018-06-19 15:36:56
    单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,主要应用于以下七个方面:1.在智能仪表上的应用单片机结合不同类型的传感器,可实现电压、功率、频率、湿度、温度、流量、速度、厚度、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,871,463
精华内容 1,148,585
关键字:

实际应用