مانند هر زبان برنامه نویسی دیگر در گمز نیز حلقه ها انواع مختلفی دارند که بسته به کاربرد باید از یک یا ترکیبی از آنها استفاده نمود. در این تاپیک این حلقه ها به طور مختصر و مفید آموزش داده شده اند. در صورت وجود هر گونه سوالی در بخش نظرات همین تاپیک سوال خود را مطرح فرمایید.
حلقه Loop:
عمومی ترین حلقه در گمز loop است که در زیر ساختار کلی آن را مشاهده می کنید.
[css]
Loop( (sets),
statement or statements to execute
);
[/css]
در کل بالا، sets اندیس یا اندیس هایی هستند کهرطبق آن ما می خواهیم که حلقه امان عمل کند. و statements هم شامل گذاره ها یا عملیاتیست که در هر لوپ مایلیم محاسبه یا انجام گیرند.
چند نکته:
گذاره ها در دستور Loop می توانند بیشتر از یک عدد باشند.
گذاره ها میتوانند شامل مواردی از قبیل if, put و display و کاربردی تر از همه solve هم باشند. یعنی توسط لوپ می توان یک دستور solve را چندین بار ران گرفت و هر سری نتایج را ذخیره کرد. این عمل در مدلهای دینامیک، تجلیل پوششی، عدم قطعیت و… بسیار کاربرد دارد.
درون یک لوپ می توان یک نرم افزار دیگر را اجرا یا فراخوانی کرد. به عنوان مثال میتوان یک داده را از روی اکسل خواند و یا توسط آن دستور داد که یک نرم افزار دیگر اجرا شود و نتیجه آن به گمز بازگردد.
مهم، هیچ equationی نباید درون دستور loop قرار گیرد.
در سایز های بالا ترجیحا از دستور display در حلقه ها خودداری کنید. چرا که این عمل موجب افزایش حجم فایل lst می شود و ممکن است مشکلاتی را در پی داشته باشد. البته در صورت وجود چنین مشکلاتی می توانید از این تاپیک استفاده کنید.
چند مثال:
[css]
* Example 1
set t / 1985*1990 /
parameter pop(t) / 1985 3456 /
growth(t) / 1985 25.3, 1986 27.3, 1987 26.2
1988 27.1, 1989 26.6, 1990 26.6 /;
loop(t, pop(t+1) = pop(t) + growth(t) ) ;
* example 2
Loop (i,
problemdata=savparam(i);
Solve mymodel using lp maximizing profit;
Data(i)=profit.l;
) ;
* example 3
* Note that k is a set, not a parameter
loop(index,
k(index)=yes;
solve lptest using lp minimizing lam;
);
* Example 4
put / ’Type one’ / ;
loop(i,
put / ’- Mode : ’ @20 i.tl:1
/ ’- Date (mm/yy) : ’ @20 i.tl:5 @19 i.tl:3 @19 ’ ’ @22 ’/’
/ ’- Item Type : ’ @15 i.tl:7 @15 ’ : ’
/
);
put / ’Type two’ / ;
loop(i,
put / @20 i.tl:1 @1 ’- Mode : ’
/ @20 i.tl:5 @19 i.tl:3 @22 ’/’ @1 ’- Date (mm/yy) : ’
/ @15 i.tl:7 @1 ’- Item Type : ’
/
);
* example 5
loop(i$ ord(i) gt 3,
if (x(i) lt y(i),
a=4;
);
);
* Example 6
set i/1*2/
parameter x/2/,z;
loop(i$x, z=3;);
[/css]
در مثال آخر دقت کنید که شرط نوشته شده در دستور Loop متناظر با عبارت: حلقه را اعمال کن به شرطی که x مقداری مخالف صفر داشته باشد.
حلقه while:
این حلقه در دو حالت عمومی زیر نوشته می شود. که در آن عبارت logical condition یک شرط را نمایش می دهد. حلقه ی while تا وقتی اجرا می شود که شرط ارائه شده در قسمت logical condition رعایت شود.
[css]
—- first way
While (logical condition,
statements to be executed While condition is true;
);
—- second way
$Onend
While conditional do
statements ;
Endwhile;
[/css]
فرق دو روش فوق بسیار واضح است. در روش اول از پرانتز و ویرگول استفاده می کنیم. در روش دوم از $onend و do و Endwhile استفاده می کنیم. چند مثال زیر را با دقت مرور کنید تا کلیات این دستور ملکه ذهنتان شود.
[css]
While(x lt 10,
x=x+0.01;
);
$Onend
While x lt 10 do
x=x+0.01;
Endwhile;
While(prod(I,q(i)), z=2;q(i)=q(i)-2);
while(converge = 0 and iter lt lim,
root=(maxroot+minroot)/2;
iter=iter+1;
function_value=a-b*root+c*sqr(root);
if(abs(function_value) lt tolerance,
converge=1;
else
if(sign(function_value1)=sign(function_value),
minroot=root;
function_value1=function_value;
else
maxroot=root;
function_value2=function_value;);
);
* display iter,lim,root,minroot,maxroot,
* function_value,function_value1,function_value2;
);
[/css]
حلقه ی for:
این حلقه نیز به دو صورت زیر تعریف می شود.
[css]
* first
for (i = start to|downto end [by incr],
statements;
);
* second
$Onend
For (i = start to|downto end [by incr] ) do
statements ;
endfor;
[/css]
در کد بالا، start ابتدای بازه و end انتهای بازه و incr مقدار افزایش در هر گام حلقه بوده و همگی عدد می باشند (این اعداد می توانند منفی یا مثبت باشند) و همچنین i نباید یک set باشد. به عبارتی i یک پارامتر تعریف می شود. چند مثال زیر موضوع را روش می کند.
[css]
* Example 1
scalar i ;
scalar globmin ; globmin = inf ;
option bratio = 1 ;
for (i = 1 to 1000,
x.l(j) = uniform(0,1) ;
solve ml using nlp minimizing obj ;
if (obj.l le globmin,
globmin = obj.l ;
globinit(j) = x.l(j) ;
);) ;
* example 2
for(x=1 downto 12 by 2,
data(i)=x;
);
* Example 3
$Onend
for x=1 downto 12 by 2 do
data(i)=x;
endfor;
[/css]
حلقه repeat:
برای حلقه ی while توضیح داده شد که statement تا زمانی اجرا می شود که شرط ارائه شده در logical condition نقض شود. در دستور repeat جای logical condition و statement عوض می شود. کد زیر را مشاهده کنید:
[css]
repeat ( statements to be executed;
until logical condition is true );
[/css]
به عبارتی repeat تا وقتی اجرا می شود که logical condition رعایت نشود. در صورتی که logical صحیح باشد، گمز از ادامه ی repeat صرفه نظر می کند.
چند مثال:
[css]
** Example 1
repeat (
a=uniform(2,10);
solve mymodel using minlp max z;
display a,z.l;
until (z.l<=5) ;);
** 2 Example
repeat(
root=root+inc;
function_value2= a-b*root+c*sqr(root);
if((sign(function_value1) ne sign(function_value2)
and abs(function_value1) gt 0
and abs(function_value2) gt tolerance),
maxroot=root;
signswitch=1
else
if(abs(function_value2) gt tolerance,
function_value1=function_value2;
minroot=root;));
until (signswitch gt 0 or root gt maxroot)) ;;
** example 3
repeat(
v=v+1;
break$(v-1=3);
%innerLoop%;
until v>3;
[/css]
نکته: یک شرط توقف برای while, for و repeat استفاده از آپشن زیر است که تعداد تکرارهای هر کدام از دستورات ذکر شده را به تعداد number محدود می کند.
[css] option forlim=number; [/css]
توجه: در حلقه ها تعاریف نمی توانند قرار گیرند. مثلا درون یک حلقه نمی توان یک مجموعه را تعریف کرد. یا یک پارامتر را تعریف کرد. همچنین در یک حلقه نمیتوان یک equation.. نوشت. دو مثال زیر که کاملا اشتباه است گواه این مدعاست.
[css]
for (s = 1 to 5 by 1,
eq.. sum(i,x(i)) =g= 2 ;
);
for (s=1 to 5 by 1,
scalar y ; y = 5 ;
);
[/css]
توجه:! حلقه ها با سایز بالا در گمز سرعت پایینی نسبت به سایر زبان های برنامه نویسی دارند. از اینرو همیشه به یاد داشته باشید که در صورتی حلقه ی تعریف شده ی شما زمانبر است، از شرط ها، if و سایر دستورات کمکی استفاده کنید که سرعت حلقه بالاتر رود. در صورتی که این عمل نیز اثر نکرد از سایر زبان ها و نرم افزار ها مانند اکسل و متلب برای محاسبات عادی استفاده نموده و خروجی آنها را در گمز وارد کنید.
در کد تا جایی که برای شما امکان دارد به جای حلقه ها از عبارات معادل آنها استفاده کنید. به عنوان مثال در کد زیر رویه ی دومی که برای پارامتر u تعریف شده است سرعت عمل بیشتری نسبت به رویه اول دارد.
[css]
set I / 1 * 100000 /;
parameter u(I);
* bad!
loop { I,
u(I) = uniform(0,2);
};
* good
u(I) = uniform(0,2);
[/css]
]
با سلام و وقت بخیر
بنده روی مدل ahp-dea کار میکنم . متاسفانه تو برنامه نویسی توی گمز دچار مشکل شدم
باید داده های 9 تا واحد رو بگیریم ( 5 ورودی و 3 تا خروجی) ، بعد هر یک از واحدها رو دو به دو باهم مقایسه کنیم . این مقایسه شامل حل چهار تا مدل dea-ccr ساده است . و بعد اعداد به دست آمده از این چهار مدل باهم جمع و تقسیم میشن و جوابهای نهایی یه ماتریس 9*9 تشکیل میده .
مشکل بنده یکی نوشتن حلقه تو در تو هست . که نمیدونم با loopبنویسم یا for !!!
یکی هم اینکه چطوری نتایج رو توی ماترس یا جدول ذخیره کنم .
ممنون میشم از دوستان کسی راهنمایی کنه .
سلام
با loop بنویسین. من یه نمونه براتون میذارم اینجا.
[css]
loop(jj,
xx(jj)=x(i,jj);
solve mymodel using lp maximizing w;
wFinal(jj)=w.l;
);
[/css]
که wfinal کارایی برای هر واحده اینجا. تو مسئله شما هم لوپ باید دو تا اندیس داشته باشه (یا دو تا لوپ تو در تو)
با سلام و وقت بخیر
بنده روی یک پروژه بهینه سازی با گمز کار میکنم حال در انتها یک دستور لوپ میبایست بنویسم که به مشکل برخوردم،
در داخل برنامه من یک Scalar دارم که مقدار اولیه آن به صورت دستی 8.9 داده ام حال این مقدار را باید با گام 0.1 افزایش بدهم تا 16.4 و در هر افزایش گام میبایست بهینه سازی بنده مجدد انجام شده و خروجی ها رو را برای من سیو کند تا نهایت بتوانم کمترین مقدار را جدا کنم چطور باید بنویسم.
ممنون میشوم راهنمایی بفرمایید.
با تشکر
سلام
یه مثال براتون میذارم.
[css]
sets t/1*10/;
parameter TAWA0(t)
/1 573E+6
2 584.05E+6
3 587.1E+6
4 596.15E+6
5 605.2E+6
6 608.25E+6
7 618.3E+6
8 622.35E+6
9 629.4E+6
10 634.45E+6
/
;
parameter nlprofFinal(t);
loop(t,
TAWA=TAWA0(t);
solve pmp using nlp maximizing nlprof;
nlprofFinal(t)=nlprof.l;
display nlprofFinal
[/css]
سلام وقتتون بخیر
این جدول رو چطور در گمز بنویسم ( k = انواع بارگیر) (d=فاصله به کیلومتر) و اعداد جدول هم هزینه حمل یک تن بار در یک کیلومتر فاصله
[css]
d<100 200<=d<=100 500<d<200 500<=d
K1 8100 5200 3000 1900
K2 6400 4500 3000 1900
K3 4300 3400 2300 1300
K4 2600 1800 1200 775
K5 2400 1600 1100 660
K6 2300 1600 1100 660
K7 1800 1500 900 700
[/css]
فاصله بین مبدا و مقصد رو هم بر اساس کیلومتر نوشتم حالا هزینه جابجایی برای فواصل مختلف فرق میکنه مثلا باارگیر شماره ۱ برای فاصله کمتر از ۱۰۰ یه هزینه برای فاصله ۱۰۰-۲۰۰کیلومتر یه هزینه (هزینه حمل یک تن بار در یک کیلومتر فاصله) و …. دارهو سایر بارگیر ها هم همینطور
سلام
این جدول مقداری بحث برانگیز هست. میتونین یه اندیس دیگه به اسم i تعریف کنین که چهار عضو i1*i4 داشته باشه. بعد ازش تو جدول استفاده کنین. تو جاهای مختلف کد از این اندیس میتونین استفاده کنین.
ممنون از پاسختون، فاصله بین مبدا و مقصد در جدولی مجزا بر حسب کیلومتر نوشته شده. حالا اگه برای فاصله اندیس چهار عضوی که فرمودین بسازم بعد تو جدول ازش استفاده کنم خطایی در روند کار بوجود نمیاره؟
لطفه به همون گفتگوی قبلی ریپلاک کنید. تشکر.
ممکنه مشکلی پیش بیاد. ولی خب باید حواستون باشه دیگه دقیقا چه تاثیری میذاره. باید تحلیل کنین. بسته به مسئله شما ممکنه فرق بکنه.
با عرض سلام
من یه مسئله دارم که میخوام به ازای چندتا TABLE مختلف حلش کنم و بعد نتایج شون رو مقایسه کنم. حالا با توجه به اینکه داده های این TABLE ها جز متغیر های EQUATION ها هستن و اینکه EQUATION ها هم نمی تونن داخل حلقه ها قرار بگیرن آیا روشی وجود داره که بشه این مسئله رو به صورت تکراری داخل حلقه(به ازای هر TABLE) حل کرد یا اینکه باید به ازای هر TABLE تمام معادلات رو دوباره بنویسم و جداگانه SOLVE بگیرم؟
سلام
میتونین از دستور loop استفاده کنین به طوری که دستور solve تو لوپ مورد نظر باشه. فقط توجه کنین که شما توی لوپ نمیتونین تعریفی انجام بدین (مثلا یک پارامتر رو تعریف کنین). و اینکه حواستون باشه که هر بار که لوپ جلو میره نتایج هم توسط یه پارامتر ذخیره کنین.
حتی میتونین چندین دستور solve تعریف کنین. ولی لوپ همیشه به صرفه تره.
سلام میشه بگین داخل یک حلقه چجوری میشه پارامتر ها رو ذخیره کرد؟
ببخشید منظورم این بود که چجوری میشه نتایج رو تو یک پارامتر داخل حلقه ذخیره کرد ، اگه واستون مقدور هست یک مثال بزنید.
مثال زیر بهتون کمک میکنه:
[css]
loop(jj,
xx(k,i)=x(jj,k,i);
yy(k,r)=y(jj,k,r);
zz(k,h)=z(jj,k,h);
solve mymodel using nlp maximizing goalstar;
eff(jj)=goalstar.l;
lambdaFinal(k,jj,j)=lambda.l(k,j);
);
display eff,lambdaFinal;
[/css[
salam mn yeseri dade az expert choice daram bahayd to dea vared konam
chetori bayad inharo vared konam
kole ravaeshoAHP-DEA hast 3 ta meyar dram va 6 ta gozine va 4 ta dmu
سلام
گمزو اول یاد بگیرین.
سلام پيشاپيش ممنون كه برأي پاسخم وقت ميذارين. يه مدل رياضي رودارم كدميكنم كه أفق غلطان ياrolling horizonهست وبراي هرهفته بايدتكرارشود سوال اولم اينه كه مدل نوشتن حلقش چطوريه؟ و اگر درمحدوديتي درقسمت سور عمومي يه عبارت مثلا Ri=1 باشه كد چطوري ميشه؟
سلام
خواهش میکنم. لطفا مسئله رو واضح تر بیان کنین در خدمت هستم.
سلام
با تشکر از مطالب آموزنده شما. من چند تا سوال داشتم که ممنونتون میشم اگر فرصت دارید پاسخ بدید
من یک نوع مسئله TSP رو کد کردم و حالا احتیاج دارم که این مسئله رو با یک سری شروط که منجر به تغییر مجموعه رئوس باقیمانده و همچنین نقطه شروع می شه حل کنم. روش کارم اینطور بوده که اول کد مسئله رو برای یک بار حل نوشتم و بعد قسمت Solve رو ازش برداشتم و یک لوپ به تعداد رئوس موجود براش ایجاد کردم که در صورتی که یک شرط خاص برقرار باشد باید مبدأ رو عوض کنه و مبدأ قبلی رو از مجموعه رئوس باقیمانده حذف کند و در صورتی که شرط برقرار نباشد یک رأس بخصوص را به صورت موقت حذف نماید تا در نهایت یا رأسی را بیابد که شرط برای آن برقرار شود یا دیگر رأسی غیر از مقصد نهایی باقی نماند. اگر رأسی پیدا شود رأس هایی که به صورت موقت حذف شده اند برای تکرار بعدی به الگوریتم بایستی بازگردند.
1. آیا کاری کلیات منطق کار صحیح است؟ یعنی آیا می توان در یک لوپ به صورت مداوم مجموعه رئوس را تغییر داد و مسئله را حل کرد و آیا پارامترهایی که وابسته به این رئوس هستند نیز تغییر می کنند؟ مثلا اگر رأس iام از مسئله حذف شده باشد آیا بردار زمان خدمت دهی برورز می شود؟ یا باید تمام پارامترها را هم بروز کنیم؟
2. چطور می توان به صورت موقت یک رأس را حذف نمود؟ یعنی در یه جاهایی رئوسی در یک مجموعه قرار بگیرند و در جایی میان الگوریتم با دستوری این مجموعه را تهی نمود.
3. برای یک حالت از مسئله کد من جواب های زیر را داده است: همانطور که می بینید تکرار اول جواب منطقی است و شروط TSP برقرار است (حذف تور و یک بار وارد و خارج شده از هر رأس) (عرض کردم حالت خاصی از TSP هست این مسئله و ضرورتی به بازدید تمام رئوس نیست) ولی در تکرار های بعد رسما مسئله جواب غلط داده…. به نظر شما مشکل از کجاست؟
جواب تکرار اول:
3 4 5 7
1 1.000
3 1.000
4 1.000
5 1.000
جواب تکرار دوم
1 2 4 5 6 7
1 1.000 1.000
2 1.000
4 1.000
5 1.000
6 1.000
جواب تکرار سوم
1 2 7
2 1.000 1.000
4 1.000
جواب تکرار چهارم
3 7
2 1.000
3 1.000
7 1.000
سلام
مفهومی که دارین پیاده سازی میکنین مقداری پیچیده هست و چون من خارج از گود هستم نمیتونم درباره ش به قطع صحبت کنم. و یه جورایی به خلاقیت شما بستگی داره. من احساس میکنم که شما به چند مورد نیاز دارین که بتونین شروط رو بنویسین.
اول اینکه، وقی میخواین یه شرط بنویسین که یه رأس حذف بشه، میتونین لوپ رو که نوشتین، یه پارامتر مثل kk که قبلا تعریفش کردین و مقداری به خودش نگرفته رو تحت لوپ بهش مقدار بدین، مثلا وقتی طبق شرایط مسئله این kk عدد 3 رو گرفت، یعنی رأس 3 باید حذف بشه، این پارامتر باید تو مدل به عنوان شرط اضافه بشه. مثلا تو یه محدودیت که داریم sum(xij=1 اونجا شرط می نویسیم ord(i) <>3 یعنی برابر 3 نباشه. (این یه فرضه که عرض کردم و هدفم اینه که متوجه بشین که کلیات کار چگونه هست و البته چون مسئله tsp پیچیدگی خاص خودش رو داره، باید بیشتر روش فکر کنین و ممکنه زمانبر باشه).
اینکه مسئله شما جواب غلط میده، مشکل از خود کد نویسی هست. و باید محدودیت زیرتور رو به خوبی پیاده سازی کنین. محدودیت های زیر تور زیادی هستن که تو مقالات مورد بحث قرار گرفتن. ببینین کدومش براتون ساده تره. و به خاطر داشته باشین که همیشه راه بهتر و محدودیت بهتری هست که شما باهاش راحت تر باشین.
اینکه میخواین مبدأ رو عوض کنین، راههای زیادی میتونین داشته باشین، یکیش اینه که مثلا اون متغیر مربوط بهش رو فیکس کنین با ویژگی .fx ، یه راه دیگه اش اینه که مثل همون kk رفتار کنین و یه پرارامتر دیگه تعریف کنین براش.
برای سایر سوالات همه چی بستگی به مسئله شما داره. و معمولا نیازی نیست دوباره تعریف بشن پارامترها، با همین شرط ها و پارامترهای قبلی که تعریف کردین میتونین کار رو ببرین جلو.
این که این مسائل رو کلی عرض کردم خدمتتون دلیلش اینه که بنده خارج گود هستم و دقیق تمیتونم راهنمایی کنم. ایشالا که موفق میشین.
با سلام و تشکر از لطف شما در پاسخگویی
سلام.ميخوام يهloop بنويسم كه براي هرهفته k تكراربشه و تعدادي قطعه i براشون سه محدوديت اعمال بشه حل كنه بعد ميخوام نتايج اين تخصيص با.fx ثابت كنم ممنون كه راهنمايي ميكنيد.
سلام
سوالتون واضح نیست.
سلام خسته نباشید میخوام سه عدد تصادفی بین صفر ویک تولید کنم که جمع شون برابر یک بشه لطفا کمک کنید
سلام
میتونین دو عدد تصادفی بین صفر و یک تولید کنین. و عدد سوم رو با محاسبات به دست بیارین. x,y رو تولید کنین. و z=1-x-y
سلام به همه دوستان.من حلقه لووپ نوشتم برای تحلیل حساسیت.حلقه لووپ رو به ازای مقادیر مختلف به دست آوردم.ولی وقتی او مقادیرو دستی وارد میکنم جوابش با حلقه لوپ فرق میکنه.لووپ داره اشتباه به من جواب میده.کسی میتوونه تووی این زمینه کمکم کنه خیلی گیر کردم.اگر مشکلی نیست به این شماره تلگرام کننین ممنون میشم
09307403868
سلام
معمولا این اشتباه وقتی پیش میاد که نتایج هر بار انجام حلقه میره تو حلقه بدی، در حالی که نباید بره. مثلا گفتیم
[css]
loop(i,
x(i)=ord(i)/10;
solve …..
);
[/css]
در حلقه بالا ما میخوایم که فقط xi عدد بگیره. مثلا x1=1/10 و تو مرحله بعدی x2=2/10 و x1 حذف بشه. ولی نمیشه! پس باید بعد از دستور solve مجددا بنویسیم x1=0.
ممکنه مشکلات دیگه ای هم باشه که اگه بیشتر توضیح بدین در خدمت هستیم.
سلام من ی کد تو گمس نوشتم که کاراییی 12dmu رو بررسی میکنه ولی موقع گرفتن خروجی فقط کاراییی 1dmu رو نشون میده
میخوام با استفاده از دستور loop کدی رو بهش اضافه کنم که کارایی هر 12 dmu رو همزمان نشون بده
[cs]]
Sets
i “Inputs” /i1 “Doctors”,i2 “Nurses”/
r “Outputs” /o1 “Outpatients”,o2 “Inpatients”/
j “Units” /DMU01*DMU12/;
Parameters
* Let DMU04 be under evaluation
xo(i) “Inputs of under evaluation DMU”
/i1 20
i2 151/
yo(r) “Outputs of under evaluation DMU”/o1 100
o2 90 /;
Table x(i,j)
DMU01 DMU02 DMU03 DMU04 DMU05 DMU06 DMU07 DMU08 DMU09 DMU10 DMU11 DMU12
i1 20 19 25 27 22 55 33 31 30 50 53 38
i2 151 131 160 168 158 255 235 206 244 268 306 284;
Table y(r,j)
DMU01 DMU02 DMU03 DMU04 DMU05 DMU06 DMU07 DMU08 DMU09 DMU10 DMU11 DMU12
o1 100 150 160 180 94 230 220 152 190 250 260 250
o2 90 50 55 72 66 90 88 80 100 100 147 120;
Variables
v(i) “Input weights”
u(r) “Output weights”
z “Efficiency”;
Positive Variables
v
u;
Equations
Objective
Const1
Const2(j);
Objective.. z=e=Sum(r,yo(r)*u(r));
Const1.. Sum(i,xo(i)*v(i))=e=1;
Const2(j).. Sum(r,y(r,j)*u(r))-Sum(i,x(i,j)*v(i))=l=0;
Model MultiplierCCR_Model /All/;
Solve MultiplierCCR_Model Using LP Maximizing z;
[/css]
میدونم که باید alias رو اضافه کنم و مقدار پارامتر ها رو حذف کنم ولی نوشتن خود loop رو نمیتونم انجام بدم
مرسی
سلام
شما باید اول jj رو به j آلیاس کنین.
بعد به صورت زیر عمل کنین.
[css]
Loop(jj,
yo(r)=y(j,r);
xo(i)=x(j,i);
Solve MultiplierCCR_Model Using LP Maximizing z;
zFinal(jj)=z.l;
);
[/css]
با سلام.
میخوام کد دستور Znm ک متغیر باینری هستش بنویسم، در واقع m و n نام گذاری دو سر خط.
چطوری میتوانم در حلقه بیان کنم که به ازای z که از گره n به گره m میرود نتیجه صفر شود، ولی اگر شبکه را طوری تعریف کنیم که از گره m ب گره n نتیجه یک باشد؟!
znm: Binary variable which is equal to 1 if m is the parent node of n
ممنون میشم راهنمایی کنید. و برای ایمیلe.kh2731@gmail.comهم ارسال کنید.با سپاس
سلام
منظورتون اینه که وقتی znm یک باشه، اونوقت zmn باید برابر صفر باشه، و اگر اولی برابر صفر باشه، دومی باید برابر یک باشه؟
این سوالو اول جواب بدین در خدمتتون هستم.
با سلام مجدد
مهندس طبق روابط مقاله، ynm هم متغیر باینری هستش.
sum(Znm)=1 ، Znm=0 , znm+Zmn=ynm
این توضیحات در صورتی میتونه کمک کنه که همش رو کامل بنویسین. نه ifی نوشتین، نه اینکه نوشتین سیگما رو چیه و…
سلام ، یه سوال داشتم.
میخام مسئله ای رو حل کنم که سه تا ست داره:i,j,k که i مشتریان و k وسایل نقلیه هستن . مسئله رو میخام یک بار برای 3 مشتری و 4 وسیله یکبار برای 4 مشتری و 4 وسیله و یکبار برای 3مشتری و 3 وسیله و میخام این تغییرات برای j نیز باشه ؛مظورم اینه تعداد ست ها میخام تغییر بدم چطور باید اینکارو انجام بدم.
سلام
باید دستی تغییر بدین.
اگه I,j شبیه به هم هستن. از alias استفاده کنین.
ممنون
سلام
خوب هستین؟
اگر یک تابع sum رو بخوام تعریف کنم که برای مثال از n=1 شروع میشه و تا یک متغیر صحیح مثل s میره چطور باید تعریف بشه؟ وقتی با متغیر صفر و یک تعریف می کنم و در محدودیت ها میارم یک محدودیت s>n لحاظ می کنه.
سلام
حد بالای متغیر مقداری فرمول نویسی میخواد. تو کامنتها قبلا جواب دادم. پیداش کردم بهتون reply میکنم. ولی به عنوان یه راه دیگه میتونین از تابع ifthen هم استفاده کنین.
سلام
خوب هستید؟
میشه راهنمایی کنید وقتی حد بالای یک سیگما متغیر هست چطور باید اون رو مدل کرد که گمز ارور نده؟
با سلام و خسته نباشید
میشه راهنمایی بفرمایید کد دستور ریاضی زیر که در محدودیت های یک مساله می باشد در گمز به چه شکلی هستش
min< x < max
یا
x=0
به عبارتی میخوام اگه مقدار x مابین min و max قرار نگیرد برابر با صفر شود
سلام
فرض میکنم که max,min دو عدد کران هستن که مقدارشون رو میدونیم.
کافیه یه متغیر صفر و یک به نام y تعریف کنین. که در معادله به شکل زیر اثر داده بشه. این برا وقتی هست که اون علامت مربوط به محدودیت شامل مساوی هم باشه.
[css]
min*y<x<max*y
[/css]
سلام
من یک کد نوشتم که در اون با استفاده از دستور لوپ در هر تکرار یک سری مقادیر محاسبه میشه و دوباره از همون مقادیر برای ادامه حل استفاده میشه ، می خواستم بدونم چطور میشه کاری کنم که اگر در یکی از تکرار ها ، مقادیر تکرار دیگه ای عینا بدست اومد گمز متوجه بشه و دستور دیگه ای رو انجام بده؟
فرض کنید در تکرار دوم جوابها به صورت زیر بوده:
Y0=1
Y1=1
Y2=0
Y3=1
حالا عینا همین مقادیر در تکرار هفتم بدست اومده:
Y0=1
Y1=1
Y2=0
Y3=1
سلام
فرضا Y شما یه اندیس داره به نام i یعنی به شکل y(i تعریف شده باشه. و اندیس مربوط به loop برابر j باشه. خب. میتونین یه پارامتر به نام yy(j,i تعریف کنین. بعد تو دستور loop یه دستور شرطی if تعریف کنین. و بگین که در صورتی که yy(j,i)=yy(j-1,i) اونوقت فلان عبارت رو برای من display کن. در غیر اینصورت به عبارت دیگه رو نشون بده.
سلام
من یک پارامتر دارم که قبل از ورود به equations نیاز به محاسبه اش دارم منتهی این پارامتر دو اندیسی هست و باید به صورت یک table ایجاد بشه آیا اصلا امکان این هست از حلقه loop استفاده بشه ؟؟
[css]
table sc(I,q) slop for cost
loop((i,q) $((nt(i,q)-ct(i,q)) ne 0),
sc(i,q)=(cc(i,q)-nc(i,q))/(nt(i,q)-ct(i,q)););
display sc;
[/css]
من به این صورت نوشتم اما با خطای463 مواجه می شم
سلام
شما نباید به صورت table تعریف کنین. باید sc رو به صورت parameter تعریف کنین.
با عرض سلام و وقت بخیر
امکان داره لطف کنید ببینید اشکال این کد چیه که خطای ۴۳۹ رو میده
[css]
/5*set i /1
;(parameter x(i), d(i
;(( execseed = 20000*(frac(jnow
;(x(i) = uniform(0,1
, for(i=1 to 5
, if(x(i)>0.5
; d(i)=1
, elseif x(i)<=0
; d(i)=0
);
);
[/css]
سلام
تو for اندیس نداریم، باید با loop بنویسین:
[css]
set i/1*5/;
parameter x(i), d(i) ;
execseed = 20000*(frac(jnow));
x(i) = uniform(0,1);
loop(i,
if(x(i)>0.5,
d(i)=1 ;
elseif x(i)<=0,
d(i)=0;
););
[/css]
سلام…
تو دستور زیر که من i , j رو قبلا alias کردم و i و j برابر می شوند
(f(i,j) =e= (v(i)-v(j))/z(i,j
معادله مربوط به جریان است و صفر می شه و گمز ارور صفر شدن عبارت رو میده
می خوام بگم در زمان هایی که iو j مخالفند فرمول رو اجرا کنه.. چطوره؟
سوال دوم .. قبل عبارت بالا هم میخوام بگم وقتی از i به j خطی وجود داره ( که z وجود داشته باشه) فرمول رو اجرا کنه
جدول z قبلا معرفی شده
با تشکر
سلام
برای شرط میتونین از دلار استفاده کنین
[css]
eq(i,j)$(ord() ne ord(j)).. (f(i,j) =e= (v(i)-v(j))/z(i,j;
[/css]
برای شرط دوم هم قسمت مجموعه های چند بعدی رو مطالعه کنین
با سلام و خسته نباشید
اگر امکان داشته باشد لطفا در نوشتن کد مسئله زیر به بنده کمک کنید
مسئله بصورت زیر است:
زمان بصورت مجموعه تعریف شده است: / set t /1*10
همچنین u(عدد باینری) یک متغیر است.
در ساعات 4تا 8 یا 5تا 9 (بطور کلی، 5 ساعت بطور پیوسته) موقعی که u برابر 1 است، خروجی به ترتیب اعداد 1، 2، 3، 4 و 5 را تولید کند و در بقیه ساعات، خروجی به ازای هر ساعت برابر صفر باشد.
بطور مثال موقعی که Ut=0 0 0 1 1 1 1 1 0 0، خروجی برابر P= 0 0 0 1 2 3 4 5 0 0 باشد.
با تشکر
سلام
سوال ناقص مطرح شده. ولی از فرمولایی نظیر معادله زیر میتونین استفاده کنین که کار رو جلو ببرین:
[css]
eq1(t).. p(t)=l=p(t+1)+(1-u)*M;
eq2(t).. p(t)=l=u*M;
[/css]
این مفهوم رو میرسونه که هر جا U صفر هست، p هم صفره. و ترتیب 1 تا 5 رو هم نشون میده.
با تشکر از راهنماییتان
پارامترها و عدد m را به چه صورتی تعریف کنم؟
همین دو معادله eq1 و eq2 کافی است؟
با تشکر از شما
همین طور در قسمت متغیر باینری (u)، قسمت زیر را به چه صورتی بنویسم؟
Ut=0 0 0 1 1 1 1 1 0 0
اگر امکان داشته باشد لطفا راهنمایی بفرمایید
با تشکر از شما
وقتی میگین متغیره، یعنی نمیدونین مقدارش چنده دیگه. مسئله به دست میاره.
m یه عدد بزرگه در حدی که کافی باشه! یعنی نه خیلی بزرگ، نه اونقد کوچیک که مسئله نشدنی بشه.
این دو تا با این اطلاعات تقریبا کافی هست. شما باید هر چی فرض دارین حول و حوش این دو محدودیت به کار ببرین و هر بار محدودیت ها را بهترشون کنین.
با سلام:
چطوری میشه در گمز ضرب یک متغیر گسسته در یک متغیر باینری رو انجام داد؟
با تشکر
سلام
خطی سازی میخواید؟ بدون خطی سازی که میشه. برای خطی سازی هم روش زیر خوبه. مثلا x باینری و y عدد صحیح باشه و z هم یه عدد صحیح جدید.
[css]
integer variable z;
z=g=y-(1-x)*M;
z=l=y;
z=l=x*M
[/css]
روش های دیگه ای هم هست. ولی همین کارتون رو راه میندازه. m عدد بزرگه.
با سلام
در حقیقت من می خواهم حلقه ای بنویسم که ضرب یک عدد باینری را در یک عدد گسسته در پنج حالت انجام دهد و خروجی آن نشان داده شود.سپس شمارنده یک واحد اضافه گردد و دوباره عمل ضرب انجام گردد.. تا موقعی که هر ۵ حالت تمام شود و تمام خروجی ۵ حالت نشان داده شود. بطور مثال
حالت اول u1*r1
حالت دوم u1*r2
و… تا حالت پنجم
خروجی برنامه، حاصلضرب تمام حالتها را نشان دهد.
تمام مقادیر u و r هم مشخص است.
با تشکر از سایت خوبتان
با سلام
مقادیر u1 تا u5 مشخص هستند. u2 ، u1 و u3 برابر 1 و u4 و u5 برابر صفر هستند.
با تشکر از سایت خوبتان
سلام
من یک برنامه کلی براتون مینویسم. ازش استفاده کنین.
[css]
sets i/1*5/
alias(i,j);
parameter u(i),r(i),x(i,j);
x(i,j)=u(i)*r(j);
[/css]
اینجا شما باید u,r رو عدد دهی کنین. و x هم که طبق فرمول محاسبه میشه.
با سلام و خسته نباشید
اگر امکان داشته باشد در نوشتن کد گمز مسئله زیر به بنده کمک کنید
مسئله ای بصورت زیر تعریف شده است
زمان یا t بصورت مجموعه و ۱۰ ساعت در نظر گرفته شده است / set t /1*10
u (عدد باینری) یک متغیراست
سوال بدین صورت است. موقعی که u در ساعات ۵ تا ۹ یا ۴ تا ۸ (۵ساعت بطور پیوسته) برابر ۱ است، خروجی اعداد ۲، ۴، ۶، ۸ و ۱۰ را به ترتیب تولید کند و در بقیه ساعات خروجی برابر صفر باشد. یعنی هر موقع u در ۵ ساعت بطور پیوسته برابر ۱ باشد، خروجی به ترتیب اعداد ۲، ۴، ۶، ۸ و ۱۰ را ترتیب تولید کند و در بقیه ساعات صفر باشد.
تابع هدف هر چیزی می تواند باشد. چون خروجی فقط یک جواب دارد و اعداد بالا در ساعات متناظر را تولید می کند
اگر امکان داشته باشد لطفا راهنمایی بفرمایید.
با تشکر از زحمات شما
سلام
وقت بخیر
شما لطفا این سوال بنده رو اول جواب بدید در خدمتتون هستیم.
اینکه اگر u در چهار ساعت از اون 5 ساعت برابر با 1 بشه ولی در ساعت آخر یا ساعت وسطش یک نشه، نتیجه چی میشه؟
با سلام خدمت شما
خیلی ممنونم از پاسخ گویی شما
کلن فرض بر این است که 5 ساعت بطور پیوسته برابر یک باشد و در ساعت اول خروجی عدد 2، در ساعت دوم خروجی عدد 4 و … در ساعت پنجم عدد 10 را تولید کند. حالا ساعت 4تا 8 یا 5 تا 9 فرقی ندارد. یعنی 5ساعت u بطور پیوسته برابر 1 باشد و بین این ساعت u نمی تواند برابر صفر باشد.
با تشکر از شما
سلام
اطلاعاتی که دادین خیلی مناسب نبود. ولی برنامه زیر این کارو میکنه. اگه تغییراتی خواستین بدین میتونین از همین استفاده بکنین تا حدی.
[css]
sets t/1*10/;
integer variable x(t);
binary variable u(t);
variable z;
equations
eq1,eq2,eq3,eq4,eq5;
eq1.. u(‘4’)+u(‘9’)=e=1;
eq2(t)$(ord(t) >=5 and ord(t) <=8).. u(t)=e=1;
eq3(t).. 2*u(t)=l=x(t);
eq4(t).. x(t+1)=g=(2+x(t))*u(t+1);
eq5(t).. z=g=x(t);
model mymodel /all/;
option optcr=0,minlp=lindo;
solve mymodel using minlp minimizing z;
display z.l,x.l,u.l;
[/css]
با سلام
خیلی خیلی سپاسگزارم از جنابعالی. اگر امکان داشته باشد لطفا به این سوال هم جواب بدید.
اگر خروجی بجای اعداد 2، 4، 6، 8 و 10 ، به ترتیب اعداد 10، 13، 15، 16 و 17 را تولید کند نامساویها چگونه تغییر می کنند؟
منظورم اینست که خروجی از یک رابطه خاصی تبعیت نکند.
خیلی ممنونم از شما
سلام
اینو دیگه باید تک تک براش محدودیت بنویسین. اینجا ما نوشتیم به ازای هر t بیا این کار رو انجام بده. ولی با شرایط فوق دیگه قضیه فرق میکنه. باید عبارتی مثل زیر باشه:
[css]
x(‘7’)=g=(1+x(‘6’))*u(‘7’)
[/css]
شما باید تک تک برای زمان های مختلف محدودیت بنویسین.
سلام و وقت به خیر..سوالی داشتم ممنون میشم پاسخ بدین..میخوام یه محدودیتی تعریف کنم به این مفهوم که حاصل sum یه عبارت شامل متغیرهای باینری که تابع t هست رو تو بازه ای با حد بالا و پایین بهم بده ( t (بازه زمانی 15 دقیقه ای که از 1 تا 96 هست) به ازای t بزرگتر از k و کوچکتر ازK+7 … حالا خود K هم یه زیر مجموعه کوچتر از t هست مثلا از 1 تا 89…اول اینکه میخوام بدونم ایا باید k رو هم به عنوان یه set در نظر بگیرم یا نه اگه اره به شکل زیر باید باشه؟؟؟
[css]
t time period/1*96/
[/css]
K(t)/1*89/ درسته K(t) یا نیازی نست؟
و دوم اینه یقینا دستور ordی که پایین نوشتم اشتباهه چون هدفم اینه که مقدار t رو برابر با حد پایین جمع Kباشه و حد بالاییش k+7 ولی نمیدونم باید چه جور نمایش بدم؟؟؟
[css]
co117(t)$(ord(t) >= K and ord(t)<=K+7) .. sum(t,(Idg(t)+mdg(t)))=l=1;
[/css]
یه توضیحی هم درباره برنامه ام بدم اینکه دارم یک ریزشبکه با منابع و بارهابی مختلف تست میکنم ..این محدودیتیم که میخوام بزارم واسه دیزل زنراتورمه..با تشکر
سلام
مچکرم بابت توضیحاتتون.
k رو درست تعریف کردین. ولی بله فرمول مشکل داره. به شکل زیر بنویسین.
co117(k) .. sum(t$(ord(t) >= ord(K) and ord(t)<=ord(K)+7),(Idg(t)+mdg(t)))=l=1;
سلام خیلی خیلی ممنونم..
میبخشین یه سوال دیگه هم دارم..این heuristic still looking .( اجرای برنامه بهینه سازی MIP با سالور Cplex) واسه چیه؟البته بعدش جواب پیدا میکنه یعنی found incumbent دارم..
سلام
ببینین cplex وقتی مسئله رو حل میکنه از روشهای ابتکاری برای سریعتر حل کردن مدل استفاده میکنه. این heuristic… یعنی cplex مشغوله ابتکاریه ست هنوز.
سلام من یک Table به صورت gg(g,l,f) دارم که مقادیر بین 0 تا 9 رو اختیار کرده
f1 f2 f3
g1.1 1.000 4.000 5.000
g1.2 1.000 4.000 5.000
g1.3 1.000 4.000 5.000
g1.4 1.000 4.000 5.000
g1.5 1.000 4.000 5.000
g2.1 3.000 1.000 9.000
g2.2 3.000 1.000 9.000
g2.3 3.000 1.000 9.000
g2.4 3.000 1.000 9.000
g2.5 3.000 1.000 9.000
g3.1 9.000 2.000 1.000
g3.2 9.000 2.000 1.000
g3.3 9.000 2.000 1.000
g3.4 9.000 2.000 1.000
g3.5 9.000 2.000 1.000
حالا میخوام به این صورت این جدول تغییر کنه که به ازای هر اندیس l در ماتریس اگر مقدارش با مقدار اون درایه برابر بود بجای اون عدد مقدار یک رو قرار بده در غیر این صورت صفر باشه…یعنی عملا ماتریس نهایی باید ماتریس 0 و 1 دار بشه ..چطور باید دستورش در گمز نوشته بشه؟ ممنون میشم راهنمایی کنید
ماتریس نهایی اینطوری باید بشه
f1 f2 f3
g1.1 1.000 0.000 0.000
g1.2 0.000 0.000 0.000
g1.3 0.000 0.000 0.000
g1.4 0.000 0.000 0.000
g1.5 0.000 0.000 1.000
g2.1 0.000 0.000 0.000
g2.2 0.000 0.000 0.000
g2.3 1.000 0.000 0.000
g2.4 0.000 0.000 0.000
g2.5 0.000 0.000 0.000
g3.1 0.000 0.000 1.000
g3.2 0.000 1.000 0.000
g3.3 0.000 0.000 0.000
g3.4 0.000 0.000 0.000
g3.5 0.000 0.000 0.000
سلام
[css]
loop(i,
if(gg(g,i,f)=ord(i),
gg(g,i,f)=1;
else
gg=0;
);
);
پیاده سازی الگوریتم PSO در گمز چطوریه که کسی بلد نیست، اگه کسی اطلاعاتی داره لطفا راهنمایی کنه.
ممنون
یک بار برای همیشه
GA, PSO, Hill Climbing, Simulated Annealing, Ant colony, leaping frog
و هر آنچه heuristic می شناسید یا در آینده نزدیک خلق می شوند
قابل پیاده سازی در GAMS نیستند
البته هستند اما ارزش ندارد وقت خود را تلف کنبد
مثل این می ماند بپرسید آیا می شود یک استخر آب را با چنگال خالی کرد ؟
خیر /بلی به سختی !
سلام و وقتتون بخیر
مدل من س تابع هدف داره و میخام با روش محدودیت اپسیلون بهینه سازیش کنم
تا دو تابع هدفشو انجام دادم،واسه اضافه کردن سومی نتونستم تعداد حلقه ها رو دوتا کنم
ینی با استفاده از یک حلقه انجامش دادم
جواب مسئله اپتیمال و منطقی میباشد.آیا چون از دو حلقه استفاده نکردم،جوابام اشتباهه؟
اگر جواب مسئله اپتیمال و منطقی میباشد.
پس نکته ای باقی نمی ماند
سلام. خسته نباشید
من یه مدل ریاضی مشابه مدل زیر رو دارم که توش یه loop برای حل کردن مداوم مسئله نوشتم
میخوام محاسبات رو انجام بده و در sqrtval بریزه و خروجی اکسل بهم بده. ولی خروجی اکسل خالیه و چیزی توش نمیاد.
ممنون از زمانی که برای پاسخ دادن صرف میکنید
Set i “set to drive iterations” / i-1*i-100
/;
Parameter value(i) “used to hold successive approximations”;
Scalars target “number whose square root is needed” / 23.456 /
sqrtval “final approximation to sqrt(target)”
curacc “accuracy of current approximation”
reltol “required relative accuracy” / 1.0e-06 /;
abort$(target reltol),
value(i+1) = 0.5*(value(i) + target/value(i));
sqrtval = value(i+1);
curacc = abs (value(i+1)-value(i))/(1+abs(value(i+1)))
) ;
abort$(curacc > reltol) “square root not found”
option decimals=8;
display “square root found within tolerance”, sqrtval, value;
execute_unload “result.gdx” sqrtval, value
execute ‘gdxxrw.exe result.gdx o=result.xls var=sqrtval rng=result!b1:b7’
سطر آخر را اصلاح کنید
var=sqrtval.l
اگر اصلاح نشد یعنی مقدار متغییر شما صفر است
سلام وقتتون بخیر
بابت وقتی که میزارید و سوالمو جواب میدید یه دنیا سپاسگزارم
پیرو پیام قبلیم که گذاشتم، فایل کد رو با ایمیل براتون ارسال و پیوست کردم.
موضوع اینه که نیازدارم نتایج حل کد بصورت اکسل خروجی بگیرم خروجی اکسلی رو نوشتیم و خروجی داد.
برای تحلیل بیشتر نیاز شده که از حلقه ها استفاده کنیم که به دلیل نامشخص گمز نتایج اجرای حلقه رو بصورت اکسلی خروجی نمیده
ممنون میشم ایمیل تون رو نگاه کنید و نظر بدید.
https://www.gams.com/latest/docs/UG_DataExchange_Excel.html
چطور میشه پاسخ بدست آمده از حل معادله گمز مربوط به یافتن یک متغیر را در شرط عبارت دیگر استفاده نمود.
یعنی اگر متغییر y بزرگتر از صفر باشد عبارت دیگری حل گردد و اگر کوچکتر از صفر باشد نیز عبارت دیگر اجرا گردد.
ظاهرا از متغییر نمیشه در دستورات شرطی استفاده نمود.ممنون میشم راهنمایی فرمائئید.
پاسخ شما را نمی توان در یک خط خلاصه کرد
به صورت مختصر
متغببر باینری به صورتی اضافه کنید که هر زمانی که y مثبت شد مقدارش برابر با ۱ بشود و اگر منفی شد ۰ بشود
این متغییر باینری را به نحوی در مغادلات دخالت دهید که اگر ۱ بود معادله A فعال شود و اگر 0 بود معادله B فعال شود
مساله ممکنه است با افزودن این متغییر باینری minlp شود ! و حل آن سخت
با سلام و وقت بخیر
ببخشید من یک جدول دارم که سطرش زمان و ستونش شماره تکرارهاست. و اون رو بصورت یک پاراکتر تعریف میکنم.
چطور میتونم توی هر لوپ گمز بهش بگم از هر ستون متناسب با تکرارش استفاده کنه؟
پیشاپیش بابت پاسخگوییتون متشکرم
حلقه لوپتون رو مشابه جدولتون تعریف کنید
یا می تونید بگید ord شمارنده لوپ شما با شماره ستون جدولتون یکی باشه
سلام روز بخیر
من یه سوال داشتم خدمتتون؛ من الان روی پروژه بهینه سازی کار میکنم که چند هدفه هستش و متغییر ها بر حسب t زمان , (سناریو) s هستن وتو قسمت solve که میخوام تابع هدف رو مینیموم کنم به روش محدودیت ارتقا یافته میخوام گمز برای هر سناریو و زمان ها(24 ساعت ) مقدار تابع هدف مجزایی رو بده بهمون یعنی منظور به ازای s=1 و تایم های 1 تا 24 یک تابع هدف مینیموم شده مجزا بگیرم ممنون میشم راهنماییم کنین
متوجه نمیشم سوالتون رو
روش محدودیت ارتقا یافته یعنی چی ؟
سلام
اگه منظورتون augEps هست و دارین از کد اماده استفاده میکنین، اصلاج کد زمان بر هست مقداری. شاید بهتر باشه دونه دونه این داده ها رو به گمز بدین، و هر بار نتایج در اکسل ذخیره بشه. (که برای هر داده ی S,t چند جواب برای هر هدف خواهیم داشت نه یک تابع هدف مینیمم شده مجزا).
اگرم یکی یکی نمیخواید اینکارو انجام بدین و دست به کدتون خوبه، دو تا loop بشت سر هم قبل از اولین دستور solve و بعد از اخرین دستور سالو کد اماده نیاز دارین. تشخیص نحوه دستکاری با شما.
با سلام و خسته نباشید
من با نوشتن محدودیت حذف زیر تور در مساله مسیریابی وسایل نقلیه در گمز مشکل دارم. البته الگوریتم آن در متلب را می توانم بنویسم. محدودیت به این شکل است.
u(i)-u(j)+n*x(i,j)<=n-1
x(i,j) متغیر باینری است که در صورت سفر از i به j مقدار 1 می گیرد.
u(i) موقعیت شهر i را در تور سفر نشان می دهد. بعنوان مثال اگر u(3)=1 باشد، یعننی شهر 3، اولین شهری است که بازدید خواهد شد.
ممنون میشم راهنمایی بفرمایید.
با تشکر
[css]
const(i,j) .. u(i)-u(j)+n*x(i,j) =l= n-1
[/css]
با سلام
ایا در دستور loop می شود داده table از excel فراخوانی شود؟
به عنوان مثال برای مسایل scenario-based که مدل باید به ازای هر سناریو ران شود.
سلام
بله.
table اول باید تعریف شده باشه. بعدش داخل loop فرا خوانی انجام بشه.
با عرض سلام و وقت بخیر
ممنون میشم راهنمایی کنید رابطه زیر در گمز چطور نوشته میشه؟
r(g)*u(g,t) sigma g sigma t
به شرطی که 1<t باشد( و نتوان t رو از سیگما تغییر داد.)
تشکر
سلام
یعنی چه نتوان سیگما رو تغییر داد؟
[css]
sum(g,t)$(ord(t)>1),r(g)*u(g,t))
[/css]
سلام وقتتون بخیر و خسته نباشید .
ببخشید من یک متغیر دارم (P(g,t که مقادیرش در زمان t1 مشخص هستش . (‘P(g,’t1 چطور می تونم این متغیر رو در لحظه اول مقداردهی کنم.
ممنون می شم اگر راهنمایی بفرمایید.
سلام
قبل از دستور solve بنویسین: (مقدار مثلا 10 باشه)
[css]
p(g,’t1′).fx=10;
[/css]
با عرض سلام
من روی متعادلسازی خط مونتاژ u شکل کار میکنم و متغیر باینری (u(k رو برای ایستگاه k درنظرگرفتم. (x(t,k و (y(t,k هم متغیرهای باینری هستند بطوریکه فعالیت t به صورت فوروارد با x به ایستگاه k تخصیص پیدا میکنه و به صورت بکوارد با y به ایستگاه k تخصیص پیدا میکنه.
کد گمزی که نوشتم برای مثال های مختلف حل کردم و مشکلی نبوده ولی به ازای یک مثال، بدون اینکه به 3 تخصیصی انجام بده، مقدار (u(3 رو برابر یک میده.برای حل این مشکل میخوام بنویسم اگر مقدار عبارت روبرو بزرگتر از صفر بود، ( (sum(t,(x(t,k+(y(t,k
مقدار (u(k رویک بده و اگر صفر بود، (u(k رو هم صفر بده.
سعی کردم با ایف و لوپ بنویسم(با رعایت اینکه نباید داخلشون رابطه ای تعریف بشه) ولی نتونستم. ممنون میشم راهنمایی بفرمایید.
فرض کنید اون عبارت شمار و z بگیریم
0.001U<=z با فرض منفی نشدن z البته
سلام، یک مدل برای محاسبه هزینه سیستم دارم که بخشی از آن شامل شرط می باشد به این صورت که اگر مقدار موجودی باقیمانده در سیستم از مقدار تعیین شده بیشتر باشد هزینه آن محاسبه می شود در گمز چطور باید فرمول نویسی گردد؟
همچنین ممنون میشم که بفرمایین که اگر سامیشن از 1 تا n-1 باشد که n متغیر است را چطور تعریف کنیم؟
سلام
سوال اولتون مجهوله، منظورتون کجای مدله؟ تو محاسبات یا تو معادلات؟
برای مورد دوم ایمیل بزنید به سایت و درخواست فایل حد بالای متغیر کنید که براتون ارسال بشه.
سلام. وقت بخیر
اگر امکانش هست چندتا مقاله در رابطه با انواع حلقه ها به همراه کد گمز برای اینجانب ایمیل کنید.
متشکرم
Solver BARON برا نرم افزار من دمو هست، برای حل مسائل غیرخطی به این Solver نیاز دارم. ممنون میشم راهنماییم کنید.
از این سایت برای سالور مجانی استفاده کنید
https://neos-server.org/neos/
سلام توروخدا کمکم کنید
خطای ۱۴۹ مینویسه:
Uncontrolled set enteredaz constant
چیکارش کنم
سلام
صور عمومی رو دقت کنین. اشتباه نوشتین اندیساش رو. هر اندیسی که تو صور بیاد، میشه تو فرمول ها بدون توابعی نظیر سیگما استفاده بشه.
ببخشید من متوجه ارتباط بین loop و gdx نشدم .چطوری میتونم ازاین حلقه استفاده کنم که z وx ام رو داخل اکسل بریزه؟
سلام
اگه حلقه دارین و مرتبا مواردی رو باید ذخیره کنه و بفرسته به اکسل نهایتا، اول باید یه parameter تعریف کنین، و z رو توش ذخیره کنین. فرضا اندیس Loop برابر i باشه.
loop(i,
solve my model ……. z;
zz(i)=z.l;
);
حالا باید zz رو بفرستین به اکسل.
سلام.
میشه در مورد خطای ۳ در گمز توضیح بدین؟
با سلام
من یک مساله بهینه سازی را در گمز حل کرده ام، حالا میخواهم تغییرات تابع هدف را نسبت به تغییرات یک پارامتر نشان دهم، می خواهم از حلقه استفاده کنم به این صورت که هر بار مساله را با مقادیر مختلف پارامتر حل کند (شمارنده پارامتر مدنظر است) و مقدار تابع هدف جدید را در فایل اکسل ذخیره کند. در واقع خروجی که در اکسل می خواهم مقادیر تابع هدف به ازای مقادیر مختلف پارامتر مدنظر است که به صورت سطری یا ستونی نشان دهد.
یعنی در واقع باید در حلقه دستور solve را قرار دهم
اما مشکل اینجاست که نمیتوانم متغیری تعریف کنم تا همه مقادیر تابع هدف را در آن ذخیره کنم…
سلام
نیازی نیست به صورت متغیر تعریف کنید.
یه پارامتر تعریف کنین که اندیسش همون اندیس loop باشه. با شروع لوپ و گرفتن اون مقدار مناسب پارامتر در لوپ، مدل solve میشه، و تو خط بعدیش مقدار متغیر هدف که به دست اومده رو تو پارامتر ذخیره میشه. لوپ که کاملا تموم شد، می تونین پارامترو بفرستین تو اکسل.
یه مثال از این نوع کاربرد:
[css]
set t/1*10/ ;
parameter zfinal(t);
loop(t,
solve ….. z;
zfinal(t)=z.l;
);
* now you can export the zfinal to excel
[/css]
سلام وقت بخیر
حلقهif در گمز نوشتم که اگر در دو تکرار متوالی تابع هدف تغییر نکرد از حلقه تکرار اصلی خارج شو
ولی دستور رو اجرا نمی کنه
دستور:
,(If((xq(iter)_xq(iter-1)=0
;(flg=0
Xq مقدار تابع هدف در هر تکرار
flg دستور خارج شدن ار حلقهloop
ممنون میشم راهنمایی بفرمائید
ممنون میشم راهنمایی بفرمایید
سلام
از while, repeat , break, abort استفاده کنین.
باسلام خسته نباشید
من باید حجم وارد شده به مخزن رو در 24 ساعت حساب کنم .که میشه حجم قبلی +(فرمول *Δt) چجوری باید واردش کنم
سلام
واضح نیست سوال
سلام وقتتون بخیر
مساله سه هدفه ای رو با روش اپسیلون محدودیت در گمز نوشتم، چط.ری میشه در هر تکرار مقدار متغیرها رو معلوم کرد؟
وقتی از دستور display استفاده می کنم مقدار متغیرها رو در تکرار آخر مشخص می کنه.
ممنون میشم کمکم کنید.
سلام
مثلا لوپ شما اندیس i داشته باشه. و میخواین متغیر x رو display کنین بعد از هر لوپ. خب. شما یه پارامتر به اسم xfinal(i تعریف میکنین:
loop(i,
solve ……
xfinal(i)=x.l;
);
display xfinal
سلام میخام یه مدلی رو که یه متغیری به صورت X(i,j,k) داره و (k=1,2,…K) به ازای هر k مدل حل بشه و تابع هدف هر مرحله قرار داده بشه Zopt(k). مدل ساده شده رو به صورت زیر نوشتم ولی متأسفانه خطا میده. ممنون می شم راهنماییم کنید.
[css]
sets
i /1*5/
j/1*4/
k /1*3/
;
free variables
Zopt(k)
z
;
variables
X(i,j,k)
;
equations
of
eq1
;
of.. z=e=sum((i,j,k),x(i,j,k));
eq1(i,j,k).. x(i,j,k)=g=2;
;
model CFLP /all/;
loop(k,
solve CFLP using MINLP min Z;
Zopt.l(k)=z.l;
)
display
x.l
z.l
Zopt.l
;
[/css]
سلام
کدینگتون کلا اشتباهه.
اول بگین یعنی چی میخوام به ازای هر k حل کنم. با این مدل هر بار به ازای k حل کنین بازم یه جواب برای x,z بدست میاد. هدف رو بگین در خدمتتون هستیم
درسته. این مدل ساده شده هست و در این مدل جواب برای هر k یکسان میشه. ولی در مدل واقعی اینطور نیست چون هر K پارامترهای خودشو داره که تو مدل واقعی هم تو تابع هدف و محدودیتها وجود دارن. شما مثلا مدل زیر رو فرض کنید که اینجا من فعلا فقط تو تابع هدف آوردمشون که ممکنه تو محدودیتها هم باشن:
sets
i /1*5/
j/1*4/
k /1*3/
;
free variables
Zopt(k)
z
;
parameters
P(k)
/1 2
2 2
3 1
/
;
variables
X(i,j,k)
;
equations
of
eq1
;
of.. z=e=sum((i,j,k),P(k)*x(i,j,k));
eq1(i,j,k).. x(i,j,k)=g=2;
;
model CFLP /all/;
loop(k,
solve CFLP using MINLP min Z;
Zopt.l(k)=z.l;
)
display
x.l
z.l
Zopt.l
;
در واقع اینکه جوابشون چی میشه فعلا برام مهم نیست. می خام نحوه نوشتن این جور مدل ها رو بدونم چجوریه. می خام از خروجی حل این مدل برای یه مدل دیگه استفاده کنم.
در واقع می خوام حلقه رو روی اندیسی بنویسم که اون اندیس تو تابع هدف و محدودیتها هم اومدن. اون مدلی که نوشتم یه نمونه ساده شده بود. ممنونم می شم راهنماییم کنید که چطوری بنویسم.