当前位置:文档之家› 首次适应算法实验报告

首次适应算法实验报告

首次适应算法实验报告
首次适应算法实验报告

操作操作系统大作业题目:首次适应算法分配内存

学号: 1207300142

学生姓名:张鲁云

班级:计科121

首次适应算法分配内存

一、问题描述

在内存分配中,动态分区是根据实际的进程需求,动态地为之分配空间。而首次适应算法分配时从表头指针开始查找可利用空间表,将找到的第一个大小不小于“请求”的空闲块的一部分分配给用户。可利用空间表本身既不按节点的初始地址有序,也不按节点的大小有序。用户释放内存,回收时只是将空闲块插入在链表的表头即可,此算法比较节省时间。

二、运行环境 VC6.0

三、算法思想。

首次适应算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始查找,直到找到一个大小能满足要求的空闲分区为止;然后按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲区仍留在空闲链中。若从链首到链尾都不能找到一个能满足要求的分区,则此次分配失败。

四、实验目的

在计算机系统中,为了提高内存区的利用率,必须给电脑内存区进行合理的分配。本实验通过对内存区分配方法首次适应算法的使用,来了解内存分配的模式。

五、首次适应算法分配内存算法概要

(1)结构体

Typedefstructfreearea//定义一个空闲区说明表结构

{ long size; //分区大小

long address; //分区地址

int state; //状态

}ElemType; // 线性表的双向链表存储结构

TypedefstructDuLNode

{ ElemType data;

structDuLNode *prior; //前趋指针

structDuLNode *next; //后继指针

} DuLNode,*DuLinkList;

Status Initblock(intMAX_length)//开创带头结点的内存空间链表

{ block_first=(DuLinkList)malloc(sizeof(DuLNode));

block_last=(DuLinkList)malloc(sizeof(DuLNode));

block_first->prior=NULL; //头结点的前驱指针指向空

block_first->next=block_last; //头结点的后继指针指向尾结点

block_last->prior=block_first; //尾结点的前驱指针指向头结点

block_last->next=NULL; //尾结点的后继指针指向空

block_last->data.address=0; //尾结点的地址是0

block_last->data.size=MAX_length; //分区大小是最大分区

block_last->data.state=Free; //状态是空

return OK; }

(2)主要函数说明:

void alloc();进行内存分配的功能函数。

Status free(int flag)将地址为flag的分区的内存回收。

Status First_fit(int request)创建进程空间的子函数;其中,参数request表示空闲分区链的链首指针;要配合函数alloc()使用。

void show()查看内存中的分区情况。

七、代码实现

#include

#include

#include

#define Free 0 //空闲状态

#define Busy 1 //已用状态

#define OK 1 //完成

#define ERROR 0 //出错

//#define MAX_length 640 //最大内存空间为640KB

typedefint Status;

int flag;

typedefstructfreearea//定义一个空闲区说明表结构

{

long size; //分区大小

long address; //分区地址

int state; //状态

}ElemType; // 线性表的双向链表存储结构

typedefstructDuLNode

{

ElemType data;

structDuLNode *prior; //前趋指针

structDuLNode *next; //后继指针

} DuLNode,*DuLinkList;

DuLinkListblock_first; //头结点

DuLinkListblock_last; //尾结点

Status alloc(int);//内存分配

Status free(int); //内存回收

Status First_fit(int);//首次适应算法

void show();//查看分配

Status Initblock();//开创空间表

Status Initblock(intMAX_length)//开创带头结点的内存空间链表

{

block_first=(DuLinkList)malloc(sizeof(DuLNode));

block_last=(DuLinkList)malloc(sizeof(DuLNode));

block_first->prior=NULL; //头结点的前驱指针指向空block_first->next=block_last; //头结点的后继指针指向尾结点block_last->prior=block_first; //尾结点的前驱指针指向头结点block_last->next=NULL; //尾结点的后继指针指向空block_last->data.address=0; //尾结点的地址是0

block_last->data.size=MAX_length; //分区大小是最大分区

block_last->data.state=Free; //状态是空

return OK;

}

//分配主存

Status alloc() {

int request = 0;

printf("请输入需要分配的主存大小(单位:KB):");

scanf("%d",&request);

if(request<0 ||request==0)

{

printf("配大小不合适,请重试!");

return ERROR;

}

{

if(First_fit(request)==OK)

printf("分配成功!");

else

printf("内存不足,分配失败!");

return OK;

}

}

//首次适应算法

Status First_fit(int request)

{ //为申请作业开辟新空间且初始化

DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));

temp->data.size=request;

temp->data.state=Busy;

DuLNode *p=block_first->next;

while(p)

{

if(p->data.state==Free && p->data.size==request)

{//有大小恰好合适的空闲块

p->data.state=Busy;

return OK;

break;

}

if(p->data.state==Free && p->data.size>request)

{//有空闲块能满足需求且有剩余

temp->prior=p->prior;

temp->next=p;

temp->data.address=p->data.address;

p->prior->next=temp;

p->prior=temp;

p->data.address=temp->data.address+temp->data.size;

p->data.size-=request;

return OK;

break;

}

p=p->next;

}

return ERROR;

}

//主存回收

Status free(int flag) {

DuLNode *p=block_first;

for(inti= 0; i<= flag; i++)

if(p!=NULL)

p=p->next;else

return ERROR;

p->data.state=Free;

if(p->prior!=block_first&& p->prior->data.state==Free)//与前面的空闲块相连

{

p->prior->data.size+=p->data.size;

p->prior->next=p->next;

p->next->prior=p->prior;

p=p->prior;

}

if(p->next!=block_last&& p->next->data.state==Free)//与后面的空闲块相连

{

p->data.size+=p->next->data.size;

p->next->next->prior=p;

p->next=p->next->next;

}

if(p->next==block_last&& p->next->data.state==Free)//与最后的空闲块相连

{

p->data.size+=p->next->data.size;

p->next=NULL;

}

return OK;

}

//显示主存分配情况

void show() {

int flag = 0;

printf("主存分配情况:\n");

DuLNode *p=block_first->next;

printf("分区号\t起始地址\t分区大小\t状态\n\n");

while(p)

{

printf("%d ",flag);

flag++;

printf("%d \t",p->data.address);

printf("%dKB \t",p->data.size);

if(p->data.state==Free)

printf("空闲\n\n");

else

printf("已分配\n\n");

p=p->next;

}

printf("++++++++++++++++++++++++++++++++++++++++++++++\n\n");

}

//主函数

void main()

{

int c=1;

intMAX_length;//算法选择标记

printf("首次适应算法内存分配算法:\n");

printf("input MAX_length:\n");

scanf("%d",&MAX_length);

Initblock(MAX_length); //开创空间表

int choice;//操作选择标记

while(c=1)

{

show();

printf("请输入您的操作:");

printf("\n1: 分配内存\n2: 回收内存\n0: 退出\n");

scanf("%d",&choice);

{

if(choice==1)

{

alloc(); // 分配内存

c=1;

}

else if(choice==2) // 内存回收

{

int flag;

printf("请输入您要释放的分区号:\n");

scanf("%d",&flag);

free(flag);

c=1;

}

else if(choice==0)

{break; //退出

}

else //输入操作有误

{

printf("输入有误,请重试!\n");

c=1;

}

}

printf("&&&&&&&\n");}

}

八、运行截图

九、思考

这次试验模拟内存分配,模拟了操作系统是如何通过作业调度选择作业进入内存以及系统是如何为进入内存的作业分配内存空间,实现多道作业同时驻留内存,就绪进程队列中的多个进程是如何以分式方式共享CPU,作业运行完成离开系统时,系统如何进行内存回收,采用的是首次适应算法,应用的数据结构是双向链表。实际上整个程序是比较简单的,但是由于自己对链表的应用不熟悉,查阅课本文库才实现内存分配这简单的功能,这个程序的缺陷就是在进行操作选择时没有进行分配空间的情况下回收空间会出现错误。本次试验使我对链表有了一定的了解但是还需继续学习。

实验三 最短路径的算法(离散数学实验报告)

实验3:最短路径算法 一、实验目的 通过本实验的学习,理解Floyd(弗洛伊得)最短路径算法的思想 二、实验内容 用C语言编程实现求赋权图中任意两点间最短路径的Floyd算法,并能对给定的两结点自动求出最短路径 三、实验原理、方法和手段 1、Floyd算法的原理 定义:Dk[i,j] 表示赋权图中从结点vi出发仅通过v0,v1,┉,vk-1中的某些结点到达vj的最短路径的长度, 若从vi到vj没有仅通过v0,v1,┉,vk-1 的路径,则D[i,j]=∝即 D-1[i,j] 表示赋权图中从结点vi到vj的边的长度,若没有从结点vi到vj的边,则D[i,j]=∝ D0[i,j] 表示赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0外没有其它结点 D1[i,j] 表示赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0,v1外没有其它结点 ┉┉┉ 根据此定义,D k[i,j]=min{ D k-1[i,j] , D k-1[i,k-1]+D k-1[k-1,j] } 定义:path[i,j]表示从结点vi到vj的“最短”路径上vi的后继结点 四、实验要求 要求输出每对结点之间的最短路径长度以及其最短路径 五、实验步骤 (一)算法描述 Step 1 初始化有向图的成本邻矩阵D、路径矩阵path 若从结点vi到vj有边,则D[i,j]= vi到vj的边的长度,path[i,j]= i; 否则D[i,j]=∝,path[i,j]=-1 Step 2 刷新D、path 对k=1,2,┉n 重复Step 3和Step 4 Step 3 刷新行对i=1,2,┉n 重复Step 4 Step 4 刷新Mij 对j=1,2,┉n 若D k-1[i,k]+D k-1[k,j]

动态规划实验报告

华东师范大学计算机科学技术系上机实践报告 一、 内容与设计思想 1.对于以下5 个矩阵: M 1: 2?3, M 2: 3?6, M 3: 6?4, M 4: 4?2, M 5: 2?7 , (a) 找出这5个矩阵相乘需要的最小数量乘法的次数。 (b) 请给出一个括号化表达式,使在这种次序下达到乘法的次数最少。 输入: 第一行为正整数N,表示有N 组测试数据; 每组测试数据的第一行为n,表示有n 个矩阵,2<=n<=50; 接下去的n 行,每行有两个整数x 和y,表示第ni 个矩阵是x*y 的。 输出: 对行每组数据,输出一行,每行一个整数,最小的矩阵连乘积。 我们保证输出的结果在2^64之内。 基本思想: 对于n 个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下: 2.定义0/1/2背包问题为:}x p max{n 1i i i ∑=。限制条件为:c x w n 1i i i ≤∑=,且 n i 1},2,1,0{x i ≤≤∈。设f(i , y)表示剩余容量为y ,剩余物品为:i ,i+1,…,n 时的最优解的值。 1.)给出f(i , y)的递推表达式; 2.)请设计求解f(i , y)的算法,并实现你的算法; 3.)设W=[10,20,15,30],P=[6,10,15,18],c=48,请用你的算法求解。 输入: 第一行为一个正整数N ,表示有几组测试数据。 每组测试数据的第一行为两个整数n 和M ,0=-=∑-=

操作系统实验四实验报告动态分区分配算法

操作系统实验四 【实验题目】:动态分区分配算法 【实验学时】:4学时 【实验目的】 通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。 【实验内容及要求】 问题描述: 设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,P n,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,S m,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。 程序要求: 1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。 2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。 3)输入:空闲分区个数n,空闲分区大小P1, … ,P n,进程个数m,进程需要的分区大小S1, … ,S m。

4)输出:首次适应算法,循环首次适应算法,最佳适应算法,最坏适应算法,最终内存空闲分区的分配情况。 实现源代码: #include #include #include #include #define max 100 using namespace std; int work_num; int zone_num; struct Data{ int data; char name; }; Data *d=new Data[max]; struct Table{ int data; char array[max]; int length; };

算法实验报告

华北电力大学 实验报告| | 实验名称算法设计与分析综合实验 课程名称算法设计与分析 | | 专业班级软件12 学生姓名: 学号:成绩: 指导教师:胡朝举实验日期:

实验一分治策略—归并排序 一、实验要求 (1)编写一个模板函数:template ,MergeSort(T *a, int n); 以及相应的一系列函数,采用分治策略,对任意具有:bool operator<(const T&x,const T&y);比较运算符的类型进行排序。 (2)与STL库中的函数std::sort(..)进行运行时间上的比较,给出比较结果,如:动态生成100万个随机生成的附点数序列的排序列问题, 给出所用的时间比较。 二、实验代码 #include <> #include <> #include <> #include <> #define MAX 50 typedef struct { int arr[MAX+1]; int length; }SortArr; SortArr *CreateSortArr() { int i = 0; char buf[4*MAX] = ""; char *ptr = NULL; SortArr *sortArr = (SortArr *)malloc(sizeof(SortArr)); memset(sortArr, 0, sizeof(SortArr)); printf("请输入待排序数据,以逗号分隔,以分号结束\n" "input:"); scanf("%s", buf); ptr = buf; sortArr->arr[i] = 0; i = 1; while(*ptr != ';') { sortArr->arr[i] = atoi(ptr); i++; ptr = strstr(ptr, ","); if(!ptr) { break; } ptr++; } sortArr->length = (i - 1); return sortArr; } int merge(int arr[], int p, int q, int r) { int i = 0; int j = 0; int k = 0; int n1 = 0; int n2 = 0; int *leftArr = NULL; int *rightArr = NULL; n1 = q - p + 1; n2 = r - q;

MATLAB实验报告,遗传算法解最短路径以及函数最小值问题讲解

硕士生考查课程考试试卷 考试科目:MATLAB教程 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师(签名) 考试日期:20 年月日午时至时

《MATLAB 教程》试题: A 、利用MATLA B 设计遗传算法程序,寻找下图11个端点的最短路径,其中没有连接的端点表示没有路径。要求设计遗传算法对该问题求解。 a d e h k B 、设计遗传算法求解f (x)极小值,具体表达式如下: 3 21231(,,)5.12 5.12,1,2,3 i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: A 一、问题分析(10分) 1 4 10 11 如图如示,将节点编号,依次为 1.2.3.4.5.6.7.8.9.10.11,由图论知识,则可写出其带权邻接矩阵为: 0 2 8 1 500 500 500 500 500 500 500 2 0 6 500 1 500 500 500 500 500 500 8 6 0 7 500 1 500 500 500 500 500 1 500 7 0 500 500 9 500 500 500 500 500 1 500 500 0 3 500 2 500 500 500 500 500 1 500 3 0 4 500 6 500 500 500 500 500 9 500 4 0 500 500 1 500 500 500 500 500 2 500 500 0 7 500 9 500 500 500 500 500 6 500 7 0 1 2 500 500 500 500 500 500 1 500 1 0 4 500 500 500 500 500 500 500 9 2 4 0 注:为避免计算时无穷大数吃掉小数,此处为令inf=500。 问题要求求出任意两点间的最短路径,Floyd 算法采用的是在两点间尝试插入顶点,比较距离长短的方法。我思考后认为,用遗传算法很难找到一个可以统一表示最短路径的函数,但是可以对每一对点分别计算,然后加入for 循环,可将相互之间的所有情况解出。观察本题可发现,所有节点都是可双向行走,则可只计算i 到j 的路径与距离,然后将矩阵按主对角线翻折即可得到全部数据。 二、实验原理与数学模型(20分) 实现原理为遗传算法原理: 按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使得适应度高的个体被保留下来,组成新的群体,新的群体既继承了上一代的信息,又优于上一代。这样周而复始,群体中个体适应度不断提高,直到满足一定的条件。 数学模型如下: 设图G 由非空点集合12{,...}n V V V V = 和边集合12{,...}m E e e e = 组成,其中121221(,)e ,P ,)(P ,P ), i i i i i i i i e P P E P =∈≠且若(则G 为一个有向图; 又设i e 的值为i a ,12{,...},m A a a a = 故G 可表示为一个三元组{,,}G P E A = 则求最短路径的数学模型可以描述为:

动态规划算法的应用实验报告

实验二动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 1.问题描述: 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 三、算法设计 void main() { 申明一个5*5的二维数组; for(int i=0;i<5;i++) { for(int j=0;j<=i;j++) { 输入数组元素p[i][j]; }

} for(int k=0;k<5;k++) { for(int w=0;w<=k;w++) { 输出数组元素p[k][w]; } } for(int a=4;a>0;a--) { for(int s=0;s<=a;s++) { if(p[a][s]大于p[a][s+1]) p[a-1][s]等于p[a-1][s]加p[a][s]; else p[a-1][s] 等于p[a-1][s] 加p[a][s+1]; } } 输出p[0][0] }

四.程序调试及运行结果分析 五.实验总结 虽然这个实验比较简单,但是通过这次实验使我更加了解的动态规划法的好处和、,在解决问题时要尝试使用动态规划,这样就有可能得到一种即简单复杂性有不高的算法。

操作系统实验_首次适应算法与循环首次适应算法

学号P7******* 专业计算机科学与技术姓名 实验日期2017.11.16 教师签字成绩 实验报告 【实验名称】首次适应算法和循环首次适应算法 【实验目的】 学会主存空间分配与回收的基本方法首次适应算法和循环首次适应算法。 【实验原理】 理解在连续分区动态的存储管理方式下,如何实现贮存空间的分配与回收。 采用可变式分区管理,使用最佳适应算法实现主存空间的分配与回收。 采用可变式分区管理,使用最坏适应算法实现主存空间的分配与回收。 数据结构: 1、bool ROM[N]; //定义主存信息,如果内存被占用,则标记为1,否则标记为0,设置内存单元为1024 2、pcb num[20];//定义作业数组,最大支持20个作业 3、typedef struct Pcb //定义作业结构体,包括名称,开始时间,大小,是否执行状态 { char name[10]; int start; int size; int state=0; } pcb; typedef struct Free_rom //空闲区结构体

{ int num; int start; int end; int space; } Free_room; Free_rom free_rom[100];//设置空闲区数组为100个 主要函数 void init();//初始化信息,包括初始化内存信息,和初始化作业队列 void insert_pcb1(pcb &a);插入作业函数,首次适应算法,如果有适合的就插入,无合适输出‘插入失败’ void insert_pcb1(pcb &a);插入作业函数,循环首次适应算法,如果有适合的就插入,无合适输出‘插入失败’ void Delete(pcb &a)//删除作业信息,包括修改内存状态修改作业状态并对作业进行初始化 void show();//显示信息 void find_free_rom() //寻找空闲区 算法流程图

算法实验报告

贵州大学计算机科学与技术学院 计算机科学与技术系上机实验报告 课程名称:算法设计与分析班级:软件101 实验日期:2012-10-23 姓名:学号:指导教师: 实验序号:一实验成绩: 一、实验名称 分治算法实验- 棋盘覆盖问题 二、实验目的及要求 1、熟悉递归算法编写; 2、理解分治算法的特点; 3、掌握分治算法的基本结构。 三、实验环境 Visual C++ 四、实验内容 根据教材上分析的棋盘覆盖问题的求解思路,进行验证性实验; 要求完成棋盘覆盖问题的输入、分治求解、输出。有余力的同学尝试消去递归求解。 五、算法描述及实验步骤 分治算法原理: 分治算法将大的分解成形状结构相同的子问题,并且不断递归地分解,直到子问题规模小到可以直接求解。 棋盘覆盖问题描述: 在一个2k x 2k个方格组成的棋盘中恰有一个方格与其他的不同称为特殊方格,想要求利用四种L型骨牌(每个骨牌可覆盖三个方格)不相互重叠覆盖的将除了特殊方格外的其他方格覆盖。

实验步骤: 1、定义用于输入和输出的数据结构; 2、完成分治算法的编写; 3、测试记录结构; 4、有余力的同学尝试不改变输入输出结构,将递归消除,并说明能否不用栈,直接消除递归,为什么? 六、调试过程及实验结果 详细记录程序在调试过程中出现的问题及解决方法。 记录程序执行的结果。

七、总结 对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。 通过对本实验的学习,对分治算法有了进一步的认识,对棋盘覆盖问题和其他分治问题进行了对比。 八、附录 源程序(核心代码)清单或使用说明书,可另附纸 ① #include #include using namespace std; int board[100][100],tile=1; void chessboard(int tr,int tc,int dr,int dc,int size)//tr 棋盘左上角方格的行号,tc棋盘左上角方格的列号。dr特殊方格所在的行号。dc特殊方格所在的列号。size棋盘的大小2^k. { int s; if(size==1) return ; int t=tile++; s=size/2; //覆盖左上角棋盘 if(dr=tc+s) chessboard(tr,tc+s,dr,dc,s); else { board[tr+s-1][tc+s]=t; chessboard(tr,tc+s,tr+s-1,tc+s,s); } ② //覆盖左下角子棋盘 if(dr>=tr+s&&dc=tr+s&&dc>=tc+s) chessboard(tr+s,tc+s,dr,dc,s); else { board[tr+s][tc+s]=t; chessboard(tr+s,tc+s,tr+s,tc+s,s); } } int main() { int k,tr,tc,size,i,j; cin>>k>>tr>>tc; size=pow(2,k); chessboard(0,0,tr,tc,size); for(i=0;i

《数据结构课程设计》最短路径问题实验报告

《数据结构课程设计》最短路径问题实验报告

目录 一、概述 0 二、系统分析 0 三、概要设计 (1) 四、详细设计 (5) 4.1建立图的存储结构 (5) 4.2单源最短路径 (6) 4.3任意一对顶点之间的最短路径 (7) 五、运行与测试 (8) 参考文献 (11) 附录 (12)

交通咨询系统设计(最短路径问题)一、概述 在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。 二、系统分析 设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。 针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。并未本系统设置一人性化的系统提示菜单,方便使用者的使用。

三、概要设计 可以将该系统大致分为三个部分: ①建立交通网络图的存储结构; ②解决单源最短路径问题; ③实现两个城市顶点之间的最短路径问题。

迪杰斯特拉算法流图:

动态规划算法实验

一、实验目的 (2) 二、实验内容 (2) 三、实验步骤 (3) 四.程序调试及运行结果分析 (5) 附录:程序清单(程序过长,可附主要部分) (7)

实验四动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 1.问题描述: 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 题目二:最长单调递增子序列问题(课本184页例28) 设有由n个不相同的整数组成的数列,记为:a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j) 若存在i1

题目三 0-1背包问题 给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为c,。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品只有两个选择:装入或不装入,且不能重复装入。输入数据的第一行分别为:背包的容量c,,物品的个数n。接下来的n 行表示n个物品的重量和价值。输出为最大的总价值。 输入样例: 20 3 11 9 9 10 7 5 输出样例 19 2.数据输入:个人设定,由键盘输入。 3.要求: 1)上述题目任选一做。上机前,完成程序代码的编写 2)独立完成实验及实验报告 三、实验步骤 1.理解算法思想和问题要求; 2.编程实现题目要求; 3.上机输入和调试自己所编的程序; 4.验证分析实验结果; 5.整理出实验报告。

采用首次适应算法的动态分区分配模拟课程设计实验报告

】 1 需求分析 1)本程序要求实现对内存的动态分配与回收的模拟,同时,在内存的分配时还必须使用首次适应算法,最后,还要显示内存块分配和回收后空闲内存分区链的情况。 2)要实现对作业的内存分配,首先要有一个对作业进行创建和分配内存的模块,其中,该模块在分配内存时要使用首次适应算法;要实现对内存的回收,要有一个内存回收的模块,其中,该模块在回收内存时要考虑内存回收的四种情况;最后,还要有一个能显示内存空闲分区链的情况的模块。 2 概要设计 1)首次适应算法的结构如图1: 图1 首次适应算法的结构图 》

2)数据结构: struct Fq { int size,o,no; Fq *before,*next; }; 其中,Fq表示结构体的名字(类型),size表示分区的可用空间大小,o表示该分区的状态(是否已分配),no表示该分区中的作业标志,*before表示该结点的向前指针,*next表示该结点的向后指针。 3)各种函数说明: \ void alloc(int b,int no,Fq *p); 对作业no进行内存分配的功能函数;其中,参数b表示需求的内存大小,参数no表示作业的编号,参数*p表示空闲分区链的第一个非空结点的指针; void free(Fq *c); 将地址为c的分区的内存回收;其中,参数*c表示要回收内存的结点; void create(Fq *head); 创建新作业的子函数;其中,参数*head表示空闲分区链的链首指针;要配合函数alloc()使用; void cha(Fq *head); 查看内存中的空闲分区链的子函数;其中,参数*head表示空闲分区链的链首指针; # void hui(Fq *head); 回收内存的子函数;其中,参数*head表示空闲分区链的链首指针;要配合函数free()使用; 3 运行环境 1)操作系统: Windows XP ( 32位 / DirectX 11 ) 2)电脑: X86 兼容台式电脑

算法程序设计实验报告

程序设计》课程设计 姓名:王 学号:20100034 班级:软件工程00 班 指导教师:王会青 成绩: 2010年 6 月 实验一.构造可以使n 个城市连接的最小生成树 专业:__软件工程___ 班级:__软件姓名:_王___ 学号:_20100034 完成日期:_2010/6/26 ________ 一、【问题描述】给定一个地区的n 个城市间的距离网,用Prim 算法或Kruskal 算法建立最小生成树,并计算得到的最小生成树的代价。 1 城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道

路,则将相应边的权值设为自己定义的无穷大值。 2 显示出城市间道路网的邻接矩阵。 3 最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。 4 输入城市数、道路数→输入城市名→输入道路信息→执行Kruskal 算法→执行Prim 算法→输出最小生成树 二、【问题分析】 1. 抽象数据类型结构体数组的定义: #ifnd ef ADJACENCYMATRIXED// 防止该头文件被重复引用 #define ADJACENCYMATRIXED // 而引起的数据重复定义 #define INFINITY 32767 // 最大值∞ #define MAX_VERTEX_NUM 20 // 最大顶点个数 typedef int VRType; // 权值,即边的值 typedef char InfoType; // 附加信息的类型,后面使用时会定义成一个指针 typedef char VertexType[MAX_VERTEX_NUM]; // 顶点类型 typedef enum {DG=1, DN, UDG, UDN} GraphKind; //{ 有向图,有向网,无向图,无向网} typedef struct ArcCell { VRType adj; //VRType 是顶点关系类型。对无权图,用1 或0 表示相邻否;对带权图,则为权值类型。 InfoType*info; // 该弧关系信息的指针

最短路径实验报告

一、实验目的 学习掌握图的存储结构 利用最短路径算法,通过java编程实现最短路径输出。 二、实验环境 Eclipse平台 三、实验过程 最短路径算法问题是计算机科学、运筹学、地理信息系统和交通诱导、导航系统等领域研究的一个热点。传统的最短路径算法主要有Floyd算法和Dijkstra算法。Floyd 算法用于计算所有结点之间的最短路径。Dijkstra算法则用于计算一个结点到其他所有结点的最短路径。本程序利用Dijkstra算法用java语言实现最短路径的可视化。 流程: 画无向邻接矩阵邻接矩阵初始化求取最短路径 Java文件如下 M ain.java 文件: import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.StringTokenizer; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.TitledBorder; public class Main { public static void main(String args[]) { new UI("最短路径"); } } @SuppressWarnings("serial") class UI extends JFrame implements ActionListener, ItemListener { JFrame frame; JButton button;

动态规划算法分析实验报告

四、实验结果显示 五、实验总结 通过理解最优子结构的性质和子问题重叠性质,在VC++6.0环境下实现动态规划算法。动态规划算法是由单阶段的决策最优逐步转化为多阶段的决策最优,最后构造一个最优解。经过反复的调试操作,程序运行才得出结果。

六、附录 A #include #include #include #include #define MAX 100 #define n 12 #define k 5 int c[n][n]; void init(int cost[]) { int i,j; for(i=0;i<13;i++) { for(j=0;j<13;j++) { c[i][j]=MAX; } } c[1][2]=9; c[1][3]=7;c[1][4]=3; c[1][5]=2; c[2][6]=4; c[2][7]=2; c[2][8]=1; c[3][6]=2; c[3][7]=7; c[4][8]=11; c[5][7]=11;c[5][8]=8; c[6][9]=6; c[6][10]=5; c[7][9]=4; c[7][10]=3; c[8][10]=5;c[8][11]=6; c[9][12]=4; c[10][12]=2; c[11][12]=5; } void fgraph(int cost[],int path[],int d[]) { int r,j,temp,min; for(j=0;j<=n;j++) cost[j]=0; for(j=n-1;j>=1;j--) { temp=0; min=c[j][temp]+cost[temp]; for(r=0;r<=n;r++) { if(c[j][r]!=MAX)

计算机操作系统内存分配实验报告记录

计算机操作系统内存分配实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后,分给作业1(130KB),随着作业1、2、3的进入,分别分配60KB、100KB,经过一段时间的运行后,作业2运行完毕,释放所占内存。此时,作业4进入系统,要求分配200KB内存。作业3、1运行完毕,释放所占内存。此时又有作业5申请140KB,作业6申请60KB,作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。 设置一个内存空闲分区链,内存空间分区通过空闲分区链来管理,在进行内存分配时,系统优先使用空闲低端的空间。 设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空间区和已分配区说明链的值,设计作业申请队列以及作业完成后释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明

Romberg龙贝格算法实验报告.

Romberg龙贝格算法实验报告 2017-08-09 课程实验报告 课程名称: 专业班级: CS1306班学号: U201314967 姓名:段沛云指导教师:报 告日期: 计算机科学与技术学院 目录 1 实验目的 (1) 2 实验原理 (1) 3 算法设计与流程框图 (2) 4 源程序 (4) 5 程序运行 (7) 6 结果分析 (7) 7 实验体会 (7) 1 实验目的 掌握Romberg公式的用法,适用范围及精度,熟悉Romberg算法的流程,并能够设计算法计算积分 31 得到结果并输出。 1x 2 实验原理 2.1 取k=0,h=b-a,求T0= 数)。 2.2 求梯形值T0( b-a

),即按递推公式(4.1)计算T0。 k 2 h [f(a)+f(b)],令1→k,(k记区间[a,b]的二分次2 2.3 求加速值,按公式(4.12)逐个求出T表的第k行其余各元素Tj(k-j) (j=1,2,….k)。 2.4 若|Tk+1-Tk| n-1 11T2n=[Tn+hn∑f(xi+)] 22i=0 1 Sn=T2n+(T2n-Tn) 31 Cn=S2n+(S2n-Sn) 151 Rn=C2n+(C2n-Cn) 63 3 算法设计与流程框图 算法设计:(先假定所求积分二分最大次数次数为20) 3.1 先求T[k][0] 3.2 再由公式T (k)m 4m(k+1)1)=mTm-1-mTm(k-1(k=1,2,) 求T[i][j] 4-14-1 3.3 在求出的同时比较T[k][k]与T[k-1][k-1]的大小,如果二者之差的绝对 值小于1e-5,就停止求T[k][k];此时的k就是所求的二分次数,而此时的T[k][k]就是最终的结果 3.4 打印出所有的T[i][j];程序流程图

最短路径实验报告

云南财经大学信息学院学生综合性与设计性实验报告 (2013—2014 学年第 2 学期) 周次:第7周日期:2014年 4 月 17 日地点: 一、实验内容与目的 1.内容 查看“最短路径.swf”,选择熟悉的程序设计语言定义有向图,根据动画演示求取从有向图任一结点到其他结点的最短路径。 2.实验目的 了解最短路径的概论,掌握求最短路径的方法。 二、实验原理或技术路线(可使用流程图描述) 实验原理:(李燕妮负责设计,周丽琼负责编程) 图是由结点的有穷集合V和边的集合E组成,求最短路径用迪杰斯特拉算法: 1)适用条件&范围: a) 单源最短路径(从源点s到其它所有顶点v); b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图) c) 所有边权非负(任取(i,j)∈E都有Wij≥0); 2)算法描述: a)初始化:dis[v]=maxint(v∈V,v≠s); dis[s]=0; pre[s]=s; S={s}; b)For i:=1 to n 1.取V-S中的一顶点u使得dis[u]=min{dis[v]|v∈V-S}

2.S=S+{u} 3.For V-S中每个顶点v do Relax(u,v,Wu,v) c)算法结束:dis[i]为s到i的最短距离;pre[i]为i的前驱节点 三、实验环境条件(使用的软件环境) Microsoft Visual C++6.0 四、实验方法、步骤(列出程序代码或操作过程) /*本程序的功能是求图中任意两点间的最短路径*/ #include #include #include #include #define ING 9999 typedef struct ArcCell{ int adj; /*顶点关系类型,用1表示相邻,0表示不相邻*/ }ArcCell,**AdjMatrix; /*邻接矩阵*/ typedef struct type{ char data[3]; /*顶点值*/ }VertexType; typedef struct{ VertexType *vexs; /*顶点向量*/ AdjMatrix arcs; /*邻接矩阵*/ int vexnum,arcnum; /*图的顶点数和边数*/ }MGraph; /*初始图*/ void InitGraph(MGraph *G) { int i,nu,mu; printf("\n输入顶点的个数和(边)弧的个数:"); scanf("%d %d",&nu,&mu); G->arcs=(ArcCell **)malloc(nu*sizeof(ArcCell *)); for(i=0;iarcs[i]=(ArcCell *)malloc(nu*sizeof(ArcCell)); G->vexs=(VertexType *)malloc(nu*sizeof(VertexType)); /*分配顶点空间*/ G->vexnum=nu;G->arcnum=mu; /*图的顶点数和边数*/ }

计算机操作系统内存分配实验报告

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下.如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配.就是解决多道作业或多进程如何共享主存空间的问题。所谓回收.就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区.使分区大小正好适合作业的需求.并且分区个数是可以调整的。当要装入一个作业时.根据作业需要的主存量查看是否有足够的空闲空间.若有.则按需要量分割一个分区分配给该作业;若无.则作业不能装入.作业等待。随着作业的装入、完成.主存空间被分成许多大大小小的分区.有的分区被作业占用.而有的分区是空闲的。 实验要求使用可变分区存储管理方式.分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行.分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时.要求设计一个实用友好的用户界面.并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理.在系统运行当然开始.假设初始状态下.可用的内存空间为640KB.存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后.分给作业1(130KB).随着作业1、2、3的进入.分别分配60KB、100KB.经过一段时间的运行后.作业2运行完毕.释放所占内存。此时.作业4进入系统.要求分配200KB内存。作业3、1运行完毕.释放所占内存。此时又有作业5申请140KB.作业6申请60KB.作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理.使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链.为了实现对空闲分区的分配和链接.在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针.由状态位指示该分区是否分配出去了;同时.在分区尾部还设置有一后向指针.用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间.当该分区分配出去后.状态位就由“0”置为“1”。 设置一个内存空闲分区链.内存空间分区通过空闲分区链来管理.在进行内存分配时.系统优先使用空闲低端的空间。 设计一个空闲分区说明链.设计一个某时刻主存空间占用情况表.作为主存当前使用基础。初始化空间区和已分配区说明链的值.设计作业申请队列以及作业完成后释放顺序.实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明链的变化情况以及各作业的申请、释放情况显示打印出来。

相关主题
文本预览
相关文档 最新文档