Example #1
0
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
Example #2
0
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
Example #3
0
 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が生成されませんでした。")
Example #4
0
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