SimPy ("Blimpie" এর সাথে ছড়া) হল প্রক্রিয়া-ভিত্তিক বিচ্ছিন্ন-ইভেন্ট সিমুলেশনের জন্য একটি পাইথন প্যাকেজ।
ইনস্টলেশন
SimPy ইনস্টল করার সবচেয়ে সহজ উপায় হল pip এর মাধ্যমে:
pip install simpy
এবং আপনি যে আউটপুট পেতে পারেন তা এরকম কিছু হবে,
লেখার সময়, simpy-3.0.11 হল SimPy-এর সাম্প্রতিকতম সংস্করণ, এবং আমরা নীচের সমস্ত উদাহরণের জন্য এটি ব্যবহার করব৷
সেক্ষেত্রে, SimPy ইতিমধ্যেই ইনস্টল করা আছে, আপগ্রেড করতে পিপের জন্য –U বিকল্পটি ব্যবহার করুন।
pip install –U simpy
দ্রষ্টব্য :আপনার python 2.7 বা তার উপরের সংস্করণ থাকতে হবে এবং Linux/Unix/MacOS-এর জন্য SimPy ইনস্টল করার জন্য আপনার রুট সুবিধার প্রয়োজন হতে পারে।
SimPy সফলভাবে ইনস্টল করা হয়েছে কিনা তা পরীক্ষা করতে, একটি পাইথন শেল খুলুন এবং সিম্পি আমদানি করুন৷
মৌলিক ধারণা
SimPy, যা একটি বিচ্ছিন্ন-ইভেন্ট সিমুলেশন লাইব্রেরি। সিম্পির সক্রিয় উপাদানগুলি (যেমন বার্তা, যানবাহন বা গ্রাহকদের) প্রক্রিয়াগুলির সাথে মডেল করা হয়। SimPy-এ, সক্রিয় সত্তাগুলিকে প্রসেস বলা হয়। একটি প্রক্রিয়া হল একটি পাইথন জেনারেটর যা বিচ্ছিন্ন ঘটনা ঘটায়। অনুগ্রহ করে মনে রাখবেন, আমি কিছু ফেরত দিচ্ছি না তবে আমি একটি ফলন (ইং), এটি একটি সাধারণ ফাংশন এবং একটি জেনারেটরের মধ্যে পার্থক্য। এটি আমাদের ইভেন্টগুলি তৈরি করতে এবং তাদের ট্রিগার হওয়ার জন্য অপেক্ষা করার জন্য সেগুলি প্রদান করতে দেয়৷
যখন একটি প্রক্রিয়া একটি ইভেন্ট দেয়, প্রক্রিয়াটি স্থগিত হয়ে যায়। যখনই ইভেন্টটি ট্রিগার হয় তখনই SimPy আমাদের স্থগিত প্রক্রিয়া পুনরায় শুরু করার অনুমতি দেয়। যদি, একাধিক প্রক্রিয়া একই ইভেন্টের জন্য অপেক্ষা করে, SimPy সেগুলিকে একই ক্রমানুসারে পুনরায় শুরু করে যেভাবে তারা সেই ইভেন্টটি দিয়েছে৷
def gen(x): y = yield x+1 return y
>>> g = gen(1) >>> next(g) 2 >>> next(g) Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> next(g) StopIteration
ভেরিয়েবল x প্রথম ফলনের পরে উপরের পুনরাবৃত্তি বন্ধ হয়ে যায়।
নির্দিষ্ট পরিমাণ (সিমুলেটেড) সময় অতিবাহিত হওয়ার পরে টাইমআউট ধরণের ইভেন্টগুলি ট্রিগার করা হয়। টাইমআউট ইভেন্ট একটি প্রক্রিয়াকে একটি নির্দিষ্ট সময়ের জন্য ধরে রাখতে বা ঘুমানোর অনুমতি দেয়। টাইমআউট সহ সমস্ত ইভেন্টগুলি পরিবেশের উপযুক্ত পদ্ধতিতে কল করে তৈরি করা যেতে পারে যা প্রক্রিয়াটি বাস করে৷
#Import important library from random import randint import simpy #Config TALKS_PER_SESSION = 3 TALK_LENGTH = 30 BREAK_LENGTH = 15 ATTENDEES = 1 def attendee(env, name, knowledge=0, hunger=0): talks =0 breaks =0 #Repeat sessions while True: # Visit talks for i in range(TALKS_PER_SESSION): print('Talk {0} begins at {1}'.format(talks+1, env.now)) knowledge += randint(0, 3) / (1 + hunger) hunger += randint(1, 4) talks += 1 yield env.timeout(TALK_LENGTH) print(f'Talk {talks} ends at {env.now}') print('Attendee %s finished talks with knowledge %.2f and hunger ' '%.2f' %( name, knowledge, hunger)) #Take a break, Go to buffet food = randint(3, 12) hunger -= min(food, hunger) yield env.timeout(BREAK_LENGTH) print('Attendee %s finished eating with hunger %.2f ' %(name, hunger)) # Run Simulation env = simpy.Environment() for i in range(ATTENDEES): env.process(attendee(env, i)) env.run(until=250)
যদি আমরা উপরের প্রোগ্রামটি চালাই, তাহলে আমরা আউটপুট দেখতে পাব যেমন,
উপরে আমরা কনফারেন্স হলের দৃশ্যের প্রতিলিপি করার চেষ্টা করি, যেখানে 40 মিনিটের টক দৈর্ঘ্য এবং 30 মিনিটের দৈর্ঘ্য বিরতি সহ প্রতি সেশনে 4টির টক সহ একটি এলোমেলো সংখ্যক বক্তা রয়েছে৷
নতুন ইভেন্ট তৈরি করার জন্য আমাদের অংশগ্রহণকারী প্রক্রিয়ার জন্য একটি পরিবেশ (env), নাম, জ্ঞান এবং ক্ষুধার একটি রেফারেন্স প্রয়োজন। সেশনগুলি অসীম লুপে যাবে যতক্ষণ না এটি মিথ্যা হয়ে যায়। অংশগ্রহণকারী() ফাংশন হল একটি জেনারেটর যা বন্ধ হবে না কিন্তু একটি ফলন বিবৃতি পৌঁছানোর পরে নিয়ন্ত্রণ প্রবাহকে সিমুলেশনে ফিরিয়ে দেবে৷
পরিশেষে, আমরা একটি ডেমো সিমুলেশন 'কনফারেন্স এটেন্ডী' চালাই যতক্ষণ না 250 এর একটি সেট মান না পৌঁছায় (অন্তর্ভুক্ত- 3 আলোচনা, 1 বিরতি, 3 আলোচনা, 1 বিরতি, 1 আলোচনা)।