集合中的 Anylogic 引用列
Anylogic referencing columns in a collection
我正在使用一个集合来表示系统中可用的卡车。我对给定的索引号使用 1
或 0
,使用 1
表示索引卡车可用。然后我试图将该索引号分配给客户 ID。我正在尝试从列出的可用卡车中随机 select 一辆可用卡车。我收到一条错误消息,指出赋值的左侧必须是一个变量,并突出显示代码读取 Available_Trucks() = 1
的部分。这是代码:
agent.ID = randomWhere(Available_Trucks, Available_Trucks() = 1);
你这样做的方式是行不通的...当应用于整数集合时,randomWhere 将 return 集合的元素(在本例中为 1 或 0)。
这样做
randomWhere(Available_Trucks,at->at==1); //this is the right synthax
将始终 return 1,因为这是在集合中选择的数字的值。因此,您需要的是获取等于 1 的集合编号的索引。但是您必须自己创建一个函数来执行此操作……类似这样的方法(可能不是最好的方法,但它有效:agent.ID=getRandomAvailbleTruck(Available_Trucks);
函数 getRandomAvailbleTruck 将把一个集合(可能是 arrayList)作为参数。如果没有可用的卡车,它将 return -1
int availableTrucks=count(collection,c->c==1);
if(availableTrucks==0) return -1;
int rand=uniform_discr(1,availableTrucks);
int i=0;
int j=0;
while(i<rand){
if(collection.get(j)==1){
i++;
if(i==rand){
return j;
}
}
j++;
}
return -1;
现在另一个想法是不使用 0 和 1 表示可用性,您可以使用相关数字:1,2,3,4,5 ... 等,如果不可用则使用 0。例如,如果卡车 3 不可用,则数组将为 1,2,0,4,5,如果可用,则数组为 1,2,3,4,5。
在这种情况下,您可以使用
agent.ID=randomTrue(available_trucks,at->at>0);
但是如果没有可用的卡车,您会收到错误消息,因此请检查一下。
然而,你所做的是可怕的做法......如果你的卡车是代理,如果你把可用性放在你的卡车上,那么有一种更简单的方法可以做到这一点......
然后你可以做
Truck truck=randomWhere(trucks,t->t.available==1);
if(truck!=null)
agent.ID=truck.ID;
我正在使用一个集合来表示系统中可用的卡车。我对给定的索引号使用 1
或 0
,使用 1
表示索引卡车可用。然后我试图将该索引号分配给客户 ID。我正在尝试从列出的可用卡车中随机 select 一辆可用卡车。我收到一条错误消息,指出赋值的左侧必须是一个变量,并突出显示代码读取 Available_Trucks() = 1
的部分。这是代码:
agent.ID = randomWhere(Available_Trucks, Available_Trucks() = 1);
你这样做的方式是行不通的...当应用于整数集合时,randomWhere 将 return 集合的元素(在本例中为 1 或 0)。 这样做
randomWhere(Available_Trucks,at->at==1); //this is the right synthax
将始终 return 1,因为这是在集合中选择的数字的值。因此,您需要的是获取等于 1 的集合编号的索引。但是您必须自己创建一个函数来执行此操作……类似这样的方法(可能不是最好的方法,但它有效:agent.ID=getRandomAvailbleTruck(Available_Trucks);
函数 getRandomAvailbleTruck 将把一个集合(可能是 arrayList)作为参数。如果没有可用的卡车,它将 return -1
int availableTrucks=count(collection,c->c==1);
if(availableTrucks==0) return -1;
int rand=uniform_discr(1,availableTrucks);
int i=0;
int j=0;
while(i<rand){
if(collection.get(j)==1){
i++;
if(i==rand){
return j;
}
}
j++;
}
return -1;
现在另一个想法是不使用 0 和 1 表示可用性,您可以使用相关数字:1,2,3,4,5 ... 等,如果不可用则使用 0。例如,如果卡车 3 不可用,则数组将为 1,2,0,4,5,如果可用,则数组为 1,2,3,4,5。 在这种情况下,您可以使用
agent.ID=randomTrue(available_trucks,at->at>0);
但是如果没有可用的卡车,您会收到错误消息,因此请检查一下。
然而,你所做的是可怕的做法......如果你的卡车是代理,如果你把可用性放在你的卡车上,那么有一种更简单的方法可以做到这一点...... 然后你可以做
Truck truck=randomWhere(trucks,t->t.available==1);
if(truck!=null)
agent.ID=truck.ID;