ScottM,
Thank you for your help, I will consider something like you suggest.

MikeB,
I was going to ask Nicolas (more about) what he was simulating to
see if he needs were going to go beyond modifying (a simple set of)
facts from each sweep of his rule-set(s).
Thank you for your answer. I am simulating a manufacturing system and yes for each sweep, only few facts are modified.

ScottK,
Thanks but now I don't need to "lock" fact assertion. I wanted to be sure that before asserting a fact (step "i" in my post or "tick" in ScottM's post), no activation remains. However, by calling engine.run() (see ScottM's algorithm), Jess will return to Java program only when all the activated rules have been fired. So my first sketch in the previous post was not really good, thank you nevertheless.

Nicolas


----- Original Message ----- From: "Scott Moss" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Thursday, May 10, 2007 5:24 AM
Subject: Re: JESS: Jess program with simulation timer


Steps 1 and 3 are probably a bad idea.

Implement a model class with a "tick" or "timestep" variable. Set the
value to 0.  Instances of the model class are shadow facts.  Have a
setTick(int t) method:

public void setTick(double t) {
double oldTick = tick;
tick = t;
pcs.firePropertyChange("tick", oldTick, tick);
}


And a scheduling method such as:

private void runSimulation(){
for (int t = 0; t < runLength; t++) {
setTick(t);
System.out.println("Starting tick " + tick);
long start = System.currentTimeMillis();
try {
//put modules on stack: they become current in reverse order
engine.setFocus("CLEANUP");
engine.setFocus("SIM");
engine.run();
}catch(JessException je){
System.err.println("An error occurred at line "
+ je.getLineNumber());
System.err.println("caused by " + je.getCause());
System.err.println("Message: " + je.getDetail());
je.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Time to run: " + (end - start)/1000.0 + "
seconds");
displayInstance.updateDisplay();
}
});
}

Define the model shadowfact in Jess in the usual way and then in your
rules you have the lhs clause:

(model (tick ?t))

and then you timestamp every clause that could change with time.  My
deftemplates look like this:

(deftemplate
(slot x)
(slot y)
(slot tickStamp))

for such clauses/facts.  You can retract facts from previous timesteps
that are no longer wanted by defining a cleanup module to fire first (or
last) as in the example above.

I use RePast and its scheduler because it contains a lot of
functionality useful for agent based modelling.  But if you don't need
that functionality and the substantial overheads, I think something
along the lines described here should do what you want.

hope this helps.


On Wed, 2007-05-09 at 17:40 -0400, Nicolas wrote:
Hello,

I want to create a Java simulation program that is using Jess.

The simulation has i = [1..n] steps. I have in mind the following
pseudo-code:

The program defines some rules, fact templates, and asserts shadow facts.

The program excecutes the engine until halt.

For each step i the program does these operations:
(1) It asserts a fact that contains the current step value (i). This
assertion fires a sequence of rules that are modifying the shadow facts.

(2) Once there is no more activation, it updates the gui by reading some
shadow facts properties values.

(3) Then it retracts the fact with the current step value (i), it increments
i (i++) and it resumes the first operation (1).

Because the gui can change quickly (2), I am thinking to use a
javax.swing.Timer, to allow the user to see what is happening. So the timer
will control the simulation pace. For example, the user could assign a
simulation pace of 5 seconds between each step (i).

The fact that contains the current step value (i) would be asserted in the
timer's event listener. However, before to assert it, all the rules
activated during the previous step (i -1) must have been fired. How can I do
that? Should I check if there is  no element in activationLists(), before
asserting the new step value?

I have found in JIA a small example with gui (chapter 13), but I am still
wondering if I can use it.

Any hint that can help me to solve my problem would be appreciated.

Thanks in advance.

--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------


--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------



--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------

Reply via email to