0

我正在用 2APL 编写一个多代理系统。在我的代理文件中,我在 PC 规则函数中有以下调用:

B(zoekBod(Location,Destination,Amount,PriceCorrection,PrevOrders,Price));

在一个信念文件中,我定义了这个 prolog 函数,如下所示:

  zoekBod(Afz, Best, Aant, PC, [], Bod) :-
    Max is abs(Best-Afz)*Aant*PC,
    random( 1, Max, Bod ).

  zoekBod(Afz, Best, Aant, PC, [opdracht(_,Aantal,Afzender,Bestemming,Prijs)|_], Bod) :-
    OudeMaat=abs(Bestemming-Afzender)*Aantal,
    Maat=abs(Best-Afz)*Aant,
    0.75=<(Maat/OudeMaat),
    (Maat/OudeMaat)=<1.33,
    Bod=PC*Prijs.

  zoekBod(Afz, Best, Aant, PC, [opdracht(_,Aantal,Afzender,Bestemming,_)|R], Bod) :-
    OudeMaat=abs(Bestemming-Afzender)*Aantal,
    Maat=abs(Best-Afz)*Aant,
    (0.75>(Maat/OudeMaat); (Maat/OudeMaat)>1.33),
    zoekBod(Afz, Best, Aant, PC, [R], Bod).

它是荷兰语,但本质上的目标是根据之前的任何订单,计算新订单的价格。当在 2APL 中测试这种信念时,它给了我一个错误:

[STEP: Execute all plans]
Failed to execute:
B(zoekBod(1, 3, 15, 1, [], Prijs))

如果我在 gprolog 中使用跟踪对其进行测试,我会得到以下结果:

| ?- zoekBod(1,3,15,1,[],Prijs).
      1    1  Call: zoekBod(1,3,15,1,[],_17) ? 
      2    2  Call: _101 is abs(3-1)*15*1 ? 
      2    2  Exit: 30 is abs(3-1)*15*1 ? 
      3    2  Call: random(1,30,_17) ? 
      3    2  Exit: random(1,30,25) ? 
      1    1  Exit: zoekBod(1,3,15,1,[],25) ? 

Prijs = 25 ? 

(2 ms) yes
{trace}
| ?- 

这完全符合预期。我的相关 mas 部分如下所示:

<agent name="v1" file="vervoerder_voorbeeld.2apl">
      <beliefs file="vervoerderext_voorbeeld.pl" shadow="true"/>
</agent>

我完全被难住了为什么它无法执行。任何人都可以在这里帮助我吗?提前致谢!

抱歉,找到了答案:

zoekBod(Afz, Best, Aant, PC, [], Bod) :-
Max is abs(Best-Afz)*Aant*PC,
random( 1, Max, Bod ).

应该:

zoekBod(Afz, Best, Aant, PC, [], Bod) :-
Max is abs(Best-Afz)*Aant*PC,
Bod is int(random(Max)+0.5).
4

1 回答 1

0

抱歉,找到了答案:

zoekBod(Afz, Best, Aant, PC, [], Bod) :- Max 是 abs(Best-Afz)*Aant*PC, random( 1, Max, Bod )。

应该:

zoekBod(Afz, Best, Aant, PC, [], Bod) :- Max is abs(Best-Afz)*Aant*PC, Bod is int(random(Max)+0.5).

于 2012-04-02T11:06:48.537 回答