Anylogic油码头仿真:按指定概率生成不同尺寸船舶的实现问询
解决AnyLogic中按概率生成不同类型船舶的问题
Hey there!作为AnyLogic新手碰到这个概率分配的问题太正常了,我来一步步带你实现按60%A、25%B、15%C的比例生成不同尺寸的船舶~
第一步:创建船舶Agent类型
首先你需要定义一个带类型标识的船舶Agent,方便后续区分:
- 右键项目面板里的「Agents」→「New Agent Type」,命名为
Ship - 在
Ship的参数面板里,添加一个枚举类型的参数(推荐用枚举,比字符串更严谨):- 点击「Add」→选择「Enumeration」,命名为
shipType - 点击枚举参数的「Edit」按钮,添加三个选项:
TYPE_A、TYPE_B、TYPE_C(或者直接用中文「A型」「B型」「C型」)
- 点击「Add」→选择「Enumeration」,命名为
- 如果你需要给不同类型船舶设置不同尺寸/属性,可以再添加对应的参数(比如
length、unloadDuration等)
第二步:确认到达间隔设置
你已经搞定了船舶到达间隔,这里再确认下:
- 选中Source模块,在「Arrival」选项卡下,选择「Interval」模式
- 间隔表达式填写
uniform(4, 18)(因为11±7小时,也就是4到18小时的均匀分布)
第三步:按概率分配船舶类型(两种方法任选)
方法一:直接用随机数判断(快速上手)
这种方法适合快速实现,不需要额外定义变量:
- 选中Source模块,切换到「Actions」选项卡
- 在「On agent creation」的代码框里输入:
double randomProb = random(); Ship shipAgent = (Ship)agent; if(randomProb < 0.6) { shipAgent.shipType = Ship.shipType.TYPE_A; } else if(randomProb < 0.85) { // 0.6+0.25=0.85 shipAgent.shipType = Ship.shipType.TYPE_B; } else { shipAgent.shipType = Ship.shipType.TYPE_C; }
注意:如果你的枚举参数用的是中文,把
Ship.shipType.TYPE_A换成对应的中文值即可
方法二:用离散分布(更规范,便于后续维护)
这种方法适合需要频繁调整概率或者有更多类型的场景:
- 在Main模块的「Variables」面板里,添加一个变量:
- 类型选择
DiscreteDistribution<Ship.shipType>,命名为shipTypeDistribution
- 类型选择
- 切换到Main的「Actions」选项卡,在「On startup」里初始化分布:
shipTypeDistribution.add(Ship.shipType.TYPE_A, 0.6); shipTypeDistribution.add(Ship.shipType.TYPE_B, 0.25); shipTypeDistribution.add(Ship.shipType.TYPE_C, 0.15);
- 回到Source模块的「On agent creation」代码框,输入:
((Ship)agent).shipType = shipTypeDistribution.sample();
第四步:给不同类型船舶设置不同尺寸(可选)
如果需要让不同类型的船舶有不同的尺寸属性,可以在ShipAgent的「Actions」选项卡→「On startup」里添加代码:
switch(shipType) { case TYPE_A: length = 150; // 假设A型船长度150米 break; case TYPE_B: length = 200; // B型船长度200米 break; case TYPE_C: length = 250; // C型船长度250米 break; }
这样你就能完美实现按概率生成不同类型的船舶啦!
内容的提问来源于stack exchange,提问作者M0squito
相关产品推荐
相关产品推荐

