فرض کنید میخواهیم یک شبکه از کامپیوترها را شبیهسازی کنیم که مانند یک گراف به هم متصلاند. یعنی هر کامپیوتر در این شبکه با سیمهایی به کامپیوترهای دیگر متصل است که انتقال اطلاعات در این سیمها یک طرفه است. و هر کامپیوتر در این شبکه یک ظرفیت CPU
دارد که با عددی integer
میتوانیم آن را مشخص کنیم مثلا ۱۰۰۰۰. تعدادی نیز بستهی محاسباتی داریم که قرار است آنها را انجام دهیم (منظور از بستهی محساباتی یک برنامه حاوی محاسبات سنگین است که باید روی یکی از این کامپیوترها اجرا شود). هر کدام از این بستهها نیز یک ظرفیت از CPU
اشغال میکنند که با عددی integer
مشخص میشود. مثلا ۱۵۰۰. و ما تنها به چند کامپیوتر این شبکه دسترسی داریم. میخواهیم ما بستهها را به کامپیوترهایی که به آنها دسترسی داریم و بدهیم و آنها بستههای محاسباتی را بین خودشان تقسیم کنند. اما در این بین شرطی وجود دارد که هیچ کامپیوتری نباید از بیشتر از ۸۰ درصد CPU
خود را استفاده کند. حالا ما باید با استفاده از اشیا این کار را شبیهسازی کنیم.
در Constructor این کلاس یک عدد integer
مثبت به عنوان ظرفیت گرفته میشود. و همچنین هر شیای که از این کلاس ساخته میشود یک id
یکتا به آن نسبتداده میشود.
شناسهی این کامپیوتر را برمیگرداند.
این متد این کامپیوتر را به کامپیوتر c به طور یک طرفه وصل میکند.
این متد ظرفیت مشغول از CPU
را برمیگرداند.
این متد کل ظرفیت CPU
این کامپیوتر را برمیگرداند.
این متد شناسه کامپیوتری را که این بستهی محاسباتی را قبول کرده برمیگرداند. اگر هیچ کامپیوتری این بسته را قبول نکرد، -۱ برگردانده میشود.
در Constructor این کلاس یک عدد integer
مثبت به عنوان ظرفیتی که این بسته اشغال میکند، گرفته میشود.
ظرفیت بسته را برمیگرداند.
یک Boolean
برمیگرداند که نشان میدهد آیا این بسته توسط کامپیوتری قبول شده است یا نه.
مشخص میکند این بسته قبول شده است.
راهنمایی: میتوانید این سوال را به شکلی حل کنید، که وقتی بسته به یک کامپیوتر میرسد (متد 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
اتصالی وجود نداشت تا بسته به آنها برسد.