Exemplo n.º 1
0
def generate_solution(pizza):
    # Create new solution
    solution = Solution(pizza)
    # copy all the part to create a random order
    slices = deepcopy(slices_module.slices)
    shuffle(slices)

    # Add all the possible slices following the slices order
    for slice in slices:
        solution.add_slice(slice)

    return solution
Exemplo n.º 2
0
def generate_solution (prev_sol, hole=None):
	# Create new solution
	solution = Solution(prev_sol.pizza, prev_sol.slices.values())

	# look for possible slices
	possible_slices = {}
	possible_slices_per_tile = {}
	# enumerate all the tiles
	possible_idxs = []
	if hole == None:
		for i, row in enumerate(prev_sol.coverage):
			for j, val in enumerate(row):
				if val == -1:
					possible_idxs += slices_module.slices_per_tile[i][j]
	else:
		for i in range(hole[0], hole[2]):
			for j in range(hole[1], hole[3]):
				possible_idxs += slices_module.slices_per_tile[i][j]
	# extract uniq idxs
	uniq = set(possible_idxs)
	# Look for possible tiles
	for idx in uniq:
		possible = True
		slice = slices_module.slices[idx]
		for i in range(slice[0], slice[2]+1):
			for j in range(slice[1], slice[3]+1):
				if prev_sol.coverage[i][j] != -1:
					possible = False

		if possible:
			#save slice
			possible_slices[idx] = slice
			# prepare the constraints
			for r in range(slice[0], slice[2]+1):
				# Init row
				if not r in possible_slices_per_tile:
					possible_slices_per_tile[r] = {}
				# fill row
				for c in range(slice[1], slice[3]+1):
					# Init col
					if not c in possible_slices_per_tile[r]:
						possible_slices_per_tile[r][c] = []
					# fill col
					possible_slices_per_tile[r][c].append(idx)

	# If no slice can be put on
	if len(possible_slices) == 0:
		return prev_sol

	# Create MIP model
	m = Model("mip")
	# m.setParam( 'OutputFlag', False )
	vars = {}
	sizes = {}

	# Add all the possible slices to the model
	for idx in possible_slices:
		slice = possible_slices[idx]
		vars[idx] = m.addVar(vtype=GRB.BINARY, name="{}".format(idx))
		sizes[idx] = (slice[2]+1 - slice[0]) * (slice[3]+1 - slice[1])

	# Create the maximization objective
	m.setObjective(quicksum([vars[idx] * sizes[idx] for idx in vars]), GRB.MAXIMIZE)

	# Add one constraint per tile
	constraint_id = 0
	for row_idx in possible_slices_per_tile:
		for col_idx in possible_slices_per_tile[row_idx]:
			sl_list = possible_slices_per_tile[row_idx][col_idx]
			# no slice on the tile
			if len(sl_list) == 0:
				continue

			# add a constraint on the tile
			m.addConstr(quicksum([vars[idx] for idx in sl_list]) <= 1, "c{}".format(constraint_id))
			constraint_id += 1

	m.optimize()

	for v in m.getVars():
		# print(v.varName, v.x)
		if v.x == 1:
			solution.add_slice(possible_slices[int(v.varName)])

	return solution