def simple(all_time_cloudlets: AllTimeCloudlets, devices: Devices) -> AllocationPlan: """ シンプルなFFアルゴリズムによる割当て リソース不足時に周辺のCloudletの探索を行わない :param all_time_cloudlets: Cloudletの三次元リスト :param devices: Deviceのリスト :return: 割り当て計画 """ allocation_plan = create_blank_allocation_plan(all_time_cloudlets, devices) # time : 現在の時間, cloudlets : 現在の各クラウドレット for time, cloudlets in enumerate(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] cloudlet = cloudlets[pos.y][pos.x] if cloudlet.can_append_device(device): # 割当可能な場合 cloudlet.append_device(device) allocation_plan[device.name][time] = Allocation( pos.x, pos.y, 0) else: # 割当できない場合 allocation_plan[device.name][time] = Allocation( pos.x, pos.y, -1) return allocation_plan
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_create_blank_allocation_plan(self): from simulator.oldmodels import Device atcs = oldutility.create_all_time_cloudlets(3, 3, 3) ds = [Device(name="d1"), Device(name="d2"), Device(name="d3")] ap = oldutility.create_blank_allocation_plan(atcs, ds) kys = ap.keys() if ds is not None or len(ds) == 0: for d in ds: self.assertTrue(d.name in kys) else: self.fail("AllocationPlanが生成されませんでした。")
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