首页 > 其他分享 >一文彻彻底底弄懂优化问题

一文彻彻底底弄懂优化问题

时间:2023-10-05 19:55:05浏览次数:40  
标签:问题 一文 弄懂 试卷 邻域 最高分 彻彻底底 搜索 优化

       优化问题,几乎可以涵盖方方面面,例如:如何配比使得化学配方效果最好、成本最优,如何组合用料使得用料最少,如何安排行车路线使得距离最短(TSP问题)、如何装载使得空间利用率最高(FTP问题、背包问题)等等。优化问题普遍来说都是NP难题,关于NP难题的数学定义这里不做赘述,只需知道NP难题在数据规模比较大时难以在有限时间内求解。

        优化问题的官方定义为在某些约束条件下,决定某些可选择的变量应该取何值,使所选定的目标函数达到最优的问题。如果你觉得这话不好理解,可以参考我的解释:在有限制、有约束的情况下,从解的值域(也就是此问题所有可能取到的值)中,通过一定的方法,尽可能的搜索出最大值(或最小值)。解的值域通过解的评价函数取得,稍后会有对评价函数的解释,见例2。几乎所有的优化问题都可以套入这句话中,下面结合几个实例来参考。

例1:了解优化问题的基本思路

      首先想象一个篮子,篮子里有打乱的十个数字1-10,我们现在的任务是从篮子中,搜索得到这十个数中除10之外最大的一个数值。计算机如何取?是不是直接把十个数字直接放入CPU中,一一比对就能轻易取得?对的,这不难想,这种方法叫做暴力求解。现在把我的这句话套进来。在有限制、有约束的情况下(除10之外),从解的值域中(1-10),通过一定的方法(暴力求解),尽可能的搜索出最大值(9)。

例2:了解评价函数在优化问题中的作用

       现在,想象篮子里有十张卷子,卷子是打乱的,并且卷子尚无打分,从中找出除了小明同学之外的最高分。如何找到呢?没错,指定一套评分标准,对试卷进行一一评价,再进一步比对找到最高分。这套评分标准就是评价函数,通过评分标准可以获得卷子分数(0-100分区间的任意值),0-100就是值域。例1之所以不引入评价函数是因为有直观的数值,仅仅是举例用。

       我们依然使用暴力求解,套入进来:在有限制、有约束的情况下(除小明同学之外,小明同学对不起),从解的值域中(0-100),通过一定的方法(暴力求解),尽可能的搜索出最大值(最高分97)。评价函数是对解的结构进行评价,计算出一个数值,有了数值之后,才能进行比对,优化,找到更好的答案。那它与目标函数有什么区别呢?可以理解目标函数是在经过评价函数评分之后的一堆数值中寻求最大最小值的函数。先有评价函数,后有目标函数。先有一群人的分数,后才能找到优秀的第一名同学。

       然而,现实中的问题一定是复杂的,我们不能总是通过暴力求解来求解答案,假如现在篮子里共有一亿张试卷,单纯暴力求解,那搜寻得到最高分的过程一定是漫长的,并且计算机不一定能计算完。可是,这难不倒聪明的人类,见例3。

例3:了解邻域、启发式搜索思想

       假设试卷共有十道选择题,观察篮子里的试卷发现,卷子的答案结构之间存在一定的规律。比如甲的答案AAAAAAAAAA,与乙的答案BAAAAAAAAAA之间,经过评分之后得到的分数之间只有一分差距,与之相比丙的答案BBBBBBBBBB,得到的分数一定与其相差甚远。这种情况称之为乙在甲的邻域中,以此类推,甲的邻域还有丁的答案AAAAAAAAAB等。凡是与甲的答案结构只有一个选择题之差的答案类型,我们都可以称之为甲的邻域。我们可以顺着这个方向进行搜寻,不再暴力遍历所有的试卷,而是一个邻域一个邻域的搜索,只评阅部分试卷,选出较为优秀同学,这种方法叫做启发式搜索。仅仅是甲的邻域,也会有很多试卷,我们从中随机选出一些,找出当中的最高分戊,再从戊的邻域中随机选出一些试卷,找出比戊分数更高的试卷,不断迭代这一过程,所搜索到试卷的分数就会越来越高,不断逼近最高分。

       套入到我们的理解中,在有限制、有约束的情况下(除小明同学之外),从解的值域中(0100),通过一定的方法(启发式搜索),尽可能的搜索出最大值(最高分95)。为什么这里写95呢,例2中我们明确知道有一最高分97,经过暴力求解一定可以找到,但是例3中,试卷太多了,无法做到把每一张试卷拿出来评分比对,只能使用启发式搜索查找局部的最高分,并且十分可搜索到97也跟你启发式搜索算法的设计,参数的选择有很大关联。所以才会在黄字中标出尽可能,而不是直接找到最高分。

       这里列举一些常见的启发式搜索算法,感兴趣可以自行了解:A*算法、贪心算法、爬山法、大邻域搜索算法、蚁群算法、禁忌表搜索算法等。

例4:了解TSP问题、插入算子

       TSP问题属于优化问题的入门问题,来看定义:TSP问题又称旅行商问题,是指给定平面上N个点及每点的坐标,求一条路径,遍历所有的点并回到起点,使这条路径长度最小。

       TSP问题是一个组合优化问题(组合优化问题是优化问题的一个分支)。该问题可以被证明具有NPC计算复杂性,也就是第一段说的难以在数据规模比较大时被求解出来。

       这种问题的求解方法也是启发式搜索算法,现举一个五个数据的例子,空间中有ABCDE五座城市,旅行商从A城市出发,为BCDE城市送货,最终回到A点,如何组合送货顺序使得旅行商的旅行距离最短。也许你首先还是会想到暴力组合,可以,稍加思考就能得到计算机只需排列4!次就能求解答案,但是如果给48个城市送货呢?给100个城市送货呢?那么需要排列100!次,用计算器计算100!的数值就会知道这是一个天文数字,那么实际的计算时间开销一定十分大。解决方法就是上文提到的启发式搜索,我们只寻求局部最优解,不寻求全局最优解,那么就有可能找到一个比较合适的答案。将BCDE初步组合起来,寻找它的邻域,这里使用插入算子作为搜索邻域的方法。

       搜索邻域的方法:在例3中,搜索邻域的方法是改变某一个答案(这是我们自定义的,是为了直观理解),例4中搜索邻域的方法是插入算子(这是常用的一种找寻组合优化问题邻域的方法)。

       新名词,插入算子:随机选取一个字母,将其插入到随机位置。如我随机抽到了B,将其随机插入到位置3,那么旅行顺序BCDE就变为旅行顺序CDBE,凡是使用一次(注意看是使用一次)插入算子之后得到的新的旅行顺序都可以称之为在BCDE的邻域中(是BCDE邻域,邻域理解见例3)。之后就是从邻域中根据评价函数(这里的评价值就是组合了BCDE顺序之后旅行商走过的距离大小)搜索出一个旅行顺序,再从新的旅行顺序中寻求新的解,最终得到一个合适的局部最优解,就是旅行商最终要选择的旅行顺序。

       看到这里,优化问题的基本逻辑就清楚明了了,你可以自行将TSP问题组合成以下形式:在有限制、有约束的情况下(),从解的值域中(),通过一定的方法(),尽可能的搜索出最大值()。

       欢迎批评指正,点赞~~

 

标签:问题,一文,弄懂,试卷,邻域,最高分,彻彻底底,搜索,优化
From: https://www.cnblogs.com/awangkuo/p/17739807.html

相关文章

  • 彻底弄懂ip掩码中的网络地址、广播地址、主机地址
    本文为博主原创,转载请注明出处:概念理解:IP掩码(或子网掩码)用于确定一个IP地址的网络部分和主机部分。它是一个32位的二进制数字,与IP地址做逻辑与运算,将IP地址划分为网络地址和主机地址两部分。在理解IP地址段中的网络地址、广播地址和主机地址之前,首先需要了解IP地址的构......
  • 一文搞懂HTTP跟HTTPS的区别
    ​前言当我们在网上冲浪浏览网页时,有时候会注意到一些网址的前缀是HTTPS://,而另一些则是HTTP://。那么这两种网址前缀之间有何差异呢?在我们探讨这一问题前,我们首先要了解HTTP和HTTPS的定义。什么是HTTPHTTP(HyperTextTransferProtocol:超文本传输协议),是一个应用层的协议,它基......
  • 一文搞懂MySQL事务隔离级别和实现原理
    什么是事务数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,其实不是没做,是可能做了一部分但是只要有一步失败,就要回滚所有操作。MySQL事务都是指在InnoDB引擎下,MyISAM引擎是不支持事务。假设一个网购付款的操作,用户付款后要涉及到订单......
  • “国产化率报告”都有哪些内容与指标?一文读懂
    近年来,随着中美贸易摩擦加剧,国内对于关键信息设备的国产化需求大幅增加,尤其能源电力、轨道交通、工业控制等重点行业正在加快国产化替代步伐。 创龙科技作为“国家级”专精特新小巨人企业,从2019年即开始布局国产化嵌入式工业平台,并推出全志T113-i/A40i/T3/T507-H、瑞芯微RK3568......
  • 一文搞懂Java异步编程之FutureTask(转)
    背景Java异步编程的在实际开发中经常被用到,那么异步任务执行结束如何将结果通知到主线程或者其他任务呢?本文不探讨JUC包下的各类锁实现实现的任务同步或者通知。一、Thread狭隘的讲Java创建线程的方式只有一种,就是newThread实例。Thread本身是Runnable的实现并且它定义了Runna......
  • 一文搞懂性能测试
    性能测试概念我们经常看到的性能测试概念,有人或称之为性能策略,或称之为性能方法,或称之为性能场景分类,大概可以看到性能测试、负载测试、压力测试、强度测试等一堆专有名词的解释。针对这些概念,我不知道你看到的时候会不会像我的感觉一样:乱!一个小小的性能测试,就延伸出了这么多的......
  • 一文教你理解Kafka offset
    日常开发中,相信大家都对Kafka有所耳闻,Kafka作为一个分布式的流处理平台,一般用来存储和传输大量的消息数据。在Kafka中有三个重要概念,分别是topic、partition和offset。topic是kafka中的消息以主题为单位进行归类的逻辑概念,生产者负责将消息发送到特定的主题,消费者负......
  • 一文搞定Python面试必问知识点——列表
    Python3有6种标准类型:(Number(数字)、String(字符串)、Tuple(组),List(列表)、Dictionary(字典)、Set(集合))。其中,列表是Python中最基本也是最常用的数据结构。列表中的每个元素都分配一个数字,即它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。在关于python测试开发的面试中,列表是被问及频......
  • 一文读懂Python中的全局变量局部变量和作用域
    局部变量和全局变量是面试热点通常小白在写代码时,只知道引用变量来应对一些基础的编码问题,当面试官问及局部变量和全局变量的具体细节时,就会一脸懵逼,傻傻分不清楚!其实想要彻底了解局部变量和全局变量的关系,本质是大家需要明白何为作用域!这篇文章会带大家彻底搞懂这三者之的唇齿相依......
  • 一文搞定单元测试核心概念
    基础概念单元测试(unittesting),是指对软件中的最小可测试单元进行检查和验证,这里的最小可测试单元通常是指函数或者类。单元测试是即所谓的白盒测试,一般由开发人员负责测试,因为开发人员知道被测试的软件如何完成功能和完成什么样的功能。我们熟知的Junit、TestNG、unittest、pytest就......