تولید اعداد تصادفی در نرم افزار گمز gams

تولید اعداد تصادفی در گمز نسبت به سایر نرم افزارها آسان تر است. شما با در دست داشتن توزیع مربوطه، می توانید به آسانی عدد تصادفی مربوطه را تولید نمایید. کد زیر نحوه ی تعریف اعداد تصادفی در gams را نشان می دهد.


x(i)=uniform(a,b);
x(i)=normal(Mean,Sd);
x(i)=gamma(alpha,theta);
x(i)=F(df1,df2);
x(i)=beta(alpha,beta);
x(i)=binomial(N,p);

در کد بالا:
a,b حدود بالا و پایین توزیع یکنواخت
mean و sd به ترتیب میانگین و انحراف معیار توزیع نرمال
alph و theta مشخصه های توزیع گاما
df1 و df2 درجات آزادی در توزیع F
alpha و beta مشخصه های توزیع بتا
binominal توزیع دو جمله ای بوده و n و p مشخصه های آن می باشند.
سایر توزیع ها را در help نرم افزار می توانید مشاهده کنید. همچنین می توانید با ترکیب این توزیع ها توزیع دلخواه خود را با ترکیب این توزیع ها تولید نمایید.

یک نکته‌ی بسیار مهم:
برای تولید اعداد تصادفی در گمز، در واقع یک موتور تعریف شده است که هر بار اعداد مشخصی را تولید خواهد کرد که واقعا تصادفی نیستند. یعنی اگر شما مدل را چندبار run کنید، داده هایی که توسط توزیع هایی مانند uniform(a,b) برایتان تولید می کنند دقیقا با هم برابر هستند و با هر بار run کردن مدل این اعداد هیچگونه تغییری نمی کنند.
یعنی شما اگر کد زیر را هزار بار هم ران کنید، یک جواب مشخص غیر قابل تغییر به شما می دهد.

parameter a;
a=uniform(0,1);
display a;
*** a=0.172 always

برای رفع این مشکل، شما باید موتور گمز را مجددا راه اندازی نمایید و عدد تصادفی جدیدی تولید کنید. برای اینکار باید از دستور execseed استفاده کنید.
در کد که در زیر مشاهده می کنید، ما قبل از دستور uniform از دستور execseed استفاده کرده ایم. این کار باعث می شود که موتور تولیدی gams مجددا راه اندازی شود. شما به این کد کاری نداشته باشید. فقط این خط را در کد خود paste نمایید و مدل را ران کنید. لازم به ذکر است که عدد ۲۰۰۰۰ می تواند از صفر تا ۱۰ به توان ۹ تغییر کند. شما هر چه این عدد را بزرگتر در نظر بگیرید، اعداد تصادفی متنوع تری را برای شما تولید خواهد کرد.


set i /1*5/;
parameter x(i);
execseed = 20000*(frac(jnow));
x(i) = uniform(0,1);
display x;

ایمیل: Support@gamsbook.ir
شماره تماس: ۳۳۲۵-۴۰۵–۰۹۱۹

 

این مقاله برای شما مفید بود؟

مطالب مشابه

2 دیدگاه

  1. علیرضا روشنی

    سلام وقتتون بخیر
    یه سوال مهم داشتم ممنون میشم اگر راهنمایی بفرمایید.
    من با کد زیر یک عدد تصادفی پواسون درست کردم. که مشکلی نداشته و درسته.

    $funclibin stolib stodclib
    Functions randpoisson     /stolib.dPoisson/;
    
    Set i /i1*i3/;
    Set j /j1*j2 /;
    Parameter randx(i,j)    "distribution sample";
    
    randx(i,j)     = randpoisson(4);
    display randx;
    

    در مدلی که مد نظرم هست، نرخ توزیع پواسون (که در مثال بالا عدد ۴ هست) خودش یک متغییر تصادفی هست. حالا چه طور میشه مقدار یک variable رو جایگزین عدد ۴ در randpoisson کرد؟
    ممنون میشم اگر زودتر پاسخ بدید، چون مربوط به پایان نامم هست و فرصتم محدوده.
    ممنون از شما

    1. محمودی

      سلام
      دو نکته:
      اول اینکه، متغیر تو این تابعی که تعریف کردین نمیاد. اگه حتما باید متغیر باشه، باید فرمولش رو به صورت دستی بنویسین. یعنی مثلا لاندا به توان فلان و فلان.
      دوم اینکه، اینی که تعریف کردین منظورتون چیه ازش؟ حالا فرضا همون ۴ هم باشه. rand…..(4 چی رو به شما نشون میده؟ تعاریف رو دقت کنین.

دیدگاهی دارید؟