کلیدستان

نسخه‌ی کامل: بهینه سازی
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
من یک مجموعه از اعداد تصادفی دارم که تعداد اعضاش هم تصادفی تغییر میکنه  باید کدی بنویسم که اعضایی از این مجموعه رو (که تعداد این اعضا هم معلوم نیست) انتخاب کنه به طوری که جمع اون عددها کمترین فاصله رو از عدد 60 داشته باشه. خواهش میکنم کمکم کنید
سلام.
چند پرسش به وجود می آید :
اعداد تصادفی در چه بازه ای قرار داشته باشند ؟
تعداد اعداد تصادفی در چه بازه ای باشد (حداقل و حداکثر تعداد اعداد) ؟

اما در کل، به نظرم بهتر است که هدف نهایی را ذکر کنید، قصد دارید که تعدادی عدد تصادفی داشته باشید که مجموع آنها برابر 60 باشد ؟
 
مجموعه زیر مد نظرمه

کد پی‌اچ‌پی:
k=randi([1,95],1,randi([4,20])); 

اعداد این مجموعه در واقع ارتفاع یه سری مستطیل هستند. باید این مستطیلها رو  تو یه مستطیل بزرگتر جا بدم که ارتفاعش = 60. میخوام کاری کنم که از فضای این مستطیل به شکل بهینه استفاده بشه. از پایین سمت راست شروع کنم به چیدن برم تا بالا. برای همین باید مستطیلایی رو اول انتخاب کنم که جمع ارتفاعشون حتی الامکان به60 نزدیک شه. بعد برم ردیف بعد. در آخر یه حالت پلکانی ایجاد میشه.
کدهای متلب زیر رو می نویسیم :

کد:
clear all
close all
clc

k=randi([1,95],1,randi([4,20]))
k_size=size(k)
total=0;
sum=60;
k_copy=k;
p=1;
choosed=0;
ieration=0;
while (ieration<1000)
    a=1;
    b=k_size(2);
    random=randi([1,k_size(2)]);
    if (k_copy(random)<sum && k_copy(random)~=0)
        sum=sum-k_copy(random);
        choosed(p)=k_copy(random);
        p=p+1;
        k_copy(random)=0;
    end
    ieration=ieration+1;
end
choosed

نتیجه اجرای کدها :

کد:
k =

     8    23    12    18    23    40     5    86    90    47


k_size =

     1    10


choosed =

    23    18    12     5

choosed که در آخر نمایش داده شده است، همان اعداد تصادفی انتخابی می باشد. 

تا اینجا، برنامه ای نوشتیم که به صورت تصادفی، تعدادی از اعداد تصادفی رو انتخاب میکنه که مجموعشان، کمتر از 60 باشد. ولی خوب ما نیاز داریم که بهینه ترین پاسخ را به دست آوریم، بنابراین شما از این کدها استفاده کرده آنها را در یک حلقه for قرار بدهید و 1000 حالت ممکن (یا هر تعداد که فکر می کنید مناسب است) را بسازید و بعد از حلقه for ، هر جوابی که به 60 نزدیکتر باشد، همان جواب بهینه است.
 
بی نهایت از کمکتون ممنونم
اینجا واقعا کلیدستانه!!!!