集合中的Anylogic引用列

时间:2018-10-30 20:18:19

标签: anylogic

我正在使用一个集合来表示系统中可用的卡车。我正在使用10来指定索引号,并使用1来表示索引卡车可用。然后,我试图将该索引号分配给客户ID。我正在尝试从列出的可用卡车中随机选择可用的卡车。我收到一个错误消息,说分配的左侧必须是变量,并且突出显示了读取Available_Trucks() = 1的代码部分。这是代码:

agent.ID = randomWhere(Available_Trucks, Available_Trucks() = 1);

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);