




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上题目: 基于盲目搜索算法求解泊松分酒问题 【摘 要】分酒问题的描述在历史上有很多版本,如泊松分酒、韩信分油等。但是它们的本质都是相同的,无论是中间的转换过程中的各个杯子的容量,还是目标和初始的容量,都可以看作是网络中的一个节点。而两种状态量之间是否可以进行转换可以看作是网络中两个节点是否连通。由此原问题的是否可解、最少步数、多少种方式可以转化为网络中两个节点是否连通、最短路径、最短路径的条数的问题。对于问题一,利用盲目搜索算法,由起始点出发进行搜索,如果找到了目标节点,则停止搜索,输出结果。如果没有找到,则说明原问题不可解。对于问题二,本文通过研究各个状态之间的转换关
2、系,列写方程,通过判断方程是否有整数解来判定原问题是否可解。并通过系数的求和来判断该解是否是最优解。对于问题三,通过研究各个版本的分酒问题,发现史泰因豪斯在数学万花筒中的表述:有装有14千克酒的容器,另外有可装5千克和9千克酒的容器,要把酒平分的问题即可满足要求。并利用该问题对模型进行了检验。最终,本文对于更大规模的分酒问题提出了自己的想法和改进思路,如利用模型二,首先剔除掉不连通的点,建立一个网络拓扑图,利用蚁群算法等智能算法,求解最短路问题,得到相对最优的解。关键词:泊松分酒 盲目搜索 不定方程 蚁群算法一、问题重述分酒问题是一个十分著名的智力问题。在历史上这个问题有很多版本:泊松分酒、韩
3、信分油等。他们的原问题可以表述为三个容积不等的瓶子,如何实现将酒量等分。显然这个问题的规模较小,可以通过人工来解决,然而当问题的规模变大,手工就变得无能为力了。这就要求我们建立合适的模型来描述更大规模和一般性的问题,并利用合适的算法求解模型。请尝试从基本问题出发建立数学模型解决以下问题:问题一:现有一只装满12斤酒的瓶子和三只分别装10斤、6斤和3斤酒的空瓶,如何才能将这12斤酒分成三等份。如果进行四等份呢,结果如何?如果4个瓶子分别要求装5斤、3斤、2斤、2斤,又能否实现?试建立数学模型并设计算法,求最少经过多少步操作完成,且有多少种方式可采用最少步数完成。要求对实现方式给出详细操作步骤。问
4、题二:一般问题:设有个瓶子,每个瓶子最多装酒数量用向量表示为。现在初始各瓶子装酒为。现要实现将各瓶子装酒为。要求不凭借任何其它工具,问能否实现?若能实现,给出实现的方法,并给出充分理由说明是否是最少步数。并对你所使用的模型和算法进行分析说明。问题三:设计一个实例,要求最少完成步数不少于13步。给出从初始状态到目标状态的详细实现步骤。二、问题的分析原问题有很多个版本:版本1:日本分油问题。有一个装满油的8公升容器,另有一个5公升及3公升的空容器各一个,且三个容器都没有刻度,试将此8公升油分成4公升。.版本2:法国著名数学家泊松年轻时研究过的一道题:某人有12品脱美酒,想把一半赠人,但没有6品脱的
5、容器,而只有一个8品脱和一个5品脱的容器,问怎样才能把6品脱的酒倒入8品脱的容器中。版本3:我国的韩信分油问题:韩信遇到两个路人争执不下,原因是两人有装满10斤的油篓和两个3斤、7斤的空油篓,无法平均分出两份,每份5斤油。韩信是如何解决这个难题的?版本4:史泰因豪斯在数学万花筒中的表述:有装有14千克酒的容器,另外有可装5千克和9千克酒的容器,要把酒平分,该如何办?版本5:别莱利曼在趣味几何学中表述:一只水桶,可装12杓水,还有两只空桶,容量分别为9杓和5杓,如何把大水桶的水分成两半?虽然各个问题的表述不同,但是其本质之都是一样的。解决这一类问题一般有三种方法:作图法、尝试法和不定方程法。文献
6、1说明了三种手工求解的方法,这对于小规模问题可以解决,但是对于大规模问题就无能为力了。文献24详细解释了如何用作图法解决该类问题,直观简洁。文献56又介绍了如何用算法求解该问题,其中文献6是对文献5的一种改进。本质上原问题的最优解就是状态量之间的最短路问题,问题是否可解就是两个不同状态直接是否联通的问题。这样原问题就转换为一个网络拓扑的问题。通过参考上述文献,针对问题一,本文采取盲目搜索算法,搜索各种可能的路径,一旦得到目标状态量,就停止搜索,这时得到的结果就是问题的最优解。如果程序没有输出,则说明问题不可解。对于问题二,本文利用不定方程组来初步判定问题是否可解。问题三,通过试探,发现对于版本
7、四问题的最小步数刚好13步,达到设计的要求。三、基本假设1、假设每次倒油的时候都没有油漏掉;2、假设倒油时三个容器都不会将由留剩余容器壁上;3、假设容器都没有损坏;4、假设每次都是到空杯子或者将另一一个杯子倒满。四、符号说明符号说明 第个容器的最大容积第个容器的现存的容量第个容器向第个容器倒入的次数第个容器的目标的容量第个容器的初始的容量容器的个数五、模型的建立与求解5.1问题一模型的建立与求解5.1.1模型的建立问题一的模型较为简单。酒瓶的初始状态,最终的目标状态分别是,。中间状态的下一个状态最大可能有种。这样从初始状态开始搜索,直到搜索到目标状态,如果遍历所有可能状态都没有到达目标状态,说
8、明初始状态与目标状态之间并没有联通。遍历过程中对于已经遍历的节点不再遍历,降低算法的复杂度。5.1.2模型的求解由于每一个中间状态节点都最大有12不同的孩子节点,所以算法的整体数据结构为一个十二叉树。对于每一个节点分别计算对应的12种情况,如果状态不存在,就将该节点接入树中。如果已经存在,则不链接该节点,进行下一种情况的判断。其中,树的建立要借助于队列这一个数据结构,借助其将每一个新节点入队、处理。一旦发现目标状态节点,则停止循环,同时将目标节点以及其各个双亲节点入栈,直到初始状态节点。最终再将各个节点出栈,出栈的顺序即为倒酒过程中,各个酒杯的酒量。该十二叉树最底层叶子结点的个数即为可实现最短
9、路径的方案个数。运行程序得到结果分别为:当目标状态为其中一条最短路径为(12,0,0,0)->(2,10,0,0)->(2,4,6,0)->(2,1,6,3)->(8,1,0,3)->(11,1,0,0)->(1,10,0,1)->(1,4,6,1)->(1,4,4,3)->(4,4,4,0),专心-专注-专业总共九步。运行结果如下:当目标状态为(3,3,3,3)时,其中的一条最短路径为(12,0,0,0)->(6,0,6,0)->(3,0,6,3)->(3,3,6,0)->(3,3,3,3),总共四步。运行结果如下
10、:当目标状态为(5,3,2,2)时,没有得到结果说明,无法从初始状态到达目标状态。5.2问题二模型的建立与求解5.2.1 模型的建立分析可知,由于没有刻度,所以需要将杯子倒空或者将另一个杯子倒满。所以每一次杯子内酒量的转换量都是各个杯子的容积或者他们的差值。而且任何一个差值都可以由 的加权和来表示,即 ,其中为整数。由此我们得到系数矩阵(1)其中 可以看作为第杯向第杯倒入的次数。其中矩阵对角线上元素为0。所以,第杯中的剩余容量为。如果每一杯的剩余容量都等于目标容量,则说明问题可解。函数方程为(2)如果方程有整数解,则说明原问题有解。式中如果所有系数的和较小,说明从初始状态到目标状态的最短步数相
11、对较少。具体的最短步数和最短路径可由第一问的算法解得。5.2.2 模型的说明以日本分油问题为例,有一个装满油的8公升容器,另有一个5公升及3公升的空容器各一个,且三个容器都没有刻度,试将此8公升油分成4公升。由于只有三个容器,问题的解可以转化为一个求解二元一次不定方程的解的过程。方程为:(3)其中,。解得:。说明问题可解。利用程序得到最短路径为(8,0,0)->(3,5,0)->(3,2,3)->(6,2,0)->(6,0,2)->(1,5,2)->(1,4,3)->(4,4,0),总共7步。其中由大杯倒入中杯两次,小杯倒入大杯两次,与得到的系数一致。
12、5.3问题三模型的建立与求解5.3.1 模型的建立通过试探,运用问题二的模型,发现版本4史泰因豪斯在数学万花筒中的表述:有装有14千克酒的容器,另外有可装5千克和9千克酒的容器,要把酒平分的问题最短路径刚好为13步。其对应的不定方程为(4)最短路径为(14,0,0)->(5,9,0)->(5,4,5)->(10,4,0)->(10,0,4)->(1,9,4)->(1,8,5)->(6,8,0)->(6,3,5)->(11,3,0)->(11,0,3)->(2,9,3)->(2,7,5)->(7,7,0)六、模型的检验
13、与结果分析利用版本16的不同问题,对于模型所对应的程序进行了运行都得到了较好的结果,说明模型能够很好的适应这类小规模的问题,程序算法具有较好的适应性。并且对所求最短路径进行检验,发现每条路径都是准确无误的。七、模型的改进虽然本模型对于上述问题得到了较好的结果,但是不难发现本质上都属于小规模问题。如果问题的规模继续扩大,算法的空间复杂度和时间复杂度增长迅速,使得问题很难解决。在这里本文提出两种改进方法:1、 可以首先将一些杯子合并成为一个系统,减少杯子的总量,先解决系统之间的问题,然后在解决系统内部的问题。2、 每一个问题的可能的状态总数是确定的,可以利用模型二,首先剔除掉不连通的点,建立一个网
14、络拓扑图,利用蚁群算法等智能算法得到相对最优的解。八、参考文献1张安军. 韩信立马分油问题的三种策略J. 中学数学杂志:初中版, 2016(1).2郭俊杰, 毕双艳, 雷冠丽. 分油问题的网络最优化解法J. 吉林大学学报信息科学版, 1989(1):33-38.3任永胜. 对“分油问题”的探微J. 山西师范大学学报(自然科学版), 2014(s2):32-34.4 彭世康, 李春梅, 彭金瑾. 完整状态转移图法求三桶分油问题全部解J. 数学通报, 2015(1):56-60.5詹明清, 詹横空. 泊松分酒问题的一般解J. 电脑, 1996(9)6谭亮辉. 再谈泊松分酒问题的解法J. 电脑, 1
15、997(1).附录:#include <stdio.h> #include <stdlib.h> #include <malloc.h>#define Method 12#define OK 1#define TRUE 1#define FLASE 0#define ERROR 0#define INFESIBLE#define OVERFLOW -2#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define SElemType pstate#define QUEUE_MAXSIZE 500 /
16、最大队列长度#define QElemType pstatetypedef struct stateint data4; struct state *parent;struct state *childMethod;state,*pstate;typedef pstate SElemType;typedef int Status;typedef struct SElemType *base; SElemType *top; int stacksize; SqStack;state *newState(state *parent,int a,int b,int c,int d) state *p
17、new=(state *)malloc(sizeof(state); pnew->parent=parent; pnew->data0=a; pnew->data1=b; pnew->data2=c;pnew->data3=d; / pnew->pro=pro; for(int i=0;i<Method;i+) pnew->childi=NULL; return pnew; typedef struct pstate *base; /队列的基址 int front; /队首指针 int rear; /队尾指针SqQueue;Status Init
18、Queue ( SqQueue &q ) /初始化空循环队列 q q.base=(QElemType *)malloc( sizeof(QElemType)* QUEUE_MAXSIZE); /分配空间 if (!q.base) exit(OVERFLOW);/内存分配失败退出程序 q.front =q.rear=0; /置空队列 return OK; /InitQueue;Status EnQueue(SqQueue &q, QElemType e)/向循环队列 q 的队尾加入一个元素 e if (q.rear+1) % QUEUE_MAXSIZE=q.front) retu
19、rn ERROR ; /队满则上溢,无法再入队 q.base q.rear = e; /新元素e入队 q.rear = (q.rear + 1) % QUEUE_MAXSIZE; /指针后移 return OK; / EnQueue;Status DeQueue ( SqQueue &q, QElemType &e) /若队列不空,删除循环队列q的队头元素, /由 e 返回其值,并返回OK if (q.front =q.rear) return ERROR;/队列空 e = q.base q.front ; q.front=(q.front+1) % QUEUE_MAXSIZE
20、 ; return OK; / DeQueueStatus InitStack(SqStack &S) S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE;return OK;Status GetTop(SqStack S,SElemType &e) /若栈不为空,则用e返回S的栈顶元素if(S.top=S.base) return ERROR; e=*(S.top-1)
21、;return OK;Status Push(SqStack &S,SElemType e) /插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize)S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType);if (!S.base) exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK; Status Pop(SqStack &a
22、mp;S,SElemType &e) /若栈不空,则删除S的栈顶元素并返回eif(S.top=S.base) return ERROR;e=*-S.top;return OK; Status judgeexist(int a,int b,int c,int d,int existence1804,int existsize)int i;for(i=0;i<existsize;i+)if(existencei0=a&&existencei1=b&&existencei2=c)return 1;return 0;Status addexist(int
23、a,int b,int c,int d,int existence1804,int &existsize)existenceexistsize0=a;existenceexistsize1=b;existenceexistsize2=c;existenceexistsize3=d;existsize+=1;return 0;pstate BuildTree(pstate root,int existence1804,int &existsize,int* volume,int* last)SqQueue Q;pstate e;int i,j,k,next,temp4,chang
24、enum=0;InitQueue(Q);EnQueue(Q,root);while(Q.front!=Q.rear)DeQueue(Q,e);changenum=0;next=0;for(i=0;i<4;i+)for(j=0;j<4;j+)if(i!=j)for(k=0;k<4;k+)tempk=0;tempj=(volumej-e->dataj)<e->datai?(volumej-e->dataj):e->datai;tempi=-tempj;if(tempi=0)continue;if(!judgeexist(e->data0+temp0,e->data1+temp1,e->data2+temp2,e->data3+temp3,existence,existsize)e->childnext=newState(e,e->data0+t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 知识产权交易股权分红结算与保护协议
- 工业视觉检测系统项目实施与维护服务合同
- 基因治疗药物生产及国内外市场拓展合作协议
- 上市公司高管岗位分红权激励合作协议
- 汽车物流公司兼职货车驾驶员聘用协议
- 房改房土地性质变更房屋买卖税费减免合同
- 西班牙留学生公寓冰箱租赁服务协议
- 高效工业视觉检测算法研发与应用服务协议
- DB42-T 1998.2-2023 蛋禽笼养技术规程 第2部分:蛋鸭规模化笼养
- 汽车发动机构造与拆装 课件 任务22 排放调节装置的认识与拆装
- 2023山东能源集团建工集团有限公司机关部分岗位公开招聘8人笔试参考题库附带答案详解
- 2024年汉中市中医医院招聘笔试真题
- 超低排放改造管理制度
- 近视的防控课件
- 智能调度算法设计-全面剖析
- 超星尔雅学习通《工科中的设计思维(广东技术师范大学)》2025章节测试附答案
- 储能电站安全教育培训
- 景区游客中心培训课件
- 2025年春新人教版历史七年级下册课件 第17课-明朝的灭亡和清朝的建立
- 医政管理知识培训
- 2025年中咨工程管理咨询有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论