Beispiel #1
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
Beispiel #2
0
 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])
Beispiel #3
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