说明:
本报告必须由承担毕业论文(设计)课题任务的学生在毕业论文(设计) 正式开始的第1周周五之前独立撰写完成,并交指导教师审阅。
目录
摘要 ..................................................................................................... I Abstract ............................................................................................... I I 1 引言 . (1)
2多选择问题的随机算法的简介 (2)
2.1多选择问题的简介 (2)
2.2随机算法的简介 (2)
3 三个经典多选择算法的程序设计思想及仿真 (3)
3.1基于快速排序的经典算法的程序设计思想 (3)
3.1.1基于快速排序的经典算法的程序设计 (3)
3.1.2基于快速排序的经典算法仿真 (5)
3.2基于冒泡排序的经典算法的程序设计思想 (5)
3.1.1基于冒泡排序的经典算法的程序设计 (6)
3.2.2基于冒泡排序的经典算法仿真 (7)
3.3基于堆排序的经典算法的程序设计思想 (7)
3.3.1基于堆排序的经典算法的程序设计 (8)
3.3.2基于堆排序的经典算法仿真 (9)
4 三个经典多选择算法的分析 (11)
4.1 基于快速排序的经典算法分析 (11)
4.1.1 效率分析 (11)
4.1.2 时间复杂度分析 (11)
4.2 基于冒泡排序的经典算法分析 (12)
4.2.1 效率分析 (12)
4.2.2 时间复杂度分析 (12)
4.3 基于堆排序的经典算法分析 (12)
4.3.1 效率分析 (12)
4.3.2 时间复杂度分析 (12)
5 多选择问题的随机算法的实现 (13)
5.1 多选择问题的随机算法的程序设计思想 (13)
5.2 多选择问题的随机算法的仿真 (21)
5.3 多选择问题的随机算法与经典算法的比较 (22)
6.结论 (23)
致谢 (24)
参考文献 ................................................................. 错误!未定义书签。
摘要
目前在科学和工程实践中, 很多优化问题需要同时满足几个不同的目标, 这类问题被统称为多目标优化问题。在现实生活中, 很多重要的决策同样面临着多目标优化的难题, 如城市运输、水库管理、城市规划、能源分配等。所以在许多应用领域,特别是音频或视频处理等领域,最后的结果是有多个满足条件的数,所以多选择问题的概率算法研究很有意义。
本文所讨论的多选择问题的算法是一个比较具体的算法:就是要从一堆随机数中挑选出多个满足条件的数。本文中先用几种我们熟悉的经典算法来实现这个目标,然后进一步对经典算法进行改进,进而提出随机算法。由于随机算法允许算法在执行过程中随机地选择下一个计算步骤,这就使得程序运行情况会取得中间值,即是平均情况。随机算法与经典算法相比,要求效率更高,时间复杂度大大下降。
关键词:多选择;随机算法;时间复杂度
Abstract
At the present,in science and engineering practice,many optimization problems need to meet several different objects simultaneously,this kind of problem is called Multi-Objective Optimization Problem,which is called MOP for short.In our real life,there are many important strategic decisions are faced with multi-objective optimization problems.For example,city transporting,mannage reservoirs,city planning ,to distribute the power source and so on. So in many application area,especially in the area to deal with frequency or video ,the final outcome have multi-digital to satisty the needs,so the research of multi-objective optimization pro blems’random algorithms is a matter of great significance.
The multi-objective optimization problem algorithms we discussed in this article is a algorithms which is relatively specific.I will describute it as follows:you should select multi-numbers which satisty the needs form a great number of random numbers.In the article,there are many classics algorithms to realize this object,and latter the classics algorithms is improved, so we propose random algorithms.Because the random algorithms permit algrithms to select the next compute steps randomly,which make the situation is middle ,so we have a average situation.To compare with the classics algorithms,random algorithms raise the benefit,and it also decrese the degree of time-complicated greatly .
Key Words: multi-objective;random algorithm;degree of time-complicated
1 引言
多选择问题在现实生活中有着广泛的应用。在科学和工程实践中, 很多问题需要同时满足几个不同的目标, 这类问题被统称为多目标优化问题。比如城市运输、水库管理、城市规划、能源分配等。所以在对许多应用领域,特别是音频或视频处理等领域,最后的结果是有多个满足条件的数,所以多选择问题的算法研究很有意义。
现在的很多算法的每一个计算步骤都是固定的,但在本文中我们要讨论的概率算法,也称作随机算法就不是这样的。它允许算法在执行的过程中随机选择下一个计算步骤。在许多情况下,当算法在执行过程中面临一个选择时,随机性选择常比最优选择省时间,一般也是取得一个平均情况。因此随机算法可在很大程度上降低算法的复杂度。
本文中首先给出了三个经典多选择问题的算法(快速排序,冒泡排序,堆排序),随后给出了随机化算法,用随机算法对经典多选择算法进行改进,重新设计算法来提高算法效率,降低算法时间复杂度。本文中对算法的时间复杂度要求比较严格。要求它不超过k㏒n,其中k是要选出的满足条件的数的个数,n是产生的一组随机数的个数。本文对经典算法及随机化算法分别进行了仿真,并对各种算法的效率进行了分析,随机化算法的确大大提高了效率,降低了时间复杂度。
2多选择问题的随机算法的简介
2.1多选择问题的简介
在现实生活中, 很多重要的决策常常面临着多目标优化的问题, 比如城市运输、水库管理、城市规划、能源分配等。因此, 研究一种快速、稳定、有效的多目标选择的算法具有十分重要的现实意义。多选择问题就是指一个决策有多个要求,需要选择出多个符合要求的要素。而本文中是将一组随机数中多个符合要求的数挑选出来。
2.2随机算法的简介
在我们的生活中,人们经常会去掷色子来看结果,投硬币来决定行动,这就牵涉到一个问题:随机。
随机化算法是这样一种算法,它是在算法中使用了随机函数,且随机函数的返回值直接或者间接的影响了算法的执行流程或执行结果。随机化算法基于随机方法,依赖于概率大小。这种算法看上去好像是凭着运气办事,其实,随机化算法是有一定的理论基础的,比如,在[1,10000]这个闭区间里,随机1000次,随机到2这个数的几率是多大,何况1000次的随机在计算机程序中仅仅是一眨眼的功夫。由此可见,随机化算法有着广阔的前景。
3 三个经典多选择算法的程序设计思想及仿真
下面讨论从键盘上用时间种子随机产生一组数,要求编写一个算法——从这一组数中挑选出多个满足条件的数(比如:从这一组数中挑选出第2小,第5小等多个满足条件的数)。
3.1基于快速排序的经典算法的程序设计思想
基于快速排序的经典多选择算法的程序设计:算法用时间种子产生了50个三位数以下的随机数,将这组随机数放在a数组中。用一趟快速排序算法对这50个数进行排序后将整个数组中的数分成了两部分,然后从键盘上输入需要找出的若干个第几小,找每个第几小时用递归算法在其中一部分找到该第几小并输出,用这种方法找出所有要找的第几小并输出。
具体算法的实现是这样的:首先,编写出利用快速排序将a数组中的数按从小到大排序的程序:先选取a数组中第一个元素作为枢轴,附设2个指针left 和right,先从right所指的位置起向前搜索找到第一个关键字(关键字在本文中指a数组中的数值)小于枢轴的记录时,将其与枢轴记录相互交换,然后从left所指位置起向后搜索,找到第一个关键字大于枢轴的记录时,将其与枢轴记录相互交换,重复上述的两步直到left=right为止,此时枢轴左边的元素均小于或等于枢轴,枢轴右边的元素均大于或等于枢轴;如果要求的那个第几小比枢轴记录大,则应该在右边找,如果比枢轴记录小则应该在左边找,这样将所求的所有第几小都全部找到。
3.1.1基于快速排序的经典算法的程序设计
#include
#include
#include
#define A_SIZE 50
#define B_SIZE 5
int partition(int a[],int left, int right);
int QuickSelect(int a[], int k, int left, int right);
/*一趟快速排序,t为排序后枢轴在数组中的下标*/
int partition(int a[],int left, int right)
{
int pivot;
pivot=a[left];
while(left { while(left right--; a[left]=a[right]; while(left left++; a[right]=a[left]; } a[left]=pivot; return left; } /*找出a数组中第k小的数,t为第k小的数的下标*/ int QuickSelect(int a[], int k, int left, int right) { int t; t=partition(a,left,right); if(k<=t) QuickSelect(a,k,left,t-1); else if(k>t+1) QuickSelect(a,k,t+1,right); else return t; } void main() { int i; int s; int a[A_SIZE]; int b[B_SIZE]; /* 用时间种子生成50个随机数 */ srand((unsigned)time(NULL));