3.1 ADT设计方案
设计了哪些ADT、各自的作用、属性、方法;
给出每个ADT的specification;
(可选)以类图形式给出多个类之间的关系。
//梯子类
public class Ladder {
int h;//台阶数
int ladder[];//台阶,记录猴子,没有则为-1
int number;//编号
右转
public synchronized int turnright(int i,Monkey a)
左转
public synchronized int turnleft(int i,Monkey a)
public synchronized void clear()
//猴子类
public class Monkey {
int id;//编号
String direction;//方向
int v;//速度
int weizhi;//位置
int time;//时间
public class MonkeyGenerator extends Thread {
public void run(int t,int k,int mv,int h)
{
}
public Vector<Monkey> Generator(int t,int k,int mv,int h)
//猴子产生器,根据输入产出猴子
public class Strategy1 {
/**
* 选择没有猴子的梯子
* @param ladders
* @return
/
public static Ladder choose(Vector ladders)
/*
* 优先选择没有猴子的梯子,若所有梯子上都有猴子,则在岸 边等待,直到某个梯子空闲出来;
* @param ladders
* @return
*/
public class Strategy2 {
public static Ladder choose(Vector ladders, Vector monkeys, Monkey a)
模拟器类
public class Simulator1 {
int n;
int h;
int t;
int N;
int k;
int mv;
Vector ladders;
Vector monkeys;
boolean[] end;
public boolean hasfinished()
public int turn(Monkey a, Ladder b)调用梯子类里的函数,直接封装起来,根据猴子方向来判断怎么走,要是到达返回-1,停止返回-2,否则返回去的梯子号
public void firststep(Monkey a, Ladder b)根据猴子方向确定第一步
public void simulate1()方案1模拟器
public void simulate1()方案2模拟器
3.2 {Monkey线程的run()的执行流程图
这里无需考虑具体采用的梯子选择策略。
没选到,wait
可以走,就继续走
若前面一格有东西就wait,要是他所在位置加上他的速度有东西,就改变其速度并前进
3.3 至少两种“梯子选择”策略的设计与实现方案
3.3.1 策略1
看所有梯子,要是没有空的就等待,直到有空的
3.3.2 策略2
优先选择没有猴子的梯子,若所有梯子上都有猴子,则在岸 边等待,直到某个梯子空闲出来
3.3.3 策略3(可选)
3.4 “猴子生成器”MonkeyGenerator
根据输入的猴子数量和此时的标号来实现,即已知总猴子数N,每次生成k个猴子,然后休息t秒
3.5 如何确保threadsafe?
每次猴子使用梯子移动时都占用该梯子,其次在选择时也要占用所有梯子,同时在占用时调用firststep函数,让猴子上梯子。避免多个猴子因未及时修改梯子而同时上梯子。
3.6 系统吞吐率和公平性的度量方案
吞吐率:存在时间最长的猴子其存在时间为m,猴子总数N,其吞吐率=N/m
公平性: ⚫ “公平性”是指:如果 Monkey 对象 A 比 B 出生得早,那么 A 应该不 晚于 B 抵达对岸,则为“公平”;若 A 比 B 晚到对岸,则为“不公 平”。设 A 和 B 的产生时间分别为??和??,抵达对岸的时间分别为?? 和??,那么公平性?(?, ?) = { 1, ?? (?? − ?? ) ∗ (?? − ?? ) ≥ 0 −1, ??ℎ?????? 。对? 只猴子两两计算其之间的公平性并综合到一起,得到本次模拟的整体 公平性? = ∑ ?(?,?) (?,?)∈Θ C? 2 , Θ = {(?, ?)|? ≠ ?, (?, ?) ∉ Θ},其取值范围 为[−1,1]
3.7 输出方案设计
日志
用log日志来记录下三种情况: ⚫ 正在左(右)岸等待,离出生已?秒 ⚫ 正在第?架梯子的第?个踏板上,自左向右(自右向左)行进,离出 生已?秒 ⚫ 已从左(右)岸抵达右(左)岸,共耗时?秒
GUI
用可视化来实现,最后在gui上输出吞吐率和公平性
可视化(可选)
3.8 猴子过河模拟器v1
3.8.1 参数如何初始化
采用手动输入的方式
3.8.2 使用Strategy模式为每只猴子选择决策策略
设计Strategy设计模式,根据选择里调用不同的猴子选择策略。
3.9 猴子过河模拟器v2
在不同参数设置和不同“梯子选择”模式下的“吞吐率”和“公平性”实验结果及其对比分析。
3.9.1 对比分析:固定其他参数,选择不同的决策策略
3.9.2 对比分析:变化某个参数,固定其他参数
让ℎ = 20,? = 3,? = 10,? = 3,?? = 5,变化?分别 为 1、2、3、4、5
让n=6,h=20,? = 3,? = 10,? = 3,?? ,变化mv,进行五次实验,对比五次的性能。
让n=6,h=20,mv= 3,? = 10,? = 3,?? ,变化t,进行五次实验,对比五次的性能。
让ℎ = 20,? = 3,? = 10,? = 3,?? = 5,n=6,变化k分别 为 1、2、3、4、5,进行五次实验,对比五次的性能。
让ℎ = 20,? = 3,? = 10,? = 3,?? = 5,n=6,变化N,进行五次实验,对比五次的性能
3.9.3 分析:吞吐率是否与各参数/决策策略有相关性?
没有,吞吐率显然与参数无关,与决策有关
3.9.4 压力测试结果与分析
大量猴子的情况下
Simulator1 aSimulator1 =new Simulator1(6,10, 3, 50, 3,6);
吞吐率=1.2820512820512822
公平性=0.05061224489795919
猴子的吞吐率边高,因为大量猴子时会有很多猴子在岸边等待
速度很快时
Simulator1 aSimulator1 =new Simulator1(6,20,3, 25, 5,15);
吞吐率=0.5555555555555556
公平性=0.47619047619047616
会有很多猴子在梯子上面停留的时间很短。
3.10 猴子过河模拟器v3
针对教师提供的三个文本文件,分别进行多次模拟,记录模拟结果。
吞吐率 公平性
Competiton_1.txt
第1次模拟 0.47619 -0.13333
第2次模拟 0.476190476
0.4
…
第10次模拟 0.357143
0.933333333
平均值 0.436508
0.400001
Competiton_2.txt
第1次模拟 0.238095 -0.488888889
第2次模拟 0.4761904 0.0952
…
第10次模拟 0.5 -0.21333
平均值 0.404762
-0.20233963
Competiton_3.txt
第1次模拟 0.263158
0.133333
第2次模拟 0.30303
-0.04444
…
第10次模拟 0.416667
0.488889
平均值 0.327618
0.192593