فرض کنید میخواهیم یک شبکه از کامپیوترها را شبیهسازی کنیم که مانند یک گراف به هم متصلاند. یعنی هر کامپیوتر در این شبکه با سیمهایی به کامپیوترهای دیگر متصل است که انتقال اطلاعات در این سیمها یک طرفه است. و هر کامپیوتر در این شبکه یک ظرفیت 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اتصالی وجود نداشت تا بسته به آنها برسد.