操作系统银行家算法实验报告

2025-04-24 版权声明 我要投稿

操作系统银行家算法实验报告(共7篇)

操作系统银行家算法实验报告 篇1

一、基本信息:

a)实验题目:银行家算法的实现 b)完成人姓名:韩璐璐 c)学号:71114115 d)报告日期:2016.5.27

二、实验目的

通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。

三、实验内容

1.在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。

2.创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。3.通过Win32 API提供的信号量机制,实现共享数据的并发访问。

四、程序运行时的初值和运行结果(系统截图)

五、源程序并附上注释 #include #include #include #include using namespace std;int r[3] = { 3, 3, 2 };//系统拥有的资源 int r0 = 0, r1 = 0, r2 = 0;//记录申请资源 class pcb { public: int id;bool state;int max[3];int alc[3];int need[3];

pcb(){ } void init(){

state = false;

cout << “请输入进程的id,各个资源总需求量和已占用资源” << endl;

cin >> id;

cout << “a,b,c三种资源的最大使用量” << endl;

cin >> max[0] >> max[1] >> max[2];

cout << “a,b,c三种资源的已占有量” << endl;

cin >> alc[0] >> alc[1] >> alc[2];} int rd(int n){

return rand()%(n + 1);

} int request(){

// Sleep(1000);

r0 = rd(max[0]alc[1]);

r2 = rd(max[2]alc[0]))&& r1 ==(max[1]alc[2]))

{

r[0] = r[0] + alc[0];

r[1] = r[1] + alc[1];

r[2] = r[2] + alc[2];

return 1;

}

return 2;

} };bool safe(vector

temp, int i){ int u = r[0]r1, l = r[2]1;j++)

temp[j] = temp[j + 1];temp.pop_back();int size = temp.size();//记录下容器内还有多少个进程

// int range[size];//记录下队列

int x = 0;//计数器

while(!temp.empty()){

static int j = 0;

if((temp[j].max[0]temp[j].alc[1])<= k &&

(temp[j].max[2]1;e++)

temp[e] = temp[e + 1];

temp.pop_back();

if(j >= temp.size())

j = 0;

}

else

{

j++;

if(j >= temp.size())

j = 0;

}

x++;

if(x ==(size*size))

{

cout << “没有安全队列,以上情况不成立” << endl;

cout << endl;

return false;

}

} return true;} int main(){ srand(time(0));pcb p[4];vector

vp;for(int i = 0;i<4;i++){

p[i].init();

vp.push_back(p[i]);} int x = 0;//计算器

int c;cout << “请选择分配资源方法:1.银行家算法 2.随机算法” << endl;cin >> c;switch(c){ case 1:

while(!vp.empty())

{

int a;

static int i = 0;

if((a = vp[i].request())!= 0)

{

if(a == 1)

endl;

r[1] << “ c

{

cout << ”进程“ << vp[i].id << ”已经结束“ <<

for(int j = i;j

r[1] = r[1]r2;

cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl;

cout << endl;

}

i++;

if(i >= vp.size())

i = 0;

}

}

else

i++;

if(i >= vp.size())

i = 0;

x++;

if(x >= 200)

{

cout << ”初始化的表不安全“ << endl;

return 0;

}

}

cout << ”进程已经全部结束“ << endl;

break;case 2:

while(!vp.empty())

{

int a2;

static int i2 = 0;

if((a2 = vp[i2].request())!= 0)

{

if(a2 == 1)

{

cout << ”进程“ << vp[i2].id << ”已经结束“ << endl;

for(int j = i2;j

r[1] = r[1]r2;

cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl;

cout << endl;

i2++;

if(i2 >= vp.size())

i2 = 0;

}

}

else

i2++;

if(i2 >= vp.size())

i2 = 0;

x++;

if(x >= 200)

{

cout << ”产生死锁“ << endl;

return 0;

}

}

cout << ”进程已经全部结束“ << endl;

break;default:

cout << ”选择错误“ << endl;

break;

} system(”pause");return 1;}

要求:实验报告以电子版的形式通过Email提交给助教,做到内容翔实、图表清晰,层次分明,标题突出。

操作系统银行家算法实验报告 篇2

关键词:GIS,选址,哈夫模型,正态分布

1 引言

基于位置的商业智能 (LBI, Location-based Business Intelligent) 是GIS领域、商业智能 (BI, Business Intelligent) 领域近年来兴起的新兴热点研究领域, 是传统GIS领域、商业智能领域的学科交叉研究方向, 也是GIS领域、商业智能领域的重要发展方向。银行业正在经历一次迅速的变革, 改进和完善支行网点是当务之急[1]。对于直接面对储户的网点来说, 合理的网点布局是完善支行网点的重要部分。地理信息系统 (GIS) 能将各种信息集中并表现到地图中, 提供更直观、全面的信息, 因而利用GIS进行网点选址能使银行网点布局更为合理。

现在, 利用GIS进行网点选址已有较多的研究, 并提出了一些模型, 如空间交互模型 (spatial interaction models) 或平面/网络优化模型 (planar or network optimization models) [2]。Huff模型是空间交互模型中的一种, 在网点选址中有较多的应用, 如Atsuyuki Okabe等用Huff模型来评估在街道网络中的零售网点的需求[3], Philip S.用Huff模型来建模银行网点撤销决策支持系统[4]等。用Huff模型在对银行网点选址进行建模时, 存在以下不足:首先, 对具有大量客户的网点来说, Huff模型在评估客户时没有反应其统计规律;其次, 当客户到网点的距离趋近于零时, 其距离因子趋近于无究大;再次, Huff模型在应用中需要大量的统计工作来确定其相应参数, 增加了应用成本。因此, 本文提出一种基于正态分布的Huff模型, 减少了初步应用的参数, 并用Arc Engine组件进行了实现, 结果表明, 本模型对具有大量客户的网点进行评估时具有更高的准确性和易用性。

2 基于正态分布的Huff模型

2.1 Huff模型

在哈里斯的市场潜能模型的基础上, 美国加利福尼亚大学的经济学者戴维·哈夫 (D.L.Huff) 教授于1963年提出了关于预测城市区域内商圈规模的模型——哈夫概率模型。

哈夫概率模型可以表示为一个函数, 其值为:一个位置的吸引力除以某顾客位置到该位置的距离, 其值再除以所有顾客到该位置的值的总和[5]。即:

在哈夫概率模型中, Pij为位于位置i的顾客到位于位置j的网点存款的概率;tij为位置i到位置j的距离或从位置i到位置j所花的时间;n为位置j周围的网点数。

参数aj是一个相对于位置j的吸引力的一个量度。如果让aj=1, j=1, 2, …, n, 那么所有的网点被认为具有相同的吸引力, 顾客只是简单地选择到最近或花时间最短的网点去消费。

参数b控制距离递减特性, 表示顾客对距离或所花时间的敏感程度。如果顾客对距离很敏感, 那么b的值大于1。

2.2 基于正态分布的Huff模型 (normal distribution basedHuff model)

在顾客到银行网点存款的概率模型中, 对于基本业务同质的网点 (利率相同) , 可以假定居民的存款在平面上的概率分布密度[6]服从高斯正态分布

这里r为平面上任一点到居民所居住的小区的距离, 称上述分布为居民存款在平面上的原始分布, 只有当银行数很多, 且在平面上银行呈较均匀分布时, 上式才适用。网点距离顾客越近, 顾客到选择该网点概率越高。

在Huff模型中, 控制距离递减特性的参数b一般取值大于1, 例如为2。那么当tij趋近于0时, 趋近于无穷大。表示距离对顾客选择该网点的影响, 为了避免其趋近于无穷大的问题, 在顾客选择银行网点过程中, 我们认为f (r) 更能表示本影响, 如图1所示。

令则:

式中, r为在位置i的顾客到网点位置j的距离或所花的时间。也可以表示为tij。Pij为位于位置i的顾客到位于位置j的网点存款的概率。

3 算法

使用nd-Huff模型进行银行选址分析时, 首先要建立待选网点, 然后对每个网点进行一定半径的缓冲区分析, 找出该缓冲区内的潜在顾客;计算每个顾客到该网点进行业务的概率, 根据概率计算该顾客在该网点存款的期望值;然后计算该网点的期望值, 得出最优方案。所以, 选址分析要经过如下阶段:

(1) 估计某个顾客到某个网点存款的概率;

(2) 计算该顾客在该网点存款的期望值;

(3) 计算每个网点吸纳存款的期望值;

(4) 应用该模型评估银行网点。

3.1 概率估计

在估计某个顾客i到该网点j存款的概率时, 首先计算出i到j的距离r, 然后根据公式 (3) 计算出位于位置i的顾客到位于位置j的网点存款的概率Pij。

3.2 顾客到该网点存款的期望值计算

某网点j的存款期望值由在位置i的顾客存款总额Ci以及该顾客i到网点j存款概率Pij计算得到。其值为在位置i的顾客的存款总额Ci乘以在位置i的顾客到网点j存款的概率Pij, 即:

式中, Eij为在位置i的顾客到网点j存款的期望值, Pij为在位置i的顾客到网点j存款的概率, Ci为在位置i的顾客存款总额。

3.3 网点吸纳存款的期望值

在位置j的网点所能吸纳存款的期望值的计算相对简单, 只要将j覆盖范围内的所有顾客到网点j的存款期望值计算总和即得, 即:

式中, Tj为网点j吸纳存款的期望值, Eij为顾客i到网点j存款的期望值, n为网点j覆盖范围内的顾客数。

3.4 评估银行网点

在进行网点评估时, 需要遍历所有待选网点, 计算其吸纳存款的期望值, 然后根据一定的规则进行比较 (如选期望值最大的) , 即可得出最优解。

4 结论

在如图2所示的地图中, 选取了3个待选网点net1 (0.776 957 062 419 842, 0.412 393 823 655 657) , net2 (0.655 548 389 212 575, 0.133 257 090 777 184) , net3 (0.294 355 901 435 962, 0.311 553 101 520 397) , 分别用Huff模型和nd-Huff模型进行分析, 距离采用欧式距离, δ=0, 结果如表1所示。在Huff模型计算方式中, net3为最优方案, 而在nd-Huff模型中, net1为最优方案。

在图2中, 我们可以看出, 在net1的0.5半径范围内, 有17个点, 而在net3的0.5半径范围内, 只有14个点。因此, net1应当优于net3。所以, 我们认为nd-Huff模型在银行选址中, 具有比Huff模型更好的效果。基于本算法, 在基于LBI的商业银行管理系统中进行了实现, 如图3所示, 结果表明, 在初步的选址过程中, 只需要客户的位置信息及网点的有效商业半径等参数就可以得到较好的选址效果, 提高了模型的易用性。

参考文献

[1]Alan Genes, Fabienne Konik, Caroline Moss.Striving for Growth:Best Practices in Retail Banking Sales and Service Channels[EB/OL].http://www.boozallen.com/capabilities/Industries/industries_article/37999368?lpid=660614, 2007-06-13.

[2]Richard L Church.Geographical Information Systems and Location Science[J].Computers&Operations Research, 2002, 29 (6) :541-562.

[3]Atsuyuki Okabe, Kei-ichi Okunuki.A Computational Method for Es-timating the Demand of Retail Stores on a Street Network and its Im-plementation in GIS[J].Transactions in GIS, 2001, 5 (3) :209-220.

[4]Philip S Morrison and Rachel O’Brien.Bank Branch Closures in New Zealand:The Application of a Spatial Interaction Model[J].Applied Geography, 2001, 21 (4) :301-330.

[5]D Huff.A Probabilistic Analysis of Shopping Center Trade Areas[J].Land Economics, 1963, 39 (1) .

基于实验报告自动批阅的系统分析 篇3

[关键字] 实验报告自动批阅,系统分析

一、引言

实验报告网上自动批阅的目标是能让计算机像人一样对实验报告进行批阅,对实验目的、设备、原理、步骤、结果以及心得体会进行对错的判断并打分。实现实验报告自动批阅可利用人工智能等相关技术,在运用这些技术前,需了解实验报告的特征,并在此基础上提出整个实验报告自动批阅的工作流程,即实现方案。

二、实验报告提交格式设定

通常实验报告内容包括:实验名称、实验目的、实验设备、实验原理、实验步骤、实验结果、心得体会等;同时,应有学生基本信息等相关内容。针对实验报告网上评阅的特征,设定报告格式,使批阅过程更简单,化整为零,最后汇总得分。设定报告格式如下:

1、学生填写:学生学号、姓名,实验课程,实验名称,实验目的,实验设备,实验原理,实验步骤,实验结果,心得体会。

2、对实验目的、实验设备、实验原理、实验步骤、实验结果、心得体会要求学生按照知识点来填写,每个知识点以“句号”结束。

3、学生填写完每一部分的内容,以文本方式提交保存。

三、自动批阅工作流程

实验报告格式统一后,只需从数据库中提取出学生的实验报告;再根据实验名称从标准答案模板中提取该实验的标准答案模板;然后分别从学生报告和答案模板中提取实验目的、实验设备、实验原理、实验步骤、实验结果、心得体会六个部分的内容,对它们进行相应的处理,得到每个部分的成绩,最后把所有的成绩相加。批阅流程如下:

1、每个实验都有既定的名称,假设每个实验名称不同。此时,利用实验名称作为关键字,用人工智能中信息检索、关键字匹配方法对所有实验报告进行检索,把所有该实验的实验报告提取并分类。该实验记为A,该实验A的所有学生实验报告组成一个集,记为A(S1,S2,S3,S4……)其中Si代表第i份学生实验报告。

2、对分类出的实验A报告集中的每份实验报告(Si)进行逐步批阅,即按照实验目的、实验设备、实验原理、实验步骤、实验结果、心得体会进行单独批阅。分别把学生实验报告中的六部分记为Si1、Si2、Si3、Si4、Si5、Si6,简记为Sij;把标准答案模板中的上述六部分记为Wa1、Wa2、Wa3、Wa4、Wa5、Wa6,简记为Waj。

3、怎样进行这六部的批阅:以“实验目的”为例。首先,从当前批阅的实验报告中提取出“实验目的”部分的内容,再对“实验目的”部分的全部内容按照“句号”进行文本块划分,把划分得到的文本块记为Si1t(其中t的大小为该“实验目的”部分的内容中句号的个数)。因为规定学生在填写这部分内容时是按照知识点来作答的,且每一知识点都用“句号”来表示结束,所以按照“句号”来进行文本块的划分,实际上就是按照知识点来划分整个部分的内容。

4、对标准答案模板的“实验目的”部分内容全部提取,系统中答案的存储分每一部分单独存储,而每一部分中又以知识点加权值的形式存储,且每一个知识点为一条记录。在这里应提取出“实验目的”部分的全部知识点,并把它记录下来以供后面的批阅使用,记为Wa1t。

5、把3中得到的所有报告“实验目的”文本块Si1t进行文本预处理、句法分析、语法分析、语义分析以及信息抽取,得到报告信息抽取模块。记为pi1t(其中i、t与si1t中的i、t分别相同)。

6、对于4中得到的答案模板“实验目的”部分的所有知识点Wa1t,只需要进行知识点与权值的切分,把切分出来的知识点部分记为qa1t,相应知识点的权值记为ka1t。

7、对于6中得到的“实验目的”部分的每个知识点信息抽取模块qa1t与5中得到的所有学生报告实验目的部分的信息抽取模块pi1t进行模块间相似度的计算,把得到的相似度值中最大的一个乘上该知识点的权值,便得到了该知识点的得分,最后把所有知识点的得分用同样的方法得出后相加,得到“实验目的”部分的总分。

8、重复第3到第7,得出其余五部分的成绩,最后把这六部分的成绩相加就得到该份报告总成绩。

9、对同一实验的其他学生实验报告重复2到8进行批阅;对其他实验的实验报告的批改重复1到8就可完成批阅。

四、举例分析自动批阅工作流程

1、在学生上交的实验报告中,按当前批阅实验的实验名称进行搜索,把得到的实验报告进行单独管理。以“负反馈放大器实验”为例,把“负反馈放大器实验”记为A,并把搜索到的N份实验报告组成一个集,记为A(S1,S2,S3,S4……Sn)。同时把标准答案模板中“负反馈放大器实验”的标准答案模板记为Wa。

2、提取一份实验报告Si,对它的实验目的、实验设备等六部分分别进行批阅。以“实验目的”(记为Si1)为例来说明。首先提取“实验目的”的全部内容,按照“句号”进行文本块划分,把得到的文本块记为Si1t。例如学生报告中“实验目的”内容:

(1) 了解多级阻容耦合放大器组成的一般方法。

(2) 了解负反馈对放大器性能指标的改善。

划分文本块后得到的内容:

文本块一: (1) 了解多级阻容耦合放大器组成的一般方法

文本块二:(2) 了解负反馈对放大器性能指标的改善。

其中把“文本块一”记为Si11,把“文本块二”记为Si12。

3、提取负反馈放大器答案模板中实验目的(Wa1)部分的全部知识点,并把各个知识点记为Wa1t。得到如下结果:

知识点一:多级阻容偶合 放大器 组成 方法|2#

知识点二:负反馈 对 放大器 性能 改善 |3#

其中把“知识点一”记为Wa11,把“知识点二”记为Wa12。

4、对2中得到的所有实验目的部分的文本块Si1t进行文本预处理、句法分析、语法分析、语义分析以及信息抽取,生成报告信息抽取模块。记为pi1t(其中i、t与si1t中的i、t分别相同)。以2中得到的结果为例,说明如下:

文本块一:1、了解多级阻容耦合放大器组成的一般方法。

文本块二:2、了解负反馈对放大器性能指标的改善。

信息抽取模块:

信息抽取模块一:多级阻容偶合 放大器 组成 方法

信息抽取模块二:负反馈 对 放大器 性能 改善

其中把“信息抽取模块一”记为pi11,把“信息抽取模块二”记为pi12。

5、对于3中得到的答案模板中实验目的部分的所有知识点进行知识点与权值的切分,因为在计算机中存储的答案模板中的每一部分的内容都是知识点的信息抽取模块和该知识点的权值,所以切分出来的知识点就是信息抽取模块。把切分出来的知识点部分记为qa1t,相应知识点的权值记为ka1t。实验目的全部知识点:

知识点一:多级阻容偶合 放大器 组成 方法 2。

知识点二:负反馈 对 放大器 性能 改善 3。

进行知识点与权值的切分后的结果:

信息抽取模块: 权值:

知识点一信息抽取模块:多级阻容偶合 放大器 组成 方法 2

知识点二信息抽取模块:负反馈 对 放大器 性能 改善 3

其中把“知识点一信息抽取模块”记为qa11,把“知识点二信息抽取模块”记为qa12;对于权值“2、3”相应的记为ka11、ka12。

6、把5中得到的第一个答案信息抽取模块qa11与4中得到的两个报告信息抽取模块pi11、pi12分别进行模块间相似度的计算,并取最大的相似度值。由于qa11和pi11这两个模块是完全一样的,相似度值为1(设定相似度的最大值为1),所以此时相似度值为1;然后取与qa11相对应的权值(ka11)2,与得到的相似度值相乘,得到了报告对qa11这个知识点回答的成绩,即为2分。分别计算出答案信息抽取模块剩余的相似度值,并得到成绩,两个知识点的成绩相加得到学生实验报告中实验目的部分的成绩,本例得到实验目的部分的成绩为5分。

7、上面是对一份报告中实验目的部分的批阅,对于同一份报告中的其余部分以及不同报告、不同实验的报告都按照这样的方法进行批阅。最后把同一份报告中六个部分的成绩相加便得到了这份报告的总成绩。

参考文献:

[1] 刘其云、李中言,信息抽取的功能和实现方法,情报杂志,2005,5:67-68

操作系统银行家算法实验报告 篇4

实验报告

学生姓名 课 程 电力系统分析的计算机算法 学 号

专 业 电气工程及其自动化 指导教师 邱晓燕

二Ο一四 年 六 月 二日

实验一

潮流计算

一、实验目的

1.了解并掌握电力系统计算机算法的相关原理。

2.了解和掌握PSD-BPA电力系统分析程序稳态分析方法(即潮流计算)。3.了解并掌握PSD-BPA电力系统分析程序单线图和地理接线图的使用。

二、实验背景

随着科学技术的飞速发展,电力系统也在不断地发展,电网通过互联变得越来越复杂,同时也使系统稳定问题越来越突出。无论是电力系统规划、设计还是运行,对其安全稳定进行分析都是极其重要的。

PSD-BPA软件包主要由潮流和暂稳程序构成,具有计算规模大、计算速度快、数值稳定性好、功能强等特点,已在我国电力系统规划、调度、生产运行及科研部门得到了广泛应用。

本实验课程基于PSD-BPA平台,结合《电力系统分析计算机算法》课程,旨在引导学生将理论知识和实际工程相结合,掌握电力系统稳态、暂态分析的原理、分析步骤以及结论分析。清晰认知电力系统分析的意义。

三、原理和说明

1.程序算法

PSD-BPA电力系统分析程序稳态分析主要是潮流计算,软件中潮流程序的计算方法有P_Q分解法,牛顿_拉夫逊法,改进的牛顿-拉夫逊算法。采用什么算法以及迭代的最大步数可以由用户指定。

注:采用P-Q分解法和牛顿-拉夫逊法相结合,以提高潮流计算的收敛性能,程序通常先采用P-Q分解法进行初始迭代,然后再转入牛顿-拉夫逊法求解潮流。

2.程序主要功能

可进行交流系统潮流计算,也可进行包括双端和多端直流系统的交直流混合潮流计算。除了潮流计算功能外,该软件还具有自动电压控制、联络线功率控制、系统事故分析(N-1开断模拟)、网络等值、灵敏度分析、节点P-V、Q-V和P-Q曲线、确定系统极限输送水平、负荷静特性模型、灵活多样的分析报告、详细的检错功能等功能。

3.输入、输出相关文件 *.dat

潮流计算数据文件

*.bse

潮流计算二进制结果文件(可用于潮流计算的输入或稳定计算)*.pfo

潮流计算结果文件

*.map 供单线图格式潮流图及地理接线图格式潮流图程序使用的二进制结果文件

*.pff,*.pfd 中间文件(正常计算结束后将自动删除。不正常时,将留在硬盘上,可随时删除)

pwrflo.dis 储存一个潮流作业计算时屏幕显示的信息。pfcard.def 定义潮流程序卡片格式文件,用户可更改及调整该文件。该文件安装时放在与潮流程序相同的目录中。打开TextEdit应用程序时先读入该文件。4.程序常用控制语句

常用的控制语句主要包括:

(1)指定潮流文件开始的一级控制语句“(POWERFLOW, CASEID=方式名, PROJECT=工程名)”

(2)指定计算方法和最大迭代次数的控制语句“/SOL_ITER, DECOUPLED=PQ法次数, NEWTON=牛拉法次数”;

(3)指定计算结果输出的控制语句“/P_OUTPUT_LIST, „”;(4)指定计算结果输出顺序的控制语句“/RPT_SORT= „”;

(5)指定计算结果分析列表的控制语句“/P_ANALYSIS, LEVEL= ?”;(6)指定潮流结果二进制文件名的控制语句“/NEW_BASE, FILE = 文件名”;

(7)指定潮流图和地理接线图使用的结果文件控制语句“/PF_MAP,FILE=文件名”;

(8)指定网络数据的控制语句“/NETWORK_DATA”;(9)指定潮流数据文件结束的控制语句“(END)”; 5.计算结果介绍(PFO文件)

潮流计算结果文件内容主要分下述几个方面: 1)程序控制语句列表。

2)输入、输出文件及输出的内容列表。

3)错误信息。如为致命性错误,则中断计算。4)误差控制参数列表。5)迭代过程。6)计算结果输出:

详细计算结果列表:按节点、与该节点相联接支路顺序,并根据用户的要求(通过控制语句控制)可按照字母、分区或区域排序输出潮流计算结果。

分析报告列表:并根据用户的要求(通过控制语句控制),输出各种潮流分析报告。

7)错误信息统计。6.算例

IEEE 9节点例题:

图1 IEEE9节点系统接线图

节点参数、线路参数及变压器参数分别见表1~表3。

表1 IEEE 9节点算例节点参数

表2 IEEE 9节点算例线路参数

表3 IEEE 9节点算例变压器参数

注:表1-表3中功率基准值为100MVA;电阻、电感值为标幺值。对应于上述系统及数据的潮流计算数据(IEEE90.DAT)见例1。例1:

(POWERFLOW,CASEID=IEEE9,PROJECT=IEEE_9BUS_TEST_SYSTEM)/SOL_ITER,DECOUPLED=2,NEWTON=15,OPITM=0./P_INPUT_LIST,ZONES=ALL /P_OUTPUT_LIST,ZONES=ALL /RPT_SORT=ZONE /NEW_BASE,FILE=IEEE90.BSE /PF_MAP,FILE = IEEE90.MAP /NETWORK_DATA BS GEN1

16.501 999.999.1.04 B

GEN1

230.01

B

STATIONA 230.01 125.50.0 0.B

STATIONB 230.01 90.30.0 0.B

STATIONC 230.01 100.35.0 0.000 B

GEN2

230.01

BE GEN2

18.001 163.999 10 25 B

GEN3

230.01 BE GEN3

13.801 85.999.1025

.L-----------------transmission lines----------------------------L

GEN1 230.STATIONA230..0100.0850.0440 L

GEN1 230.STATIONA230.2.0100.0850.0440 L

GEN1230.STATIONB230..0170.0920.0395 L

STATIONA230.GEN2230..0320.1610.0765 L

STATIONB230.GEN3230..0390.1700.0895 L

GEN2230.STATIONC230..0085.0720.03725 L

STATIONC230.GEN3230..0119.1008.05225.T-----transformers---------

T

GEN116.5 GEN1230..0576 16.5 230.T

GEN218.0 GEN2230..0625 18.0 230.T

GEN313.8 GEN3230..0586 13.8 230.(END)

四、实验过程及结果

(一)IEEE9节点算例: 1.系统接线图:

2.在BPA软件建立模型,并进行计算,结果如下: 1)系统数据 2)计算过程迭代信息及详细的输出列表:

小结

3.406

-60.2

0.000

28.2

0.000

0.0

3.406

-32.0

--------------

--------------

--------------

--------------

总结

3.406

-60.2

0.000

28.2

0.000

0.0

3.406

-32.0 * 并联无功补偿数据列表

/----------电容器(Mvar)-----------/

/-----------电抗器(Mvar)-------------/

区域/分区

最大容量

使用容量

备用

未安排容量

最大容量

使用容量

备用

未安排容量

01

73.4

73.4

0.0

0.0

0.0

0.0

0.0

0.0

-------

-------

-------

-------

-------

-------

-------

-------

总结

73.4

73.4

0.0

0.0

0.0

0.0

0.0

0.0

TRANSMISSION LINES CONTAINING COMPENSATION

OWN ZONE BUS1

BASE1 ZONE BUS2

BASE2

ID PERCENT

CASE CONTAINS NO TRANSMISSION LINES WITH SERIES COMPENSATION

* 节点相关数据列表

节点

电压

/--------发电--------/ /---负荷----/

/-----无功补偿-----/ 类型 拥有者 分区

电压/角度

kV

MW

MVAR 功率因数

MW

MVAR

使用的存在的未安排

PU/度

发电机1

16.5

16.5

105.4

23.1 0.98

0.0

0.0

0.0

0.0

0.0

S

01

1.000/

0.0

发电机2

18.0

18.0

180.0

40.6 0.98

17.0

8.0

0.0

0.0

0.0

E

01

1.000/

5.4

发电机3

13.8

13.8

85.0

13.8 0.99

0.0

0.0

0.0

0.0

0.0

E

01

1.000/

1.6

母线1

230.0

239.3

0.0

0.0

0.0

0.0

21.6

21.6

0.0

01

1.040/-3.5

母线2

230.0

238.3

0.0

0.0

35.0

10.0

0.0

0.0

0.0

01

1.036/-0.6

母线3

230.0

240.3

0.0

0.0

0.0

0.0

0.0

0.0

0.0

01

1.045/-1.3

母线A

230.0

232.6

0.0

0.0

125.0

70.0

20.5

20.5

0.0

01

1.011/-6.0

母线B

230.0

234.1

0.0

0.0

90.0

40.0

10.4

10.4

0.0

01

1.018/-5.7

母线C

230.0

235.6

0.0

0.0

100.0

55.0

21.0

21.0

0.0

01

1.024/-3.1

--------------

--------------------------------

整个系统

370.4

77.6

367.0

183.0

73.4

73.4

0.0

电容器总和

73.4

73.4

0.0

电抗器总和

0.0

0.0

0.0 * 旋转备用数据列表

------------有功功率-----------

------------------------无功功率-----------------------

区域/分区

最大值

实际出力

备用

最大值

最小值

已发无功

吸收无功

备用

(MW)

(MW)

(MW)

(MVAR)

(MVAR)

(MVAR)

(MVAR)

(MVAR)

01

370.4

370.4

0.0

2997.0

0.0

77.6

0.0

2919.4

-------

-------

------

-------

-------

-------

------

-------

总结

370.4

370.4

0.0

2997.0

0.0

77.6

0.0

2919.4

说明:

1.有功旋转备用不包含所有同步电动机的功率(如 抽水蓄能电机)。

有功出力为负值的发电机(包括电动机)作为负荷处理,不统计在内。

当最大出力值小于实际出力时,统计时最大出力值用实际出力值代替。

2.无功旋转备用不包含同步调相机的无功功率。

无功旋转备用只统计有功出力大于0并且基准电压小于30kV的发电机。

* 潮流计算迭代过程和平衡节点相关信息数据

计算结果收敛。牛顿-拉夫逊法迭代次数为 5次。

各区域平衡机出力数据列表

区域

平衡机

电压

额定有功

有功出力

无功出力

有功负荷

无功负荷

所属分区

SYSTEM

发电机1 16.5

1.000

0.00

105.41

23.11

0.00

0.00

01

* 没有遇到错误信息 23:03:48 3)单线图:

(二)课本习题:E2-5 1.网络接线图:

2.程序:

(POWERFLOW,CASEID=IEEE9,PROJECT=IEEE_9BUS_TEST_SYSTEM)/SOL_ITER,DECOUPLED=2,NEWTON=15,OPITM=0 /P_OUTPUT_LIST,ZONES=ALL /RPT_SORT=ZONE /NEW_BASE,FILE=IEEE90.BSE /PF_MAP,FILE = IEEE90.MAP /NETWORK_DATA.BUS-----------------节点数据-----BS

母线4

999

999

1.050

B

母线1

0.32 0.20

B

母线2

0.56 0.16

BE

母线3

0.5 999

1.10

.L-----------------支路数据-----L

母线1

母线2

0.11 0.40

0.015

L

母线2

母线4

0.08 0.40

0.014

L

母线4

母线1

0.12 0.51

0.019

.T--------------变压器数据,包括普通变压器、移相器、带调节的变压器等。

T

母线1

母线3

0.07 0.35

(END)

3.计算结果

4.系统单线图

五、总结及思考题

实验中遇到的问题及解决方法:

路径错误——————重设各个参数路径 卡片无法识别—————将参数规范化

本次实验使我初步掌握了PSD-BPA软件在电力系统潮流计算中的使用方法,收获良多,为今后的工作打下了基础。获益匪浅。

电力系统潮流计算是研究电力系统稳态运行情况的一种基本计算。它的任务是根据给定的运行条件和网路结构确定整个系统的运行状态,如各母线上的电压(幅值及相角)、网络中的功率分布以及功率损耗等。电力系统潮流计算的结果是电力系统稳定计算和故障分析的基础。

PRIM算法实验报告 篇5

算法实验报告

学院:xxx 班级:xxx 学号:xxx 姓名:xxx prim 篇二:prim最小生成树算法实验报告 算法分析与设计之prim 学院:软件学院 学号:201421031059 姓名:吕吕

一、问题描述 1.prim的定义

prim算法是贪心算法的一个实例,用于找出一个有权重连通图中的最小生成树,即:具有最小权重且连接到所有结点的树。(强调的是树,树是没有回路的)。2.实验目的

选择一门编程语言,根据prim算法实现最小生成树,并打印最小生成树权值。

二、算法分析与设计

1.prim算法的实现过程 基本思想:假设g=(v,e)是连通的,te是g上最小生成树中边的集合。算法从u={u0}(u0∈v)、te={}开始。重复执行下列操作:

在所有u∈u,v∈v-u的边(u,v)∈e中找一条权值最小的边(u0,v0)并入集合te中,同时v0并入u,直到v=u为止。

此时,te中必有n-1条边,t=(v,te)为g的最小生成树。prim算法的核心:始终保持te中的边集构成一棵生成树。2.时间复杂度

prim算法适合稠密图,其时间复杂度为o(n^2),其时间复杂度与边得数目无关,n为顶点数,而看ruskal算法的时间复杂度为o(eloge)跟边的数目有关,适合稀疏图。

三、数据结构的设计 图采用类存储,定义如下: class graph { private: int *verticeslist;int **edge;int numvertices;int numedges;int maxvertices;graph();~graph();bool insertvertex(const int vertex);bool insertedge(int v1,int v2,int cost);int getvertexpos(int vertex);int getvalue(int i);int getweight(int v1,int v2);int numberofvertices();1 public: } void prim();其中,图中结点连接情况及权值使用二重指针表示,即二维数组实现邻接矩阵。

四、代码与运行结果 代码运行结果:

源码:

//普雷姆算法

#include using namespace std;const int maxweight=10000;const int defaultvertices=10000;const int maxedges=10000;const int maxint = 10000000;class graph{ private: int *verticeslist;2 };int numvertices;int numedges;int maxvertices;graph();~graph();bool insertvertex(const int vertex);bool insertedge(int v1,int v2,int cost);int getvertexpos(int vertex);int getvalue(int i);int getweight(int v1,int v2);int numberofvertices();int numberofedges();void prim();void lvlv(graph &g);public: istream& operator>>(istream& in,graph &g);ostream& operator<<(ostream& out,graph &g);//默认构造函数 graph::graph(){ };graph::~graph(){ delete []verticeslist;delete []edge;3 maxvertices=defaultvertices;numvertices=0;numedges=0;int i,j;verticeslist=new int [maxvertices];edge=(int **)new int *[maxvertices];for(i=0;i

int graph::getvalue(int i){ };int graph::getweight(int v1,int v2){ };int graph::numberofvertices(){ };int graph::numberofedges(){ };//插入结点 bool graph::insertvertex(const int vertex){ };//插入边,v1和v2为结点在数组的下标

bool graph::insertedge(int v1,int v2,int cost){

if(v1>-1&&v1-1&&v2=0&&i<=numvertices)?verticeslist[i]:null;return(v1!=-1&&v2!=-1)?edge[v1][v2]:0;return numvertices;return numedges;if(numvertices==maxvertices)return false;verticeslist[numvertices++]=vertex;return true;};} return true;else return false;//输入图信息

istream& operator>>(istream &in ,graph &g){ };//输出图对象

ostream& operator<<(ostream &out,graph &g){ int i,j,vertices,edges;int start,end,weight;vertices=g.numberofvertices();edges=g.numberofedges();out<

in>>vertices>>edges;for(i=1;i<=vertices;i++){ } i=0;while(i>start>>end>>weight;j=g.getvertexpos(start);k=g.getvertexpos(end);if(j==-1||k==-1){} g.insertedge(j,k,weight);i++;cout<

黄冈师范学院 提高型实验报告

实验课题 最小生成树的prim算法

(实验类型:□综合性 ■设计性 □应用性)

实验课程 算法程序设计 实验时间2010年12月24日

学生姓名 周 媛鑫 专业班级 计科 0801 学 号 200826140110 一.实验目的和要求

(1)根据算法设计需要, 掌握连通网的灵活表示方法;(2)掌握最小生成树的prim算法;(3)熟练掌握贪心算法的设计方法;二.实验条件

(1)硬件环境:实验室电脑一台(2)软件环境:wintc 三.实验原理分析

(1)最小生成树的定义:

假设一个单位要在n个办公地点之间建立通信网,则连通n个地点只需要n-1条线路。可以用连通的无向网来表示n个地点以及它们之间可能设置的通信线路,其中网的顶点表示城市,边表示两地间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以表示一个通信网。其中一棵使总的耗费最少,即边的权值之和最小的生成树,称为最小生成树。

(2)构造最小生成树可以用多种算法。其中多数算法利用了最小生成树的下面一种简称为mst的性质:假设n=(v,{e})是一个连通网,u是顶点集v的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈u,v∈v-u,则必存在一棵包含边(u.v)的最小生成树。(3)普里姆(prim)算法即是利用mst性质构造最小生成树的算法。算法思想如下: 假设n=(v,{e})和是连通网,te是n上最小生成树中边的集合。算法从u={u0}(u0∈v),te={}开始,重复执行下述操作:在所有u∈u,v∈v-u的边(u, v)∈e中找一条代价最小的边(u0, v0)并入集合te,同时v0并入u,直到u=v为止。此时te中必有n-1条边,则t=(v,{te})为n的最小生成树。四.实验步骤

(1)数据结构的设计 :

采用邻接矩阵的存储结构来存储无向带权图更利于实现及操作: 邻接矩阵的抽象数据结构定义: #defineinfinityint_max //最大值

#define max_ertex_num20 //最大顶点数

typedef enum {dg,dn,udg,udn}graphkind;//{有向图,有向网,无向网,无向图} typedef struct arc cell{ vrtype adj;// vrtype 是顶点关系的类型。对无权图用1和0表示相邻否; infotype * info;//该弧相关信息的指针

}arccell,adjmatrix [ max_vertex_num][max_vertex_num]; typedef struct { vertextype vexs [ max_vertex_num];//顶点向量adjmatrixarcs;// 邻接矩阵 intvexnum , arcnum;//图的当前顶点数和弧数 graphkindkind;// 图的种类标志 }mgraph;(2)函数设计

函数名称 函数原型 功能描述

main()int main(void)系统调用主函数 huiru()void huitu()绘制无向图

graphicver()void graphicver(graph *g)输出邻接矩阵 prim()void prim(graph *g)prim算法演示(3)实验源代码

操作系统银行家算法实验报告 篇6

实验报告书

课程名:《

操作系统原理A

目:

虚拟存储器管理

页面置换算法模拟实验

级:

号:

名:

评语:

成绩:

指导教师:

批阅时间:

****年**月**日

一、实验目的与要求

1.目的:

请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。

2.要求:

本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。

二、实验说明

1.设计中虚页和实页的表示

本设计利用C语言的结构体来描述虚页和实页的结构。

pn

pfn

time

pn

pfn

next

虚页结构

实页结构

在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。

在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。

2.关于缺页次数的统计

为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。最终命中率=count/20*100%。

3.LRU算法中“最近最久未用”页面的确定

为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值,表示该虚页的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实页的虚页中找出time值为最小的虚页就是“最近最久未用”的虚页面,应该将它置换出去。

4.算法中实页的组织

因为能分配的实页数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实页。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实页,首指针为free_head,初始时n个实页都处于free链表中;busy链表用于组织已分配出去的实页,首指针为busy_head,尾指针为busy_tail,初始值都为null。当所要访问的一个虚页不在实页中时,将产生缺页中断。此时若free链表不为空,就取下链表首指针所指的实页,并分配给该虚页。若free链表为空,则说明n个实页已全部分配出去,此时应进行页面置换:对于FIFO算法要将busy_head

所指的实页从busy链表中取下,分配给该虚页,然后再将该实页插入到busy链表尾部;对于LRU算法则要从所有已分配实页的虚页中找出time值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。

三、程序流程图

四、主要程序清单

#include

#include

/*全局变量*/

int

mSIZE;

/*物理块数*/

int

pSIZE;

/*页面号引用串个数*/

static

int

memery[10]={0};

/*物理块中的页号*/

static

int

page[100]={0};

/*页面号引用串*/

static

int

temp[100][10]={0};

/*辅助数组*/

/*置换算法函数*/

void

FIFO();

void

LRU();

void

OPT();

/*辅助函数*/

void

print(unsigned

int

t);

void

designBy();

void

download();

void

mDelay(unsigned

int

Delay);

/*主函数*/

void

main()

{

int

i,k,code;

printf(“请输入物理块的个数(M<=10):“);

scanf(“%d“,&mSIZE);

printf(“请输入页面号引用串的个数(P<=100):“);

scanf(“%d“,&pSIZE);

puts(“请依次输入页面号引用串(连续输入,无需隔开):“);

for(i=0;i

scanf(“%1d“,&page[i]);

download();

do

{

puts(“输入的页面号引用串为:“);

for(k=0;k<=(pSIZE-1)/20;k++)

{

for(i=20*k;(i

{

if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

printf(“%d\n“,page[i]);

else

printf(“%d

“,page[i]);

}

}

printf(“*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*\n“);

printf(“*

请选择页面置换算法:\t\t\t

*\n“);

printf(“*

-----------------------------------------*\n“);

printf(“*

1.先进先出(FIFO)

2.最近最久未使用(LRU)

*\n“);

printf(“*

3.退出

*\n“);

printf(“*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*\n“);

printf(“请选择操作:[

]\b\b“);

scanf(“%d“,&code);

switch(code)

{

case

1:

FIFO();

break;

case

2:

LRU();

break;

case

3:

OPT();

break;

case

4:

system(“cls“);

//system(“color

0A“);

exit(0);

default:

printf(“输入错误,请重新输入:“);

}

printf(“按任意键重新选择置换算法:>>>“);

getchar();

}

while

(code!=4);

getchar();

}

/*载入数据*/

void

download()

{

printf(“\nFinish.\n载入成功!“);

}

/*设置延迟*/

void

mDelay(unsigned

int

Delay)

{

unsigned

int

i;

for(;Delay>0;Delay--)

{

for(i=0;i<124;i++)

{

printf(“

\b“);

}

}

}

/*显示设计者信息*/

void

print(unsigned

int

t)

{

int

i,j,k,l;

int

flag;

for(k=0;k<=(pSIZE-1)/20;k++)

{

for(i=20*k;(i

{

if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

printf(“%d\n“,page[i]);

else

printf(“%d

“,page[i]);

}

for(j=0;j

{

for(i=20*k;(i{

if(i>=j)

printf(“

|%d|“,temp[i][j]);

else

printf(“

|

|“);

}

for(i=mSIZE+20*k;(i

{

for(flag=0,l=0;l

if(temp[i][l]==temp[i-1][l])

flag++;

if(flag==mSIZE)/*页面在物理块中*/

printf(“

“);

else

printf(“

|%d|“,temp[i][j]);

}

/*每行显示20个*/

if(i%20==0)

continue;

printf(“\n“);

}

}

printf(“----------------------------------------\n“);

printf(“缺页次数:%d\t\t“,t+mSIZE);

printf(“缺页率:%d/%d\n“,t+mSIZE,pSIZE);

printf(“置换次数:%d\t\t“,t);

printf(“访问命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE);

printf(“----------------------------------------\n“);

}

/*计算过程延迟*/

void

compute()

{

int

i;

printf(“正在进行相关计算,请稍候“);

for(i=0;i++<30;printf(“\b“));

for(i=0;i++<30;printf(“

“));

for(i=0;i++<30;printf(“\b“));

}

/*先进先出页面置换算法*/

void

FIFO()

{

int

memery[10]={0};

int

time[10]={0};

/*记录进入物理块的时间*/

int

i,j,k,m;

int

max=0;

/*记录换出页*/

int

count=0;

/*记录置换次数*/

/*前mSIZE个数直接放入*/

for(i=0;i

{

memery[i]=page[i];

time[i]=i;

for(j=0;j

temp[i][j]=memery[j];

}

for(i=mSIZE;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!=page[i])

k++;

}

if(k==mSIZE)

/*如果不在物理块中*/

{

count++;

/*计算换出页*/

max=time[0]

for(m=2;m

if(time[m]

max=m;

memery[max]=page[i];

time[max]=i;

/*记录该页进入物理块的时间*/

for(j=0;j

temp[i][j]=memery[j];

}

else

{

for(j=0;j

temp[i][j]=memery[j];

}

}

compute();

print(count);

}

/*最近最久未使用置换算法*/

void

LRU()

{

int

memery[10]={0};

int

flag[10]={0};

/*记录页面的访问时间*/

int

i,j,k,m;

int

max=0;

/*记录换出页*/

int

count=0;

/*记录置换次数*/

/*前mSIZE个数直接放入*/

for(i=0;i

{

memery[i]=page[i];

flag[i]=i;

for(j=0;j

temp[i][j]=memery[j];

}

for(i=mSIZE;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!=page[i])

k++;

else

flag[j]=i;

/*刷新该页的访问时间*/

}

if(k==mSIZE)

/*如果不在物理块中*/

{

count++;

/*计算换出页*/

max=flag[0]

for(m=2;m

if(flag[m]

max=m;

memery[max]=page[i];

flag[max]=i;

/*记录该页的访问时间*/

for(j=0;j

temp[i][j]=memery[j];

}

else

{

for(j=0;j

temp[i][j]=memery[j];

}

}

compute();

print(count);

}

/*最佳置换算法*/

void

OPT()

{

int

memery[10]={0};

int

next[10]={0};

/*记录下一次访问时间*/

int

i,j,k,l,m;

int

max;

/*记录换出页*/

int

count=0;

/*记录置换次数*/

/*前mSIZE个数直接放入*/

for(i=0;i

{

memery[i]=page[i];

for(j=0;j

temp[i][j]=memery[j];

}

for(i=mSIZE;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!=page[i])

k++;

}

if(k==mSIZE)

/*如果不在物理块中*/

{

count++;

/*得到物理快中各页下一次访问时间*/

for(m=0;m

{

for(l=i+1;l

if(memery[m]==page[l])

break;

next[m]=l;

}

/*计算换出页*/

max=next[0]>=next[1]?0:1;

for(m=2;m

if(next[m]>next[max])

max=m;

/*下一次访问时间都为pSIZE,则置换物理块中第一个*/

memery[max]=page[i];

for(j=0;j

temp[i][j]=memery[j];

}

}

if(k==mSIZE)

/*如果不在物理块中*/

{

count++;

/*得到物理快中各页下一次访问时间*/

for(m=0;m

{

for(l=i+1;l

if(memery[m]==page[l])

break;

next[m]=l;

}

/*计算换出页*/

max=next[0]>=next[1]?0:1;

for(m=2;m

if(next[m]>next[max])

max=m;

/*下一次访问时间都为pSIZE,则置换物理块中第一个*/

memery[max]=page[i];

for(j=0;j

temp[i][j]=memery[j];

}

}

五、程序运行结果

①FIFO

②LRU

六、实验体会

在做该次作业的时候,通过对课本相关内容的温习,以及对自己在网络上找到的一些资源的了解。我对操作系统中页面调度的算法有了很大程度的了解,加深了对课程上知识的理解,也懂得了如何在程序中将这些算法实现,在程序中基本上实现了所要求的算法以及相关的性能分析,基本上实现了课程的要求。

操作系统银行家算法实验报告 篇7

教育部高等学校大学计算机课程教学指导委员会在2013年明确提出将“计算思维能力的培养”作为计算机基础教学的核心任务[1],虽然计算思维外延广泛,但算法设计类课程始终是最受关注的实践途径[2,3,4]。算法类课程通常以代码编写作为主要教学内容,但如果学生没有建立正确的算法分析和设计思路,其代码编写过程只能是盲目模仿教学案例,而且代码编写的繁琐以及对于书写规范的高要求也使得很多学生对程序设计课程产生抵触心理,严重影响学习兴趣和学习效果。为了让学生在初步接触算法设计时先着重计算思维,减少代码复杂语法规范的干扰,采用图形化的算法建模与分析教学训练是很有意义的。

徐冬梅[5]提出了在程序设计课程教学中引入以数据意识和算法可行性为切入点的教学方法,提出利用推动思维、注重风格的教学理念来提高教学效率。陈杰华等[3]提出了在程序设计课程中以培养算法思维为核心的教学理念,并提出改革实验教学模式和倡导算法多样化2种途径。唐棣等[7]认为采用可视化教学方法,对改变教师的教授方式、帮助学生理解程序设计算法有着积极的作用和影响。上述研究都针对程序设计课程的特点和教学现状,提出了加强学生算法思维培养的理念,但更多地注重于理论的探索。

为了寻找配套的教学工具,可视化编程的关注度也越来越高,诸多公司和学者都对可视化编程平台进行了探索。徐小良等在开发图形化编程平台中提出了基于改进数据流语言的程序运行算法[8],并实现了面向虚拟仪器系统的图形化编程软件平台[9]。尹华祥等提出了将图形化编程中的互不依赖的模块翻译成为可并行执行的多线程程序的方法[10]。上述研究提出了可视化编程平台的搭建方法,但是没有推出适合于教学实践的可视化编程教学平台。另外也有一些公司推出了可视化编程软件。现有的代表性软件有微软公司推出的Visual Studio系列、美国宝兰公司推出的Delphi等,它们都给用户提供了良好的可视化的编程环境。这些软件虽然都提供了良好的编程环境,可是仍旧需要使用者具有一定的编程能力,而教师也无法对学生的软件作业过程进行更好的监控。

为了解决上述现有研究存在的问题,本文研究并设计了一种基于Web的算法可视化建模与分析的实验教学系统,旨在通过图形化的程序设计方式使学生可以抛开代码的束缚,着重培养算法逻辑思维能力。教师通过实验教学系统强大的监控与评价体系,可以改进程序设计课程教学计划,提高教学效率。

二、系统总体设计

本教学平台是在tomcat环境中,利用Java Script语言实现算法流程图的绘制和自动翻译为C语言代码的动态网页界面,同时能实现教师和学生之间的实时交互。不仅可以满足学生的程序设计课程学习需求,也可以支持教师上传作业要求、批阅作业的需求。

系统物理框架共为三层,即用户层、应用层和数据层。在用户层,用户可通过前端界面选择想要的功能。学生可以通过前端页面选择查看作业要求、绘制流程图、流程图自动生成代码、上交作业、修改作业等功能,教师可以通过前端页面选择上传作业要求、批阅作业、查看学生操作记录等功能。在应用层,程序会根据用户的输入和选择的功能进行分析运算,将结果返回给前端页面或存储至数据库。在数据层,支持数据的存储和查询功能,系统会根据用户的选择,向数据库存储数据,或从数据库中读取相应内容,显示到用户层[11]

。物理结构示意图如图1所示。

三、技术方案设计和实现

(一)算法可视化建模页面开发

本系统以流程图作为算法的可视化模型,画图页面是学生的主要操作界面,基于Mxgraph图形组件开发。Mxgraph是一个JS绘图组件,提供了丰富的网页集成接口结合Java Script、CSS等编程语言,可以在Web页面实现标准格式的Workflow/BPM流程图、图表和网络图绘制功能。

(二)用户记录监控

1. 操作记录监控的实现

为了让教师更好地了解学生的思维方式,能够分析学生的操作过程,系统提供了用户操作记录的监控功能。学生在应用程序界面的每一步操作都会被记录在相关参数中。

由于Mxgraph绘图组件并没有提供精确捕捉图形变化的相关事件接口,本教学平台在实现中采取了基于数据对比的间接记录方法。Mxgraph以xml格式记录流程图数据,只要精确比对某个绘制操作前后的数据内容就可以完整提取操作记录,主要实现方案如下:以鼠标事件触发对流程图数据文件的比较判断,通过响应函数获得以mx Cell为子标签的xml结构,用DOM提取页面元素的数量和属性对应的模块数据。在流程图形式下,用户绘图操作引起的数据变化主要包括如下几种情况:连线和框图数量的变化、连线和框图位置的移动、连线和框图属性值的变化,将这些变化信息组合成特定格式的操作内容数据,并添加相应的操作时间标签,就形成了操作记录。记录以AJAX的请求服务方式传递至数据库Record表中,以文本字段进行储存,方便教师在相关界面查看记录数据。记录数据辅助教师进行课堂管理、调整教学进度和课程总结分析,加强师生间交流。

2. 代码自动生成

学生通过绘制流程图建立算法思路后,可以利用系统提供的代码自动生成功能将流程图自动生成可以对应的C语言代码,从而将流程图的绘制与代码的学习结合起来。代码自动生成的实现依靠对流程图xml数据的解析。

流程图对应的xml数据包含了流程图的结构信息和属性信息。结构信息是指流程图各图框之间的连接关系,属性信息是指线的属性信息和图框的各种属性值。客户端通过Java Script代码获取流程图的xml,通过建立模型分析xml,得到流程图对应的C语言代码,模型主要分为3个部分。

(1)生成邻接矩阵

通过建立邻接矩阵来存储xml的结构信息,包括框与框之间的连接情况和框与框之间的指向关系。用0和1来表示框与框之间的连接情况,0表示无连接,1表示有连接。用矩阵的行和列的区别来表示框与框之间的指向关系。

(2)生成最长路径

这里我们需要分析(1)中的邻接矩阵得到流程图的路径。邻接矩阵中一行只有一个1的框之间可以很容易的得到路径,因为那些框之间是单一指向关系。可是我们可以发现邻接矩阵中还存在某一行或某一列出现两个1的情况,这说明该框可以是两个框的起点,而只有菱形框可以作为两个框的起点。菱形框在流程图中可以作为判断结构的开始,或者是循环结构的开始或结束。基于此我们提出如下生成路径的方法:首先得到流程图的最短路径,然后对其中的菱形框进行路径的扩充,最后得到所有菱形框都进行路径扩充后的完整路径。那么接下来的问题就是如何扩充以菱形框为开始的路径。

若菱形框是某个循环结构的开始,那么最后肯定会回到自身,若是判断结构的开始则不会回到自身。路径的最后一个框一定是菱形框或结束框,由于每个菱形框都会指向两个框,所以以菱形框为开始的路径条数是菱形框个数的两倍。

(3)生成C语言代码

在(2)中得到的完整路径的基础上,结合每个框的属性信息,提取其value值,根据C语言在顺序结构、循环结构、分支结构中的特点,如矩形框和菱形框代表不同的语句,菱形框在判断结构和循环结构中也代表不同的语句,最终生成流程图对应的C语言代码。

四、系统使用效果

本系统已应用于武汉理工大学地理信息科学专业《GIS算法与数据结构》课程实验中,并已在国家版权局进行了软件著作权登记。课程总共应用该系统进行了4次实验,每次实验参与学生人数为56人,操作数的总体情况如下表所示,同时我们对学生操作过程的时间间隔特征进行了“对数-频数”统计分析,如图2所示,统计结果体现出明显的幂律分布特征,根据行为统计学理论可以定性证明学生实验过程受一种有意识的理性行为所驱动[12],从侧面体现出实验所发挥的思维训练功能。

五、结语

本文介绍了一套高效的GIS算法设计实验平台,旨在利用图形化建模技术培养学生的算法思维。通过教学实践和基于实验数据开展的实验行为量化分析表明,该平台有效避免了程序设计语言代码的干扰作用,简化了算法思维的表达和应用过程,增强了学生对程序设计的兴趣和操作能力。本文是对非计算机专业算法课程教学手段的一次新探索,今后将在监控数据的基础上进一步研究实验行为分析方法,从思维认知层面开展深入的学习效能评估。

摘要:算法设计课程是计算思维培养的重要途径,利用图形化模型表达算法往往更易于学生理解,使之规避语法干扰,专注于思维训练。本文提出了基于B/S模式的算法图形化建模与分析实验教学系统。该系统利用Java Script、PHP等编程语言,对Mx Graph进行二次开发,在Web环境下实现了标准格式的流程图绘制功能。通过嵌入代码自动生成算法的代码,系统自动根据流程图模型生成对应的C语言代码,并实时监控记录学生的操作。通过上述功能,为算法设计课程提供了新的教学手段,对学生建立算法思路和层次化分析方法进行有效培养,并能辅助教师进行实验过程管理和研究。

上一篇:打造高效课堂的总结二下一篇:卫生与健康工作方案