Here&#39;s a simple version using a single process and two resources.<br><br>;;; Noels&#39; e-mail:<br>;;; I am trying to define the following producer/consumer process using<br>;;; the simulation package:<br>;;;<br>;;; There is a queue of resources of type A.<br>
;;;<br>;;; Process X takes an A and produces a B (which contains the A).&nbsp; The B<br>;;; is placed in a queue of fixed size<br>;;;<br>;;; Process Y takes a B, returns the A its queue and throws away the B.<br>;;;<br>;;; If any queue is empty a process that needs a resource of that type<br>
;;; must wait.&nbsp; If any queue is full a process that creates a resource of<br>;;; that type must wait.<br>;;;<br>;;; I can&#39;t work out how to model this.&nbsp; If I model the As and Bs as<br>;;; resources, I have the problem that &quot;It is an error to attempt to<br>
;;; release more units than the process has allocated.&quot;<br>;;; (<a href="http://planet.plt-scheme.org/package-source/williams/simulation.plt/">http://planet.plt-scheme.org/package-source/williams/simulation.plt/</a><br>
;;; 2/2/html/simulation-Z-H-8.html#node_sec_7.2.2).<br>;;; Since X takes A and never releases them, and Y releases As but never<br>;;; takes them, this is a problem.<br>;;;<br>;;; If I schedule As and Bs as events how do I enforce the resource limits?<br>
;;;<br>;;; This kind of simulation is simple in a message passing thread system<br>;;; but I don&#39;t see how it fits into the simulation package&#39;s model.<br>;;;<br>;;; Also: the documentation for the simulation package would benefit from<br>
;;; an introductory section that lays out the model used by the package.<br>;;;<br>;;; Doug&#39;s Response:<br>;;; I&#39;m not sure what A and B are in you example, but I assume A is something<br>;;; that is required by both processes - like a work cell or jig - and that<br>
;;; B is something only required by Y.&nbsp; Also, I&#39;m assuming that X and Y can<br>;;; be done at independent speeds.<br>;;;<br>;;; Let&#39;s assume a &#39;widget&#39; represents the end product/result of X and Y using<br>
;;; an A and a B.<br><br>(require (planet &quot;simulation-with-graphics.ss&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;williams&quot; &quot;simulation.plt&quot;)))<br>(require (planet &quot;random-distributions.ss&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;williams&quot; &quot;science.plt&quot;)))<br>
<br>(define n 0)<br>(define A #f)<br>(define B #f)<br><br>(define (scheduler)<br>&nbsp; (do ((i 1 (+ i 1)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((&gt; i n) ())<br>&nbsp;&nbsp;&nbsp; (wait (random-exponential 1.5))<br>&nbsp;&nbsp;&nbsp; (schedule now (widget i))))<br><br>(define-process (widget i)<br>
&nbsp; ;; Allocate an A for X and Y<br>&nbsp; (with-resource (A)<br>&nbsp;&nbsp;&nbsp; (printf &quot;~a: Widget ~a acquires an A~n&quot; (current-simulation-time) i)<br>&nbsp;&nbsp;&nbsp; (work (random-flat 4.0 8.0)) ; X<br>&nbsp;&nbsp;&nbsp; ;; Allocate a B for Y<br>&nbsp;&nbsp;&nbsp; (with-resource (B)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (printf &quot;~a: Widget ~a acquires a B~n&quot; (current-simulation-time) i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (work (random-flat 8.0 20.0)) ; Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (printf &quot;~a: Widget ~a releases its B~n&quot; (current-simulation-time) i))<br>&nbsp;&nbsp;&nbsp; (printf &quot;~a: Widget ~a releases its A~n&quot; (current-simulation-time) i)))<br>
<br>(define (run-simulation n-widgets n-As n-Bs)<br>&nbsp; (with-new-simulation-environment<br>&nbsp;&nbsp;&nbsp; (set! n n-widgets)<br>&nbsp;&nbsp;&nbsp; (set! A (make-resource n-As))<br>&nbsp;&nbsp;&nbsp; (set! B (make-resource n-Bs))<br>&nbsp;&nbsp;&nbsp; (schedule (at 0.0) (scheduler))<br>
&nbsp;&nbsp;&nbsp; (start-simulation)))<br><br>(run-simulation 20 4 2)<br><br><br><div class="gmail_quote">On Mon, Jun 23, 2008 at 11:52 AM, Noel Welsh &lt;<a href="mailto:noelwelsh@gmail.com">noelwelsh@gmail.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d">On Mon, Jun 23, 2008 at 4:53 PM, Doug Williams<br>
&lt;<a href="mailto:m.douglas.williams@gmail.com">m.douglas.williams@gmail.com</a>&gt; wrote:<br>
&gt; I&#39;ll reload 3.72 on one of my machines and send you a quick solution. &nbsp;I&#39;ll<br>
&gt; still having problems with V4.0 (and V4.0.1) and haven&#39;t gotten the<br>
&gt; simulation and inference collections ported yet.<br>
<br>
</div>Don&#39;t worry about it too much. &nbsp;My problem is so simple that it might<br>
be easier to just implement it directly.<br>
<font color="#888888"><br>
N.<br>
</font></blockquote></div><br>