我正在使用一个集合来表示系统中可用的卡车。我正在使用1
或0
来指定索引号,并使用1
来表示索引卡车可用。然后,我试图将该索引号分配给客户ID。我正在尝试从列出的可用卡车中随机选择可用的卡车。我收到一个错误消息,说分配的左侧必须是变量,并且突出显示了读取Available_Trucks() = 1
的代码部分。这是代码:
agent.ID = randomWhere(Available_Trucks, Available_Trucks() = 1);
答案 0 :(得分:0)
您的操作方式将不起作用... randomWhere在应用于整数集合时,将返回集合的元素(在这种情况下为1或0)。 这样做
randomWhere(Available_Trucks,at->at==1); //this is the right synthax
将始终返回1,因为那是集合中所选数字的值。因此,您需要获取等于1的集合数的索引。但是您将必须创建一个函数来自己执行此操作……类似这样的方法(可能不是最好的方法,但是它可以工作:{ {1}}
getRandomAvailbleTruck函数将一个集合(可能是arrayList)作为参数。如果没有可用的卡车,它将返回-1。
agent.ID=getRandomAvailbleTruck(Available_Trucks);
现在,另一个想法是代替可用性使用0和1,而可以使用相关数字:1,2,3,4,5 ...等等,如果不可用,则使用0。例如,如果卡车3不可用,则数组将为1,2,0,4,5,如果可用,则数组将为1,2,3,4,5。 在这种情况下,您可以使用
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;
但是如果没有可用的卡车,您会得到一个错误,请检查一下。
尽管如此,您正在做的事情是可怕的做法...如果您将卡车作为代理人,将可用性放入卡车中,则有一种更简单的方法来做... 然后,您可以
agent.ID=randomTrue(available_trucks,at->at>0);