Jump to content
Sign in to follow this  
RezaGRD

exponential distribution M/M/1 queue

Recommended Posts

RezaGRD

hello

I want convert this C++ code to autoit code but I encounter with some problems. this code is a simulation of M/M/1 queue and I need use an exponential distribution formula in that. Can anyone help me? 

MM1.txt

Share this post


Link to post
Share on other sites
TheXman
Posted (edited)

@RezaGRD

Post your efforts so we can see where your problems exists and help you correct them.

Edited by TheXman

Share this post


Link to post
Share on other sites
JLogan3o13

This would be an instance of "trying to use the wrong tool for the job". Why on earth would you want to convert that? Do you even understand the code?


√-1 2^3 ∑ π, and it was delicious!

How to get your question answered on this forum!

Share this post


Link to post
Share on other sites
RezaGRD

@TheXman  Done! I think that my problem is in exponential distribution formula implementation! at C++ code loss packets that I want to see that in autoit output... is 40%... and that is correct output.

@JLogan3o13 I just want implement that code in autoit :). I know what that code is. there is a server and a queue with 9 capacity... and 1000 client as input to this M/M/1 system. we need calculate all of loss pacekts (clients who cant gets service and loss!)

 

 

MM1.au3

Share this post


Link to post
Share on other sites
JLogan3o13

My question is if you have it working in C++, why shoehorn it into a slower language?

  • Like 1

√-1 2^3 ∑ π, and it was delicious!

How to get your question answered on this forum!

Share this post


Link to post
Share on other sites
TheXman
Posted (edited)

@RezaGRD

First, how are you ever supposed to exit this loop when $AEC is never incremented?

While ($AEC < 1000) ;number of inputs!
   if ($Next_Arr < $Next_Dep) Then
      if ($SS = 0) Then
         $SS = 1 ;server status
         $Next_Arr = $Next_Arr + rand_exp(6)
      Else
         If ($QL = 9) Then ;queue lenth is 9
            $LEC += 1 ;number of loss pockets!
            $Next_Arr = $Next_Arr + rand_exp(6)
         Else
            $QL += 1
            $NextArr = $Next_Arr + rand_exp(6)
         EndIf

         if ($QL = 0) Then
            $SS = 0
            $Next_Dep = $Next_Arr + rand_exp(10)
         Else
            $QL -= 1
            $Next_Dep = $Next_Dep + rand_exp(10)
         EndIf
      EndIf
   EndIf
WEnd

It appears to me that the code you are working from, MM1.txt. is flawed.

Edited by TheXman

Share this post


Link to post
Share on other sites
RezaGRD

@TheXman I fix it... but I could 't get any result that I expect. 

I run it with a "for" loop and 10000 repeat... but I still get the wrong result! 0% packet loss! it 's Impossible! It should be about 40%.

#include <Math.au3>

Global $QL =0, $LEC = 0, $AEC = 0, $SS = 0, $Next_Arr, $Next_Dep
Global $div, $percent
Global $a, $b

for $i = 1 to 10000
$Next_Arr = rand_exp(6)
$Next_Dep = $Next_Arr + rand_exp(10) ;next arrival (enter to system) and next departure (output)

;~ While ($AEC < 100) ;number of inputs!
   if ($Next_Arr < $Next_Dep) Then
      if ($SS = 0) Then
         $SS = 1 ;server status
         $Next_Arr = $Next_Arr + rand_exp(6)
      Else
         If ($QL = 9) Then ;queue lenth is 9
            $LEC += 1 ;number of loss packets!
            $Next_Arr = $Next_Arr + rand_exp(6)
         Else
            $QL += 1
            $NextArr = $Next_Arr + rand_exp(6)
         EndIf

         if ($QL = 0) Then
            $SS = 0
            $Next_Dep = $Netxt_Arr + rand_exp(10)
         Else
         $QL -= 1
         $Next_Dep = $Next_Dep + rand_exp(10)
         EndIf
      EndIf
   EndIf
;~ WEnd
Next

test()
Func test()
   $div = $LEC / 10000
   $percent = $div * 100 ;calculate loss packets
   ConsoleWrite ("Loss Packets percent: " & $percent & "%" &@CRLF)
   ConsoleWrite ("Number of loss packets: " & $LEC & @CRLF)

EndFunc
;--------------------- exponential distribution formula (where I have problem)----------------------
Func rand_exp($lambda)
   $a = Random(0,1,0)
   $b = (Log(1-$a)) / -($lambda)
   $AEC += 1
EndFunc

 

Share this post


Link to post
Share on other sites
TheXman
Posted (edited)

@RezaGRD

As I said before, the C++ code that you are using as a guide (MM1.txt) is NOT a working example.  You can try to convert that code into AutoIt all you want and it will never give you the results you are looking for.  :mad2:   Find a working example of M/M/1 queue code, in any language, and start from there.

This is a prime example of G.I.G.O (Garbage In = Garbage Out).

 

Edited by TheXman
Fixed a typo

Share this post


Link to post
Share on other sites
RezaGRD

@TheXman ok ok :D just calm down! I wrote it by java and C++ too and I got correct resault! I think I 'd better give up! so... thank you :)

Share this post


Link to post
Share on other sites
TheXman

@RezaGRD

:D  You're welcome.

If you ever want help converting your "working" C++ (or Java) example into AutoIt, we'll be here.  :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×