def ffv2(all_time_cloudlets: AllTimeCloudlets, devices: Devices) -> AllocationPlan: """ :param all_time_cloudlets: :param devices: :return: """ allocation_plan = create_blank_allocation_plan(all_time_cloudlets, devices) random.shuffle(devices) # time : 現在の時間, cloudlets : 現在の各クラウドレット for time, cloudlets in enumerate(tqdm(all_time_cloudlets)): for device in devices: if not (device.startup_time <= time < device.shutdown_time): # デバイス(端末)が稼働していない時間の場合 continue # time時間での端末の位置を取得 pos = device.plan[time - device.startup_time] for hop in range(0, 30): near = near_cloudlets(cloudlets, pos, d_max=hop, d_min=hop) near = list(filter(lambda c: c.can_append_device(device), near)) if len(near) == 0: continue cloudlet = near[0] cloudlet.append_device(device) p = get_cloudlet_point_from_cloudlets(cloudlet.name, cloudlets=cloudlets) allocation_plan[device.name][time] = Allocation(p.x, p.y, hop) break else: # どこにも割当られなかった場合 allocation_plan[device.name][time] = Allocation( pos.x, pos.y, -1) return allocation_plan
def test_near_cloudlets_02(self): from simulator.oldmodels import Cloudlet cs = [[ Cloudlet(name="d1"), Cloudlet(name="d2"), Cloudlet(name="d3"), Cloudlet(name="d4") ], [ Cloudlet(name="d5"), Cloudlet(name="d6"), Cloudlet(name="d7"), Cloudlet(name="d8") ], [ Cloudlet(name="d9"), Cloudlet(name="d10"), Cloudlet(name="d11"), Cloudlet(name="d12") ], [ Cloudlet(name="d13"), Cloudlet(name="d14"), Cloudlet(name="d15"), Cloudlet(name="d16") ]] ncs = cloudlet.near_cloudlets(cs, Point(0, 0), 2, 2) self.assertEqual(len(ncs), 3, msg=[c.name for c in ncs]) names = [c.name for c in ncs] self.assertTrue("d3" in names, msg=[c.name for c in ncs]) self.assertTrue("d6" in names, msg=[c.name for c in ncs]) self.assertTrue("d9" in names, msg=[c.name for c in ncs])
def ffdv2_min(all_time_cloudlets: AllTimeCloudlets, devices: Devices) -> AllocationPlan: """ FFDアルゴリズムによる割当と、 リソース不足時に最もリソースの空きの大きい周辺Cloudletを探索を行う :param all_time_cloudlets: :param devices: :return: """ allocation_plan = create_blank_allocation_plan(all_time_cloudlets, devices) random.shuffle(devices) devices = sorted(devices, key=lambda c: c.use_resource, reverse=True) # time : 現在の時間, cloudlets : 現在の各クラウドレット for time, cloudlets in enumerate(tqdm(all_time_cloudlets)): for device in devices: if not (device.startup_time <= time < device.shutdown_time): # デバイス(端末)が稼働していない時間の場合 continue # time時間での端末の位置を取得 pos = device.plan[time - device.startup_time] for hop in range(0, 30): near = near_cloudlets(cloudlets, pos, d_max=hop, d_min=hop) near = list(filter(lambda c: c.can_append_device(device), near)) if len(near) == 0: continue cloudlet = min(near, key=lambda c: c.empty_resource) # 割当可能な場合 cloudlet.append_device(device) p = get_cloudlet_point_from_cloudlets(cloudlet.name, cloudlets=cloudlets) allocation_plan[device.name][time] = Allocation(p.x, p.y, hop) break else: # どこにも割当られなかった場合 allocation_plan[device.name][time] = Allocation( pos.x, pos.y, -1) return allocation_plan