示例#1
0
def sort_layer_dis(sub_bricks, model):
    pickable = 0
    groups = [0]
    updated_model = copy.deepcopy(model)
    build_que = copy.deepcopy(sub_bricks)

    #print 'start: '
    #for i in range(0,len(build_que)):
    #            print build_que[i]['x']+build_que[i]['px'],', ',build_que[i]['y']+build_que[i]['py']

    while pickable == 0:
        group, build_que[
            groups[-1]:len(sub_bricks)], pickable = sort_pickable_dis(
                build_que[groups[-1]:len(sub_bricks)], updated_model)
        if group == 0:
            return 'n', build_que[groups[-1]:len(sub_bricks)]
        groups.append(groups[-1] + group)
        updated_model = fd.update_model(build_que[groups[-2]:groups[-1]],
                                        updated_model)

        #print 'pickable: '
        #for i in range(groups[-2],groups[-1]):
        #        print build_que[i]['x']+build_que[i]['px'],', ',build_que[i]['y']+build_que[i]['py']
        #print 'not pickable: '
        #for i in range(groups[-1],len(sub_bricks)):
        #        print build_que[i]['x']+build_que[i]['px'],', ',build_que[i]['y']+build_que[i]['py']

    return groups, build_que
示例#2
0
def sort_layer_ass(sub_bricks, model):
    placeable = 0
    groups = [len(sub_bricks)]
    updated_model = copy.deepcopy(model)
    build_que = copy.deepcopy(sub_bricks)

    #print 'start: '
    #for i in range(0,len(build_que)):
    #            print build_que[i]['x']+build_que[i]['px'],', ',build_que[i]['y']+build_que[i]['py']

    while placeable == 0:
        group, build_que[0:groups[0]], placeable = sort_placeable_ass(
            build_que[0:groups[0]], updated_model)
        if group == len(build_que[0:groups[0]]):
            return 'n', build_que[0:groups[0]]
        groups.insert(0, group)
        updated_model = fd.update_model(build_que[groups[0]:groups[1]],
                                        updated_model)

        #print 'placeable: '
        #for i in range(groups[0],groups[-1]):
        #        if build_que[i]['r'] == 0 or build_que[i]['r'] == 180:
        #            print build_que[i]['x'],', ',build_que[i]['y']+build_que[i]['p']
        #        else:
        #            print build_que[i]['x']+build_que[i]['p'],', ',build_que[i]['y']
        #print 'not placeable: '
        #for i in range(0,groups[0]):
        #        if build_que[i]['r'] == 0 or build_que[i]['r'] == 180:
        #            print build_que[i]['x'],', ',build_que[i]['y']+build_que[i]['p']
        #        else:
        #            print build_que[i]['x']+build_que[i]['p'],', ',build_que[i]['y']
        #print '\n'

    return groups, build_que
示例#3
0
def sort_bricks_flex(bricks, model):
    build_que = list(bricks)

    # separate layers
    layers = [0]
    for i in range(0, len(bricks) - 1):
        if bricks[i]['z'] != bricks[i + 1]['z']:
            layers.append(i + 1)
    layers.append(len(bricks))

    # find non-disassemblable
    sub_bricks = []
    remaining_bricks = []
    for i in range(0, len(layers) - 1):
        temp_bricks, opt = dis.sort_bricks_dis(bricks[layers[i]:layers[i + 1]],
                                               copy.deepcopy(model))
        if opt == 'n':
            sub_bricks.append(temp_bricks)
        else:
            sub_bricks.append([])
        for j in range(layers[i], layers[i + 1]):
            flag = 0
            for k in range(0, len(temp_bricks)):
                if fd.match_bricks(bricks[j], temp_bricks[k]) == 1:
                    flag = 1
            if flag == 0:
                remaining_bricks.append(bricks[j])
    print "bricks", sub_bricks

    # get replacement bricks for flexible assembly
    updated_model = fd.update_model(remaining_bricks, copy.deepcopy(model))
    changed_model = copy.deepcopy(model)
    for i in range(0, len(sub_bricks)):
        if len(sub_bricks[i]) != 0:
            replaced, replacement = get_replaceable(sub_bricks[i],
                                                    updated_model)
            for j in range(layers[i], layers[i + 1]):
                if fd.match_bricks(bricks[j], replaced) == 1:
                    changed_model = fd.update_model(
                        [replaced], copy.deepcopy(changed_model))
                    changed_model = change_model(replacement,
                                                 copy.deepcopy(changed_model))
                    build_que[j] = replacement

    return build_que, changed_model, 'y'
示例#4
0
def list_picking(bricks, model):
    updated_model = list(model)
    P = 1
    k = len(bricks)
    for i in range(0, k):
        constraints = fd.brick_constraints(bricks[i], updated_model)
        bricks[i] = dict(update_placing(bricks[i], constraints))
        updated_model = fd.update_model(bricks[i:i + 1], updated_model)
    return bricks
示例#5
0
def list_placing(bricks, model):
    updated_model = list(model)
    P = 1
    k = len(bricks)
    for i in range(0, k):
        constraints = fd.brick_constraints(bricks[k - 1 - i], updated_model)
        bricks[k - 1 - i] = dict(update_placing(
            bricks[k - 1 - i],
            constraints))  #temp dict(update_placing) once deleted p
        #P = P*p
        updated_model = fd.update_model(bricks[k - 1 - i:k - i], updated_model)
    return bricks  #,P #temp delete p
示例#6
0
def sort_layer_ass(sub_bricks, model):
    placeable = 0
    groups = [len(sub_bricks)]
    updated_model = copy.deepcopy(model)
    build_que = copy.deepcopy(sub_bricks)

    #print 'start: '
    #for i in range(0,len(build_que)):
    #            print build_que[i]['x']+build_que[i]['px'],', ',build_que[i]['y']+build_que[i]['py']

    while placeable == 0:
        group, build_que[0:groups[0]], placeable = sort_placeable_ass(
            build_que[0:groups[0]], updated_model)
        if group == len(build_que[0:groups[0]]
                        ):  # if all bricks are unplaceable by std method
            # additional tool sort for gol reassembly
            group, build_que[0:groups[0]], placeable = sort_placeable_tool(
                build_que[0:groups[0]], updated_model)
            if group == len(
                    build_que[0:groups[0]]
            ):  # if all bricks are unplaceable by tool method (only true if some cases are removed)
                return group, build_que[0:groups[0]], 'n'

            # std tool reassembly
            #groups.insert(0,0)
            #return groups,build_que,'n'

            # reassembly without tool
            #return 'n',build_que[0:groups[0]]
        groups.insert(0, group)
        updated_model = fd.update_model(build_que[groups[0]:groups[1]],
                                        updated_model)

        #print 'placeable: '
        #for i in range(groups[0],groups[-1]):
        #        if build_que[i]['r'] == 0 or build_que[i]['r'] == 180:
        #            print build_que[i]['x'],', ',build_que[i]['y']+build_que[i]['p']
        #        else:
        #            print build_que[i]['x']+build_que[i]['p'],', ',build_que[i]['y']
        #print 'not placeable: '
        #for i in range(0,groups[0]):
        #        if build_que[i]['r'] == 0 or build_que[i]['r'] == 180:
        #            print build_que[i]['x'],', ',build_que[i]['y']+build_que[i]['p']
        #        else:
        #            print build_que[i]['x']+build_que[i]['p'],', ',build_que[i]['y']
        #print '\n'

    return groups, build_que, 'y'
示例#7
0
def sort_bricks_ass(bricks, model):
    build_que = list(bricks)

    # separate layers
    layers = [0]
    for i in range(0, len(bricks) - 1):
        if bricks[i]['z'] != bricks[i + 1]['z']:
            layers.append(i + 1)
    layers.append(len(bricks))

    # sort each layer into sub-groups, label end of each sub-group
    opt = 'y'
    sub_groups = []
    for i in range(0, len(layers) - 1):
        #sub_groups.append([0])
        #print "layer ", i,": "
        sub_group, build_que[layers[i]:layers[i + 1]], opt = copy.deepcopy(
            sort_layer_ass(bricks[layers[i]:layers[i + 1]], model))

        # only for gol
        if opt == 'n':
            return build_que[layers[i]:layers[i + 1]], 'n'

        sub_groups.append(sub_group)

    # optimise picking order of each sub-group
    for i in range(0, len(layers) - 1):
        for j in range(0, len(sub_groups[i]) - 1):
            updated_model = copy.deepcopy(model)
            updated_model = fd.update_model(
                build_que[layers[i] + sub_groups[i][j + 1]:layers[i] +
                          sub_groups[i][-1]], updated_model)
            build_que[layers[i] + sub_groups[i][j]:layers[i] +
                      sub_groups[i][j + 1]] = list(
                          rnd_force_ass(
                              build_que[layers[i] +
                                        sub_groups[i][j]:layers[i] +
                                        sub_groups[i][j + 1]], updated_model))

    # update picking method
    build_que = list(list_placing(build_que, model))

    return build_que, opt  #,p #temp delete p
示例#8
0
def list_cost(bricks, model):
    cost = 0
    #tic1 = time.time()
    updated_model = copy.deepcopy(model)
    #tic2 = time.time()
    k = len(bricks)
    #tic3=0
    #tic4=0
    #tic5=0
    #tic6=0
    for i in range(0, k):
        #tic3 += time.time()
        constraints = fd.brick_constraints(bricks[k - 1 - i], updated_model)
        #tic4 += time.time()
        cost += brick_cost(bricks[k - 1 - i], constraints)
        #tic5 += time.time()
        updated_model = fd.update_model(bricks[k - 1 - i:k - i], updated_model)
        #tic6 += time.time()
    #print "times: ",tic2-tic1,tic4-tic3,tic5-tic4,tic6-tic5
    return cost
示例#9
0
def reassemble(bricks_old, bricks_new, model_old, model_new):
    dis_list = []
    updated_model = copy.deepcopy(model_old)

    # find old bricks not existant in new structure, remove all bricks above
    lowest = bricks_old[-1]
    for i in range(0, len(bricks_old)):
        flag = 0
        for j in range(0, len(bricks_new)):
            if fd.match_bricks(bricks_old[i], bricks_new[j]) == 1:
                flag = 1
                break
        if flag == 0:  #brick doesn't exist in new structure
            dis_list.append(bricks_old[i])
            if bricks_old[i]['z'] < lowest['z']:
                lowest = bricks_old[i]

    # find lowest new brick
    for i in range(0, len(bricks_new)):
        flag = 0
        for j in range(0, len(bricks_old)):
            if fd.match_bricks(bricks_new[i], bricks_old[j]) == 1:
                flag = 1
                break
        if flag == 0:  #brick doesn't exist in old structure
            if bricks_new[i]['z'] < lowest['z']:
                lowest = bricks_new[i]

    # find min no. bricks to safely disasseble
    for i in range(0, len(dis_list)):
        constraints = fd.brick_constraints(dis_list[i],
                                           copy.deepcopy(updated_model))
        if pickable(
                dis_list[i]['b'], constraints
        ) != 1:  # if not pickable: find neighbouring bricks to remove
            remove_bricks = critical_neighbours(constraints, dis_list[i],
                                                updated_model)
            for j in range(0, len(remove_bricks)):
                dis_list.append(remove_bricks[j])
            dis_list = copy.deepcopy(remove_duplicates(dis_list))
            updated_model = fd.update_model(remove_bricks, updated_model)

            #above_bricks = critical_above

    # remove layers above lowest discrepancy
    index = len(bricks_old)
    for i in range(0, len(bricks_old)):
        if bricks_old[i]['z'] == lowest['z'] + 1:
            index = i
            break
    dis_list = dis_list + list(bricks_old[index:])
    if len(dis_list) > 0:
        dis_list = copy.deepcopy(remove_duplicates(dis_list))

    # update bricks_old list
    bricks_intermediate = []
    for i in range(0, len(bricks_old)):
        flag = 0
        for j in range(0, len(dis_list)):
            if fd.match_bricks(bricks_old[i], dis_list[j]) == 1:
                flag = 1
        if flag == 0:
            bricks_intermediate.append(bricks_old[i])

    # find new bricks not existant in intermediate structure, build all
    #lowest = bricks_new[-1]
    ass_list = []
    for i in range(0, len(bricks_new)):
        flag = 0
        for j in range(0, len(bricks_intermediate)):
            if fd.match_bricks(bricks_new[i], bricks_intermediate[j]) == 1:
                flag = 1
        if flag == 0:  #brick doesn't exist in old structure
            ass_list.append(bricks_new[i])
            #if bricks_new[i]['z']<lowest['z']:
            #    lowest = bricks_new[i]

    # only for gol
    # if not assemblable, sort will return bricks which cannot be assembled, and 'n', otherwise sorted list and 'y'
    blocking_bricks = []
    que, opt = ass.sort_bricks_ass(ass_list, copy.deepcopy(model_new))
    if opt == 'n' and len(que) != 0:
        for i in range(0, len(que)):
            bb = find_brick(que[i]['x'], que[i]['y'] - 1, que[i]['z'],
                            model_new)
            if bb != None:
                blocking_bricks.append(bb)
            bb = find_brick(que[i]['x'] + 2, que[i]['y'], que[i]['z'],
                            model_new)
            if bb != None:
                blocking_bricks.append(bb)
            bb = find_brick(que[i]['x'], que[i]['y'] + 2, que[i]['z'],
                            model_new)
            if bb != None:
                blocking_bricks.append(bb)
            bb = find_brick(que[i]['x'] - 1, que[i]['y'], que[i]['z'],
                            model_new)
            if bb != None:
                blocking_bricks.append(bb)
        blocking_bricks = list(remove_duplicates(blocking_bricks))

        # check if 1 brick can be removed to fix assembly
        ass_list.append(blocking_bricks[0])
        for i in range(0, len(blocking_bricks)):
            ass_list[-1] = blocking_bricks[i]
            que, opt = ass.sort_bricks_ass(ass_list, copy.deepcopy(model_new))
            if opt == 'y':
                dis_list.append(blocking_bricks[i])
                return dis_list, ass_list

        # check if 2 bricks can be removed to fix assembly
        ass_list[-1] = blocking_bricks[0]
        ass_list.append(blocking_bricks[1])
        for i in range(0, len(blocking_bricks) - 1):
            ass_list[-2] = blocking_bricks[i]
            for j in range(i + 1, len(blocking_bricks)):
                ass_list[-1] = blocking_bricks[j]
                que, opt = ass.sort_bricks_ass(ass_list,
                                               copy.deepcopy(model_new))
                if opt == 'y':
                    dis_list.append(blocking_bricks[i])
                    dis_list.append(blocking_bricks[j])
                    return dis_list, ass_list

        return 'help'

    #index = len(bricks_new)
    #for i in range(0,len(bricks_new)):
    #    if bricks_new[i]['z'] == lowest['z']+1:
    #        index = i
    #        break
    #ass_list = list(bricks_new[index:])
    #ass_list.insert(0,lowest)

    return dis_list, ass_list
示例#10
0
def reassemble(bricks_old, bricks_new, model_old, model_new):
    dis_list = []
    updated_model = copy.deepcopy(model_old)

    # find old bricks not existant in new structure, remove all bricks above
    lowest = bricks_old[-1]
    for i in range(0, len(bricks_old)):
        flag = 0
        for j in range(0, len(bricks_new)):
            if fd.match_bricks(bricks_old[i], bricks_new[j]) == 1:
                flag = 1
        if flag == 0:  #brick doesn't exist in old structure
            dis_list.append(bricks_old[i])
            if bricks_old[i]['z'] < lowest['z']:
                lowest = bricks_old[i]

    # find lowest new brick
    for i in range(0, len(bricks_new)):
        flag = 0
        for j in range(0, len(bricks_old)):
            if fd.match_bricks(bricks_new[i], bricks_old[j]) == 1:
                flag = 1
        if flag == 0:  #brick doesn't exist in old structure
            if bricks_new[i]['z'] < lowest['z']:
                lowest = bricks_new[i]

    # find min no. bricks to safely disasseble
    for i in range(0, len(dis_list)):
        constraints = fd.brick_constraints(dis_list[i], updated_model)
        if pickable(
                dis_list[i]['b'], constraints
        ) != 1:  # if not pickable: find neighbouring bricks to remove
            remove_bricks = critical_neighbours(constraints, dis_list[i],
                                                updated_model)
            for j in range(0, len(remove_bricks)):
                dis_list.append(remove_bricks[j])
            dis_list = copy.deepcopy(remove_duplicates(dis_list))
            updated_model = fd.update_model(remove_bricks, updated_model)

            #above_bricks = critical_above

    # remove layers above lowest discrepancy
    index = len(bricks_old)
    for i in range(0, len(bricks_old)):
        if bricks_old[i]['z'] == lowest['z'] + 1:
            index = i
            break
    dis_list = dis_list + list(bricks_old[index:])
    if len(dis_list) > 0:
        dis_list = copy.deepcopy(remove_duplicates(dis_list))

    # update bricks_old list
    bricks_intermediate = []
    for i in range(0, len(bricks_old)):
        flag = 0
        for j in range(0, len(dis_list)):
            if fd.match_bricks(bricks_old[i], dis_list[j]) == 1:
                flag = 1
        if flag == 0:
            bricks_intermediate.append(bricks_old[i])

    # find new bricks not existant in intermediate structure, build all
    #lowest = bricks_new[-1]
    ass_list = []
    for i in range(0, len(bricks_new)):
        flag = 0
        for j in range(0, len(bricks_intermediate)):
            if fd.match_bricks(bricks_new[i], bricks_intermediate[j]) == 1:
                flag = 1
        if flag == 0:  #brick doesn't exist in old structure
            ass_list.append(bricks_new[i])
            #if bricks_new[i]['z']<lowest['z']:
            #    lowest = bricks_new[i]

    #index = len(bricks_new)
    #for i in range(0,len(bricks_new)):
    #    if bricks_new[i]['z'] == lowest['z']+1:
    #        index = i
    #        break
    #ass_list = list(bricks_new[index:])
    #ass_list.insert(0,lowest)

    return dis_list, ass_list