我想实现这样的逻辑:
while (count loading_docks with [status == "free"] > 0 and trucks with [status == "free" and type == "20'" and capacity < 1000] > 0) {
match a truck satisfying above 3 condidtions to a free dock for unloading cargo;
}
可以看出,查询需要在while循环中重复调用和更新,第二个查询由3个条件组成(这对于AndQuery()方法来说并不容易)。
这在Netlogo中很容易实现。在就餐中,最合适、最短的方式是什么?
更新-初始尝试
public void match_dock() {
for (Truck t: this.getTruck_queue()) {
if (this.Count_freeDock() > 0) {
Query<Object> fit_dock = new AndQuery(
new PropertyEquals(context, "status", 1),
new PropertyGreaterThanEquals(context, "max_veh", t.getTruck_type()));
double min = 10000;
Dock match = null;
for(Object o: fit_dock.query()) {
if (((Dock)o).getMax_veh() < min) {
match = (Dock)o;
}
}
match.setStatus(2);
match.getServe_list().add(t.getReq_id());
t.setServe_dock(match.getId());
// if (t.getServe_dock() != -1) {
// this.getTruck_queue().remove(t);
// }
}
}
}
public int Count_freeDock() {
List<Dock> free_list = new ArrayList<Dock>();
Query<Object> free_dock = new PropertyEquals<Object>(context, "status", 1);
for (Object o : free_dock.query()) {
if (o instanceof Dock) {
free_list.add((Dock)o);
}
}
return free_list.size();
}
有三个问题需要解决:
1) 对特定代理集的查询必须考虑三个条件;AndQuery只包含两个条件。是否存在允许同时考虑两个以上条件的查询方法?
当前问题:
Query<Object> pre_fit = new AndQuery(
new PropertyEquals(context, "status", 1),
new PropertyGreaterThanEquals(context, "max_veh", t.getTruck_type()));
Query<Object> fit_dock = new AndQuery(pre_fit, new PropertyEquals(context, "ops_type", 3));
两个条件的初始组合工作良好,查询速度较快。然而,当我添加第三个条件“ops_type”时,查询速度变得非常慢。背后的原因是什么?或者这是构成三个条件的正确方法?
2) 除了编写自定义计数函数(如示例所示),是否还有更简单的方法来查询特定代理集的大小(计数)?
3) 将查询的代理集添加(或复制)到列表中以进行相关列表操作的最短方法是什么?
更新整个代码块:
public void match_dock() {
Iterator<Truck> truck_list = this.getTruck_queue().iterator();
while(truck_list.hasNext() && this.Count_freeDock() > 0) {
Truck t = truck_list.next();
// Query<Object> pre_fit = new AndQuery(
// new PropertyEquals(context, "status", 1),
// new PropertyGreaterThanEquals(context, "max_veh", t.getTruck_type()));
// Query<Object> ops_fit = new OrQuery<>(
// new PropertyEquals(context, "ops_type", 3),
// new PropertyEquals(context, "ops_type", this.getOps_type(t.getOps_type())));
// Query<Object> fit_dock = new AndQuery(pre_fit, new PropertyEquals(context, "ops_type", 3));
// Query<Object> fit_dock = new AndQuery(pre_fit, ops_fit);
Query<Object> pre_fit = new AndQuery(
new PropertyEquals(context, "status", 1),
new PropertyGreaterThanEquals(context, "max_veh", t.getTruck_type()));
Query<Object> q = new PropertyEquals(context, "ops_type", 3);
double min = 10000;
Dock match = null;
for (Object o : q.query(pre_fit.query())) {
// for(Object o: fit_dock.query()) {
if (((Dock)o).getMax_veh() < min) {
match = (Dock)o;
}
}
try {
match.setStatus(2);
match.getServe_list().add(t.getReq_id());
t.setServe_dock(match.getId());
if (t.getServe_dock() != -1) {
System.out.println("truck id " + t.getReq_id() + "serve dock: " + t.getServe_dock());
t.setIndock_tm(this.getTick());
truck_list.remove();
}
}
catch (Exception e){
// System.out.println("No fit dock found");
}
}
}
public int Count_freeDock() {
List<Dock> free_list = new ArrayList<Dock>();
Query<Object> free_dock = new PropertyEquals<Object>(context, "status", 1);
for (Object o : free_dock.query()) {
if (o instanceof Dock) {
free_list.add((Dock)o);
}
}
// System.out.println("free trucks: " + free_list.size());
return free_list.size();
}
5/5更新
为了更好地检测,我将查询移到了while循环之外。我发现速度慢很大程度上是因为使用了“PropertyGreaterThanEquals”。无论查询的字段是int还是double。
>
当您使用“Property tyEquals”进行查询时,无论所查询的字段是int还是double,查询都将在不到一秒的时间内运行。但是,它返回的结果是不正确的,因为它需要考虑“
public void match_dock() {
System.out.println("current tick is: " + this.getTick());
Iterator<Truck> truck_list = this.getTruck_queue().iterator();
Query<Object> pre_fit = new AndQuery(
new PropertyEquals(context, "status", 1),
new PropertyGreaterThanEquals(context, "max_veh", 30));
//new PropertyEquals(context, "max_veh", 30));
Query<Object> q = new PropertyEquals(context, "hv_spd", 240);
for (Object o : q.query(pre_fit.query())) {
if (o instanceof Dock) {
System.out.println("this object is: " + ((Dock)o).getId());
}
}
}
对于1,您可以尝试如下链接查询:
Query<Object> pre_fit = new AndQuery(
new PropertyEquals(context, "status", 1),
new PropertyGreaterThanEquals(context, "max_veh", t.getTruck_type()));
Query<Object> q = new PropertyEquals(context, "ops_type", 3);
for (Object o : q.query(pre_fit.query())) { ...
我认为这可能比嵌入AndQuery更快,但我不完全确定。
对于2,我认为一个查询产生的一些ITerable实际上是Java集。您可以尝试转换为其中一个,然后调用size()。如果它不是一个集合,那么实际上您必须进行迭代,因为查询筛选条件实际上是作为迭代的一部分应用的。
对于3,我认为有一些Java方法可以实现这一点new ArrayList(Iterable)
,以及集合中的一些方法。
以Jzombie模型为例,如果我想查询能量等于5的所有人类,并将其放入一个列表中,我将使用以下代码: 然而,人在人_列表中的顺序是随机的,并且在不同的模拟运行中是不同的。这会导致结果不一致的问题,如下所示: 实际上,我想用engergy==5查询人类,并按id对其进行排序,如下所示: 所以当我采取进一步的行动时,我总能得到一致的结果。
每个代理都有一个私有布尔变量“Happy?”。如何用[Happy?=True]计算特工人数? 就餐时有没有直接的方法?或者我遍历了所有的代理,然后逐个计算? 更新: 我尝试过全局调度方法:https://repast.github.io/docs/RepastReference/RepastReference.html#schedule-全球的 当我使用ContextBuilder中的@schdu
而不是绘制整个代理集(零售商)的汇总平均值
问题内容: 我正在尝试执行以下代码。这是我必须编写的实际代码的简化示例,因此我知道以这种方式循环是没有用的。但是,我需要在SQL Server中查找并合并select语句。当我尝试运行此查询时,出现错误: 关键字“ END”附近的语法不正确。 有任何想法吗? 问题答案: 您需要将第二组设置为UNION。while循环不会保留在选定的集合上,下次再知道它。您要完成的工作基本上是从mytable中选择
问题 你在代码中使用 while 循环来迭代处理数据,因为它需要调用某个函数或者和一般迭代模式不同的测试条件。 能不能用迭代器来重写这个循环呢? 解决方案 一个常见的IO操作程序可能会想下面这样: CHUNKSIZE = 8192 def reader(s): while True: data = s.recv(CHUNKSIZE) if data ==
我正在为Codewars做一个kata,它将两个数字数组相对放置。“对手”数组的平均数总是大于“codewarrior”数组,并且两个数组的长度总是相同的。我需要做的是找到获得胜利的最有效方法(codewarrior[x] 在上面,我将两个数组从最小到最大排序。然后,我有一个大的while循环来迭代“codefighter or”数组,以及两个time循环和一个if语句,每次迭代“对手”数组时,都