Skip to content

Latest commit

 

History

History
80 lines (59 loc) · 6.64 KB

File metadata and controls

80 lines (59 loc) · 6.64 KB

عکس تزیینی است

فرض کنید می‌خواهیم یک شبکه از کامپیوتر‌ها را شبیه‌سازی کنیم که مانند یک گراف به هم متصل‌اند. یعنی هر کامپیوتر در این شبکه با سیم‌هایی به کامپیوتر‌های دیگر متصل است که انتقال اطلاعات در این سیم‌ها یک طرفه است. و هر کامپیوتر در این شبکه یک ظرفیت CPU دارد که با عددی integer می‌توانیم آن را مشخص کنیم مثلا ۱۰۰۰۰. تعدادی نیز بسته‌ی محاسباتی داریم که قرار است آن‌ها را انجام دهیم (منظور از بسته‌ی محساباتی یک برنامه حاوی محاسبات سنگین است که باید روی یکی از این کامپیوترها اجرا شود). هر کدام از این بسته‌ها نیز یک ظرفیت از CPU اشغال می‌کنند که با عددی integer مشخص می‌شود. مثلا ۱۵۰۰. و ما تنها به چند کامپیوتر این شبکه دسترسی داریم. می‌خواهیم ما بسته‌ها را به کامپیوتر‌هایی که به آنها دسترسی داریم و بدهیم و آنها بسته‌های محاسباتی را بین خودشان تقسیم کنند. اما در این بین شرطی وجود دارد که هیچ کامپیوتری نباید از بیشتر از ۸۰ درصد CPU خود را استفاده کند. حالا ما باید با استفاده از اشیا این کار را شبیه‌سازی کنیم.

کلاس Computer

در Constructor این کلاس یک عدد integer‍ مثبت به عنوان ظرفیت گرفته می‌شود. و همچنین هر شی‌ای که از این کلاس ساخته می‌شود یک id یکتا به آن نسبت‌داده می‌شود.

متد getId()

شناسه‌ی این کامپیوتر را برمی‌گرداند.

متد connect(Computer c)

این متد این کامپیوتر را به کامپیوتر c به طور یک طرفه وصل می‌کند.

متد getUsedCapacity

این متد ظرفیت مشغول از CPU را برمی‌گرداند.

متد ‍getTotalCapacity

این متد کل ظرفیت CPU این کامپیوتر را برمی‌گرداند.

متد handle(CalculationPack c)

این متد شناسه کامپیوتری را که این بسته‌ی محاسباتی را قبول کرده برمی‌گرداند. اگر هیچ کامپیوتری این بسته را قبول نکرد، -۱ برگردانده می‌شود.

کلاس CalculationPack

در Constructor این کلاس یک عدد integer‍ مثبت به عنوان ظرفیتی که این بسته اشغال می‌کند، گرفته می‌شود.

متد getVolume()

ظرفیت بسته را برمی‌گرداند.

متد isAccepted()

یک Boolean برمی‌گرداند که نشان می‌دهد آیا این بسته توسط کامپیوتری قبول شده است یا نه.

متد accept()

مشخص می‌کند این بسته قبول شده است.

راهنمایی: می‌توانید این سوال را به شکلی حل کنید، که وقتی بسته به یک کامپیوتر می‌رسد (متد handle برای آن صدا می‌شود)، ابتدا در صورتی که با اضافه کردن این بسته، بیش از ۸۰ درصد ظرفیت آن پر نمی‌شد، آن را بردارد و شناسه‌ی خود را برگرداند. در غیر این صورت آن را به همسایه‌هایش پیشنهاد می‌دهد (متد هندل را برای آنها صدا بزند) و در صورتی که یکی از آنها خروجی‌ای غیر از -1 بازگرداند، می‌فهمیم او یا یکی از کامپیوترهایی که به نحوی به او متصل هستند، بسته را قبول کرده و شناسه‌ی خود را بازگردانده است. در صورتی که همه‌ی آنها خروجی منفی ۱ برگردادند، این کامپیوتر هم باید خروجی -۱ بازگرداند چون خودش و هیچ از کامپیوترهایی که به نحوی به او متصل‌اند نتوانسته‌ است بسته را قبول کند.

  • در ضمن برای جلوگیری از افتادن در لوپ بی‌نهایت می‌توانید به نوعی کامپیوترهایی که این بسته را قبول نکرده‌اند، در هر شی بسته نگهداری کنید، که دوباره بسته به آنها پیشنهاد نشود.

  • برای نگهداری همسایه‌های یک کامپیوتر می‌توانید آنها را یک ArrayList از کامپیوتر نگهداری کنید.

  • جواب را به صورت یک فایل zip ارسال کنید، که در آن یک پوشه‌ی balance وجود دارد و کلاس‌های شما در آن پوشه قرار دارند.

مثال

مثال استفاده:

Computer PC1 = new Computer(100);
Computer PC2 = new Computer(100);
Computer PC3 = new Computer(50);
Computer PC4 = new Computer(100);
Computer PC5 = new Computer(80);
//connections
PC1.connect(PC3);
PC3.connect(PC2);
PC4.connect(PC5);
//giving our packages to PC1
int[] volumes = new int[]{70, 75, 20, 20, 75};
for (int v : volumes) {
    int result = PC1.handle(new CalculationPack(v));
    if (result == -1) {
        System.out.printf("no computer accepted this package with volume %d \n", v);
    } else {
        System.out.printf("package with volume %d accepted by a computer with id %d\n", v, result);
    }
}

خروجی مثال:

package with volume 70 accepted by a computer with id 1
package with volume 75 accepted by a computer with id 2
package with volume 20 accepted by a computer with id 3
package with volume 20 accepted by a computer with id 3
no computer accepted this package with volume 75 
  • در این مثال چون ما بسته‌ها را به PC1 دادیم تا برای ما هندل کند، و خودش و همسایه‌هایش پر بودند دیگر نتوانست بسته‌ی آخر با ظرفیت ۷۵ را هندل کند. همچنین به PC4 و PC5 اتصالی وجود نداشت تا بسته به آنها برسد.