精华内容
下载资源
问答
  • 给你一个算法应该怎么写程序(数学建模 matlab)

    万次阅读 多人点赞 2017-08-27 13:29:52
    本文写作初衷:有个可爱的学妹问我在看到一个算法编程时步骤是什么,然而作为伪大神我,感觉并不知道怎么回答,感觉我编程就俩字死磕,错了咋办?再来一遍!不行咋办?换个写法试试!还不行?百度!不过既然人家...

    本文写作初衷:有个可爱的学妹问我在看到一个算法编程时的步骤是什么,然而作为伪大神的我,感觉并不知道怎么回答,感觉我编程就俩字死磕,错了咋办?再来一遍!不行咋办?换个写法试试!还不行?百度!不过既然人家诚心诚意的问了 o( ̄▽ ̄)o,还是说点建设性的经验。

    算法是什么?

    • 算法是处理解决问题的思路及办法,程序语言是按照一定语法把算法表达来。
    • 打个比方,你头脑里有了一套新思想,一个新发现,你可以用中文写出来,也可以用英文写出来,让大家明白。思想和发现可以比作是算法,用中文或英文可以比作是程序语言。
    • 因此核心是算法,但程序语言是实现算法的载体。在计算机等系统中,算法是处理某一问题的思路方法,而程序语言能具体表达算法从而使之运行起来通过算法需要完成的任务。

    前提假设:

    要实现的这个算法网上能搜到大量的资料,比如算法的思想是什么,使用这个算法的例子(翻书太慢,不够丰富,不推荐)。


    1. 给你一个算法,在动手编程之前,你应该把注意力放在哪里?

    算法的核心是解决问题的思路和方法,所弄明白一个算法的思路是非常有必要的(当然对于某些教材上的算法给出的步骤详细的不能再详细,不知道思路比着步骤也能编,这里不考虑)。

    比如:
    在用遗传算法解决问题时:

    1. 百度搜索遗传算法,比较多见的是百度百科,CSND博客,博客园,知乎,脚本之家的内容,也是我重点关注的搜索结果。前三者的内容相对比较系统,可以从中掌握这个算法的由来,思想,一般步骤。知乎大神的回答一般比较深入浅出,或者站在一个比较高的高度耳目一新,脚本之家给出的代码比较实用,百度知道一些论坛智库里面也会有一些有价值的回答,但是没有前面几个的思想有深度。

    2. 这里从百度百科的结果看思想:
      图片来自百度百科截图——遗传算法
      理解好这个介绍就完成了一大步(因为具体问题的具体实现不能照搬,只有思想是通用的):从这里理解了遗传算法就是仿真生物种群优胜劣汰的过程,适者生存,不适者淘汰。并且知道了这个算法的解决问题一般步骤是编码,产生初代种群,迭代演化(演化要计算个体适应度,交叉,变异,产生新的个体)
      此外还需要理解每个过程都需要实现什么功能:
      图片来自百度百科截图——遗传算法
      这里看得出整个算法的关键是构造一个迭代(不懂迭代就理解维循环),迭代的每一步需要计算种群中每个个体的适应度,优胜劣汰种群中的个体,种群中交叉运算,变异运算(是为了生成新的可行解,为寻找到初始种群里之外更好可行解提供了可能)得到新的种群

    3. 看懂了思想,知道了每步是干啥的,就可以联系我们要解决的问题思考(思考的方式大致就是要解决的问题有什么?可以对应到算法的那一部分上?这样对应后其他部分要怎么实现?):

    • 要求解的问题是最优化问题,那么个体(染色体)是不是就对应着每个可行解?
    • 适应度是不是对应着目标函数值?
    • 求得了适应度要怎么按照适应度的大小繁殖后代?(用rand函数怎么实现?)
    • 如何实现交叉运算?(不同可行解之间哪些部分可以交换,并且有益于构造出不同的可行解?)
    • 如何实现变异运算?(随机改变某些个体的某些属性的值可以吗?)
      对于这些细节有了大致的思路或者模糊的思路就可以开始尝试编写代码了
    1. 如果觉得自己的思路太模糊,可以看看别人的例子代码(如果没有理解这些算法的思想,直接看已有的代码,要看懂很困难,当然也可以从里面的循环和分支结构作为突破口,画画流程图,写一写注释,来帮助理解代码),也可以直接上手去编,遇到问题再去网上找解决方案(matlab那么杂,函数那么多,记不住的东西就要善于网上去搜)

    2. matlab编程应该熟练哪些知识?

    参考另一篇博客哪些知识点是学习matlab应该熟练掌握的?,基本功熟练,才能看到问题有想法思路(能力决定思维)


    比如针对这次数学建模第三轮训练——下料问题,假设建立了这样的模型:

    这里写图片描述

    • 可行解(切割方案)是由两个矩阵和两个向量表示的,矩阵A的每一行表示用一根5000mm长的材料切割出50种钢管的数量,由于钢管种类多达50种,如果穷举所有可能切法是困难的,所以矩阵A的行数暂定为200行,矩阵B的每一行表示用一根6000mm长的材料切割出50跟钢管的数量,同样暂定其行数为200行,列向量a的行数同A的行数一样,表示按照每种切割方法切割原材料的根数,列向量b表示按照B的每行的切割方法切割原材料的根数。
    • 目标函数是这种切割方案产生的废料的量。
    • 约束条件是每根原材料够长,切割出每种钢管数目达到需求。
      (精力有限,省去数学语言描述)

    怎么应用约束条件,是直接根绝约束条件生成可行解,还是随机生成后判断是否满足约束?前者设计困难,后者效率可能非常低下。

    1. 编写代码(本例中要遗传的个体比较复杂,就不进行编码解码,直接把80个可行解作为初始种群,相应的代价是交叉和变异不容易):
    close all;clear;clc;
    %% 数据
    AL=5000;BL=6000;
    NL=[] % 50种钢管的长度
    NN=[] % 50种钢管的数量
    %% 初始化,上面的步骤a)
    T = 1000; % 迭代1000步
    M = 80; % 种群规模
    P = []; % 种群
    for m=1:M % 初始化种群
    	temp.A = 
    	temp.B = 
    	temp.x = 
    	temp.y = 
    	P(m)=temp; % 上面需要构造一个合适的方法生成初始可行解,实现较麻烦,
    	% 我的大致思路是
    end
    %% 迭代(迭代包括个体评价,选择,交叉,变异)
    for t=1:T % 至多进化T次
    %%%%%%%%%% 个体评价,假设已有一个函数score,输入A、B、x、y,返回浪费材料的长度
    	sc = zeros(1,M);
    	for m=1:M
    		temp = P(m);
    		sc(m) = score(temp.A,temp.B,temp.x,temp.y); % 计算得分
    	end
    	% 做一个合适的变换,让浪费材料长度变为得分(适应度),这里简化了
    	sc = -sc;
    	sc = sc-min(sc)/(max(sc) - min(sc));
    %%%%%%%%%% 选择,轮盘赌算法,就是让得分对应于轮盘上扇形的宽度
    %选择50次,落到哪个扇区,对应的个体就有一个后代
    	sumsc = sum(sc);
    	csum = cumsum(sc);% 累加 a1,a1+a2,a1+a2+a3,...,sum(a)
    	oldP = P;
    	for m=1:M
    		[~,index]=find(sumsc*rand>csum);
    		if(isempty(index)) index=0;
    		P(m) = oldP(index+1);  
    	end
    %%%%%%%%%% 交叉运算,这里随机选择30对进行交叉运算,这里假设实现了交叉算子
    %across ,输入两个个体,函数交换两个个体里矩阵A,B,x,y里的部分行,列,数据
    	toex = ceil(M*rand(30,2));
    	for i=1:30
    		P(toex(i,:)) = across(P(toex(i,:)));% 两两做交叉运算
    	end
    %%%%%%%%% 变异运算,随机选取几个对象,改变A,B,x,y里的部分数据,
    %这里假设已经实现了变异算子variation
    	toch = ceil(M*rand(10,1));% 假设10个发生变异
    	for i=1:10
    		P(toch(i)) = variation(toch(i));
    	end
    end
    % 目前已经按照遗传算法的思想写出了整体骨架,细节有空再完善
    

    2021-2-10 补充
    原来鸽王竟是我自己!

    展开全文
  • 群智能算法改进思路

    2020-10-08 22:13:08
    群智能算法改进思路 ...在X′(t)X'(t)X′(t)选择上,可选方案有最优解、当前个体、均值位置、随机选出来的一个个体、甚至可以是父本和母本交叉解。而在加号另一边,可选方案就更多了,如DE两个个体差分向量

    群智能算法改进思路

    本文仅从方法论的角度来进行探讨,不涉及具体的改进方法。
    

    1.先看单个更新公式

    我们常见的群智能算法其核心无非是位置更新公式,大多更新方式都可以写作下面的公式:
    X(t+1)=X(t)+ΔX X(t+1) =X'(t)+ΔX
    所以,在这条更新公式上就大有文章可做。在X(t)X'(t)的选择上,可选方案有最优解、当前个体、均值位置、随机选出来的一个个体、甚至可以是父本和母本交叉的解。而在加号的另一边,可选方案就更多了,如DE的两个个体的差分向量作为增量;或者是以某个步长来确定大小方向;也可以像遗传算法一样,以变异的方式来产生增量。只要这个ΔXΔX是合理的,只要它能够在全局和局部范围内有效搜索,保证最终是收敛的,都可以用,无非是收敛的好坏而已。


    2.多种更新公式结合

    虽然有效设计的单个更新公式往往能够自成体系,但是也难免会有其失效的地方。再者,设计一条合理的更新公式也并不是一个简单的事情,有些更新公式表面看起来没什么问题,也可以有效收敛,但是碰到复杂问题时,因为其公式内在问题,并不能进行有效搜索。所以多种更新公式相结合是一个很自然的思路。

    光一条更新公式就有很多种实现方案了,当多种公式结合的时候,其方案数量又会几何式增加。再者,相结合的策略也是一个可研究的地方。是部分个体这种公式,另一部分个体另一种公式的形式?还是这一阶段这种公式,另一阶段另一种公式呢?抑或是类似超启发式一样根据选择来确定更新公式?当然也可以根据搜索情况动态确定更新公式。第一种是典型的多种群改进方式,在空间上划分更新方式;第二种则是在时间上划分更新方式,很多包含多条更新公式的元启发式大都采用这种策略;第三种则可以通过学习来确定在一个阶段选择一种更新方式的概率;第四种就涉及到搜索过程之中的信息利用了,将静态确定的更新方式换做动态确定,使之适用于更多问题。而对于第一种多种群改进思路又有诸多可研究之处,两部分个体以怎样的方式发挥联动作用呢?这又是一个可探索的点。


    3.对群智能算法本身缺陷进行改进

    其实到2如果改的好的话,已经能在大多数问题上表现很好了,如果更进一步算法能根据问题的不同动态做出调整的话,已经是极好的了。到此已经不是普通改进就能够解决问题了,就必须要治本了。要解决群智能算法本身的缺陷——无法确保找到的解一定是全局最优解。

    在这里插入图片描述
    这个问题解决不了,只能一定程度上缓和。要几种手段相结合,首先是能够在全局范围内进行均匀的探索,每个区域都能探索到;其次是尽可能对探索的区域进行适当的开发(邻域从小到大或从大到小均匀变化),以使尽可能准确判断出哪个区域是全局最优区域;再者要有效探索和开发,尽量不去探索重复区域,避开之前找到的极值区域,对未知区域进行探索和开发。这就涉及到空间划分、归档、禁忌、拥挤控制、分布估计等策略。


    4.群智能算法应用

    一个是优化领域,应该是应用最广泛的;也可以给个体赋予规则,然后研究多智能体的博弈;当然也可以结合生物现象研究智能系统。认知有限,只能想到这些了。


    挖坑

    后续可以把多种群改进思路做个总结。

    展开全文
  • 进腾讯一般有3次面试:第一面看基本素质,第二面看专业技能,第三面是boss决策,说在...这是第一道题:抽奖 题目 这是第一道题,题目大意是:一个商场进行一场抽奖活动,其中有两个奖项,第一个奖项A抽中概率是1/6...

    进腾讯一般有3次面试:第一面看基本素质,第二面看专业技能,第三面是boss决策,说在前面的话:牛人都是爱学习的,越是成功的人学习越是频繁。在那次商业写作课上,我遇到了那位腾讯资深面试官。

    08fc4be7e9c3084fcd1d08a052fb6de7.png

    背景

    小伙伴参加了企鹅厂的2018校招笔试,有五道大题,拿出三道算法类的题尝试着实现实现。这是第一道题:抽奖

    56ecba540edf3aec2b53b9748e52d90f.png

    题目

    这是第一道题,题目大意是:一个商场进行一场抽奖活动,其中有两个奖项,第一个奖项A抽中的概率是1/6,第二个奖项B抽中的概率是5/6;用C语言编码实现这个抽奖程序。 题目通过一个XML文档给出。

    分析

    题目相对简单,考察对随机数的应用,大概思路应该是:

    • 生成一个真随机数
    • 随机数对6取余,得到的余数一定是0、1、2、3、4、5共六个数
    • 将这六个数分成两份(A和B),其中一份只有0这一个项,其余一份有1、2、3、4、5五个项。对随机数取余后的数进行比较,看它那一份中,借此判断出本次抽奖的结果
    c44d5caf5c9f130c027470c9405dac66.png

    源代码

    a459c5c97003a31c83e4309c26665200.png

    总结

    这抽奖问题相对简单,主要考察队C语言部分函数的应用,以及对多种编程语言了解掌握能力的初步考察。

    最后,如果你想学c++可以私信小编“01”获取素材资料以及开发工具和听课权限!

    b13a11aaace39a186b67d9447a6e9400.png
    展开全文
  • 进腾讯一般有3次面试:第一面看基本素质,第二面看专业技能,第三面是boss决策,说在前面话:牛人都是爱学习,越是成功人学习越是...这是第一道题,题目大意是:一个商场进行一场抽奖活动,其中有两个奖项,...

    进腾讯一般有3次面试:第一面看基本素质,第二面看专业技能,第三面是boss决策,说在前面的话:牛人都是爱学习的,越是成功的人学习越是频繁。在那次商业写作课上,我遇到了那位腾讯资深面试官。

     

    背景

    小伙伴参加了企鹅厂的2018校招笔试,有五道大题,拿出三道算法类的题尝试着实现实现。这是第一道题:抽奖

     

    题目

    这是第一道题,题目大意是:一个商场进行一场抽奖活动,其中有两个奖项,第一个奖项A抽中的概率是1/6,第二个奖项B抽中的概率是5/6;用C语言编码实现这个抽奖程序。 题目通过一个XML文档给出。

    分析

    题目相对简单,考察对随机数的应用,大概思路应该是:

    • 生成一个真随机数
    • 随机数对6取余,得到的余数一定是0、1、2、3、4、5共六个数
    • 将这六个数分成两份(A和B),其中一份只有0这一个项,其余一份有1、2、3、4、5五个项。对随机数取余后的数进行比较,看它那一份中,借此判断出本次抽奖的结果

     

    源代码

     

    总结

    这抽奖问题相对简单,主要考察队C语言部分函数的应用,以及对多种编程语言了解掌握能力的初步考察。

    最后,如果你想学c++可以加入学习群:825414254获取素材资料以及开发工具和听课权限!(仅供粉丝交流讨论,不是学习c++的同学非诚勿扰噢!)

    展开全文
  • 进腾讯一般有3次面试:第一面看基本素质,第二面看专业技能,第三面是boss决策,说...这是第一道题:抽奖题目 这是第一道题,题目大意是:一个商场进行一场抽奖活动,其中有两个奖项,第一个奖项A抽中概率是1/6,...
  • 在弗洛伊德算法中,需要通过迭代填写矩阵的思路计算最短路径。在填写过程中有一些规律,以D0到D1为例。 D0到D1 在D1中填写时候,不加证明给出以下规律。 如果红色区域有无穷,那么无穷所对应列和行都填...
  • 一个正整数阶乘(factorial)是所有小于及等于该数正整数积,并且0阶乘为1。自然数n阶乘写作n!。 阶乘 递归实现 1. 设计递归方程 由阶乘定义(n! = n*(n-1)*(n-2)*···*1)可以明显看出其设计思路f(n...
  • tkinter库那篇博客(python笔记:可视化界面写作尝试)真是写我心力憔悴啊,其实东西并不难,就是多,然后一开始又没有找到比较靠谱官方文档,搞得我没写一个组件应用就得去看源码,然后自己写代码尝试,...
  • 这是我自己思考的一个思路写作此文目的是为了记录自己思考过程,并从思维过程探索出一些原理和感悟。我解法不一定是最优。 官方解法,是通过归纳数学规律来进行解决。虽然我也知道其中包含着数学...
  • 论文写作进度稿

    2020-04-28 16:19:36
    论文写作进度 写这篇文章目的,作为...确认写作思路:把YD002论文结构进行简化结构,然后通过对比,设计图像加密算法; 16:15 确认了映射结构,计算出了李指和pe熵,效果很好。 后续补充实验: 香农熵做一...
  • 论文思路

    2020-06-13 16:46:33
    论文的写作方法大概 题目 可简单可完整 作者 通讯 摘要 模型 每子模型在总模型中的作用 介绍数据集 实验结果 证明了 模型相比较出来的优点 关键字 子模型 关键技术 模型 领域第章 引言 背景的重要性意义...
  • 2020美赛C题解题思路(A Wealth of Data)

    万次阅读 多人点赞 2020-03-06 10:07:37
    内容全面、门类齐全,包含组队、日常训练、算法(含MATLAB代码)、建模、写作和“高校内部培训资源”等诸多方面指导!千载难逢、不容错过! —— 有条件朋友们支持一下,谢谢! 需要“数学建模国赛美赛资源包”...
  • 下班时,和部门一个专家在公园里面溜达,我就谈谈了我的思路,其实使用就是图像一个信息。相谈甚欢,很是投机,最终总结到四个字:大道至简! 当你觉得某一算法很难时,没有思路时,多想想一些朴素方法及其...
  • 【Data Structure/Algorithm】LCSS算法实现

    千次阅读 2017-12-25 14:09:42
    最近在写一个关于路网处理小论文,在写作中碰到一个问题就是,高德路网数据有很大一部分道路没有路名。因此笔者想着利用OSM上路网作为补充,看能不能进行数据补充。整理思路如下: 首先对高德路网和OSM...
  • _.findIndex 作用就是从一个数组中找到第一个满足某个条件元素,_.findLastIndex 则是找到最后一个(或者说倒序查找)。 举个简单例子: <pre><code> javascript var arr = [1, 3...
  •   在第一个……模型中,本文对哪些问题进行简化,利用什么知识建立了什么模型   在第二个……模型中,本文对哪些问题进行简化,利用什么知识建立了什么模型   3、 求解思路,使用方法、程序   针对模型...
  • 题主虽说不是大牛,勉强算是说发过论文,还希望各位大佬能够提出建议! 现来总结我所认为问题确定. 如何确定问题? 整个文章解决思路和...一方面可以从应用领域方面创新,即一个已有方法在其他领域方面应用
  • 对于剑指offer题解这系列,我的写作思路是,对于看过文章的读者,能够做到: 迅速了解该题常见解答思路(偏门思路不包括在内,节省大家时间,实在有研究需求的人可以查阅其它资料) 思路尽量贴近原书(例如书中...
  • 对于剑指offer题解这系列,我的写作思路是,对于看过文章的读者,能够做到: 迅速了解该题常见解答思路(偏门思路不包括在内,节省大家时间,实在有研究需求的人可以查阅其它资料) 思路尽量贴近原书(例如书中...
  • 本篇专题写作思路,由几个问题,逐步讨论迭代器存在价值、使用方法、以及如何转化为自身武器并真正用到日常Python中。第一个问题:什么是迭代器?迭代器,英文 Iterator,它首先是个对象,其次它是访问可迭代...
  • 对于剑指offer题解这系列,我的写作思路是,对于看过文章的读者,能够做到:迅速了解该题常见解答思路(偏门思路不包括在内,节省大家时间,实在有研究需求的人可以查阅其它资料)思路尽量贴近原书(例如书中提到...
  • 本博文主要是用机器学习的方法判断红楼梦后四十回是不是曹雪芹写的开发语言: Python3.6开发工具: numpy,matplatlib,sklearn 相关算法: SVM先放上预测结果,再慢慢分析设计步骤:一....鉴于每一个作者的写作...
  • LDA小结及在gensim中应用

    千次阅读 2017-05-06 23:43:31
    首先,感谢Rickjin《LDA数学八卦》,能兼具如此数学功底和写作功底人,着实不多。... 看完Rickjin《LDA数学八卦》,不说理解透彻,这个算法前前后后思考过程还是比较清晰。    首先,why?LDA出现
  • 不同二叉搜索树](https://leetcode-cn.com/problems/unique-binary-search-trees/)**By Jalan**知识工具需求数据结构和算法题解第思路预期时间复杂度编写用时代码CPP运行用时结尾 知识工具需求 数据结构和...
  • 查阅论文了解一下比较前沿的算法解决思路。(看了好几篇论文,找了几有意思解决方案和大家分享一下) 查阅Apache官方论坛,了解一些实际中解决应用。 专业名词:data skew、partitioning skew、reduce skew、...
  • 03 机器学习开发流程

    2018-09-23 00:12:00
    笔者的写作思路是先把机器学习的每个大分类,以及大分类下的中小分类做一个总体介绍。当后续对具体的算法模型讲解后,大家再回过头对照今天讲过的这些分类,你们会发现整个文集提供给你们的是一个完整的知识体系。 ...
  • 算法的作用是给定一个测试点,从训练集合中找出k个和该点距离最近的点,更具求解出这K个点中所属类别最多的类别当作该测试点的预测类别。 数学公式 输入数据集 x是特征向量y是对应的类别 第一根据给定的距离度量...

空空如也

空空如也

1 2 3 4 5 6
收藏数 119
精华内容 47
关键字:

一个算法的写作思路