Попытка выполнить целочисленную оптимизацию с уникальными значениями в Python - PullRequest
1 голос
/ 06 июля 2019

Я пытаюсь решить проблему оптимизации в Python. На данный момент я уже знаком со Scipy, но мне не удалось правильно его использовать с ограничением уникальных целочисленных значений.

В приведенном ниже примере может лучше подойти тег mlrose.

На высоком уровне я пытаюсь создать швейцарскую пару, я видел несколько статей, и в одной из них была предложена «Матрица штрафов» и чтобы минимизировать штраф. Вот что я сделал:

import mlrose
import numpy as np

# Create Penalty Matrix
x = np.round(np.random.rand(8,8)*50)
z = np.eye(8, dtype=int)*100 + x

print(z)
# fitness problem given a penalty matrix and an order
def pairing_fittness(order, panalty):
  print(order)
  order = np.array(order)
  a = np.bincount(order)
  order = order.reshape(-1, 2)
  PF = 0
  for pair in order:
    print("{}, {}: {}".format(pair[0],pair[1], panalty[pair[0],pair[1]]))
    PF = PF + panalty[pair[0],pair[1]]
  print("Real PF: ",PF)
  print("order penalty: {}".format((np.max(a) - 1) * 1000))
  return (PF + (np.max(a) - 1) * 1000)

Одна из проблем, которую пытается решить, - это создать массив с уникальными значениями (один и тот же игрок не может играть дважды в одном раунде), поэтому штраф за дублированные значения высокий (1000)

kwargs = {'panalty': z}

fitness_cust_problem_fun = mlrose.CustomFitness(pairing_fittness, **kwargs)
problem = mlrose.DiscreteOpt(length = 8,
                             fitness_fn = fitness_cust_problem_fun,
                             maximize = False,
                             max_val = 8,
                            )

best_state, best_fitness = mlrose.simulated_annealing(
    problem,
    max_attempts = 300,
     max_iters = 100000,
    random_state = 1)

print(best_state)
print(best_fitness)

Что бы я ни делал, с более чем 6 переменными он не может найти массив уникальных значений для его оптимизации. Пока я могу это сделать в Excel (Solver> Evolutionary).

Я ищу лучший инструмент (я использовал scipy.optimize, но я не уверен, что он хорошо работает для целочисленных задач, так как я получил лучшие результаты с помощью mlrose) или предложения о том, как улучшить мою проблему оптимизации, чтобы она разрешимы.

...