
在仿真建模中,为模拟对象(如订单、任务等)动态分配属性是常见的需求。特别是在作业车间或生产线模型中,订单的截止日期(due date)往往需要根据特定规则生成。当需要从一组预定义的、离散的时间点中均匀随机选择截止日期时,需要采用特定的随机数生成方法结合时间处理机制。
在许多情况下,我们可能首先会尝试设置一个固定的截止日期。例如,将所有订单的截止日期设置为当日的18:00:00 PM。以下是一个常见的实现方式,它使用Java的Calendar类来构建时间对象:
Order order = new Order(); // 创建一个新的订单对象 Calendar cal1 = Calendar.getInstance(); // 获取当前日历实例 cal1.set(Calendar.HOUR_OF_DAY, 18); // 设置小时为18 cal1.set(Calendar.MINUTE, 0); // 设置分钟为0 cal1.set(Calendar.SECOND, 0); // 设置秒为0 cal1.set(Calendar.MILLISECOND, 0); // 设置毫秒为0 order.atrDueDate1 = cal1.getTime(); // 将设置好的时间赋值给订单的截止日期属性 order.atrID = 10; // 设置订单ID order.markParametersAreSet(); // 标记参数已设置(AnyLogic特定方法) // enter.take(order); // 将订单送入流程(AnyLogic特定方法)
这种方法虽然能成功设置固定截止日期,但无法满足从多个时间点随机选择的需求。
要实现从一组固定时间点(例如18:00、19:00、20:00、21:00)中均匀随机选择截止日期,关键在于利用离散均匀分布的随机数生成器来决定小时数。
假设我们正在使用AnyLogic仿真软件,它提供了内置的uniform_discr(min, max)函数,可以生成min和max(包含)之间的整数,且每个整数出现的概率相同。
Order order = new Order(); // 创建一个新的订单对象 Calendar cal1 = Calendar.getInstance(); // 获取当前日历实例 // 关键步骤:使用 uniform_discr 函数随机选择小时数 // uniform_discr(18, 21) 将会以相同的概率返回 18, 19, 20 或 21 cal1.set(Calendar.HOUR_OF_DAY, uniform_discr(18, 21)); cal1.set(Calendar.MINUTE, 0); // 设置分钟为0 cal1.set(Calendar.SECOND, 0); // 设置秒为0 cal1.set(Calendar.MILLISECOND, 0); // 设置毫秒为0 order.atrDueDate1 = cal1.getTime(); // 将设置好的时间赋值给订单的截止日期属性 order.atrID = 10; // 设置订单ID order.markParametersAreSet(); // 标记参数已设置 // 最佳实践:创建并启动代理 order.createAndStart(main); // 将新创建的订单代理添加到主模型中并启动
代码解释:
如果不在AnyLogic环境中使用,而是纯Java环境,可以使用java.util.Random类来实现离散均匀分布:
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
public class OrderGenerator {
// 假设 Order 类和 atrDueDate1 属性已定义
static class Order {
Date atrDueDate1;
int atrID;
// 模拟 AnyLogic 的方法,实际Java应用中可能不同
void markParametersAreSet() { /* ... */ }
void createAndStart(Object main) { /* ... */ }
}
public static void main(String[] args) {
Random random = new Random();
int minHour = 18;
int maxHour = 21; // 包含21
for (int i = 0; i < 5; i++) { // 生成5个订单作为示例
Order order = new Order();
Calendar cal1 = Calendar.getInstance();
// 生成 minHour 到 maxHour 之间的随机整数(包含maxHour)
int randomHour = random.nextInt(maxHour - minHour + 1) + minHour;
cal1.set(Calendar.HOUR_OF_DAY, randomHour);
cal1.set(Calendar.MINUTE, 0);
cal1.set(Calendar.SECOND, 0);
cal1.set(Calendar.MILLISECOND, 0);
order.atrDueDate1 = cal1.getTime();
order.atrID = 100 + i;
order.markParametersAreSet();
// order.createAndStart(null); // 在纯Java环境中可能需要不同的处理方式
System.out.println("Order ID: " + order.atrID + ", Due Date: " + order.atrDueDate1);
}
}
}在AnyLogic等基于代理的仿真环境中,创建新的代理(Agent)并将其正确地集成到模型中是至关重要的。仅仅实例化一个对象(new Order())是不够的,还需要调用特定的方法来将其添加到模型运行时并启动其行为逻辑。
order.createAndStart(main); 这行代码就是实现这一点的关键。它确保:
始终遵循仿真框架提供的代理创建和启动机制是保证模型正确性和健壮性的最佳实践。
通过上述方法,您可以有效地在模拟环境中为订单生成均匀随机分布于一组固定时间点的截止日期,同时遵循代理创建的最佳实践,确保模型的正确运行和数据的一致性。
以上就是模拟环境中随机生成订单截止日期:均匀分布于固定时间点的方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号