невозможное решение на Python, целлюлоза с использованием COIN-OR

Я пытаюсь решить проблему линейного программирования с помощью COIN-OR в python. Я выполнил всю работу, но, похоже, есть ошибка, которую я не могу идентифицировать. Часто решение оказывается либо недопустимым, либо неправильным в зависимости от ограничений, которые я пытаюсь навязать. Значения, двоичная переменная также неверны, т.е. ~ 0,1 ^ 10 или ~ 0,999 .....

Пожалуйста, помогите мне найти ошибку или попробуйте руководство по ее устранению.

Я прилагаю

  • zip файл (код + файл исходных данных из excel)
  • слово док. для математической постановки

Основной класс Model1 принимает входные данные и создает новый выходной файл, а затем методы класса PanelTwo создают матрицу Distance и матрицу Njg.

Кажется, есть ошибка в методе конструктора класса Model1, который строит LP и решает LP

Вот zip-файл

код для объявления переменных и ограничений:

M = 100000 * prob.schoolNum

    sModel = []
    for i in range(prob.schoolNum):
        sModel.append(i)
    gModel = []
    for i in xrange(prob.gradeNum):
        gModel.append(i)
    Beta = []

    for i in xrange(prob.schoolNum):
        temp = 0
        for j in xrange(prob.gradeNum):
            temp = temp + prob.Njg[i][j]
        if temp < prob.Nmax:
            Beta.append(0)
        else:
            Beta.append(1)


    # x = students of grade g transfer from school i to j
    x = LpVariable.matrix("x_igj_", (sModel, gModel, sModel), 0, 1, LpBinary)
    y = LpVariable.matrix("status of school", (sModel), 0, 1, LpBinary)
    # o = resulting students in grade in school
    o = LpVariable.matrix("o", (sModel, gModel), 0, None, LpInteger)

    # oHelper  = summation of o for all g rades
    oHelper = LpVariable.matrix("oH", (gModel), 0, None, LpInteger)
    #Njg_Helper = Total students in a particular school
    Njg_helper = LpVariable.matrix("NH", (sModel), 0, None, LpInteger)






    formulation = LpProblem("School Consolidation Model", LpMinimize)

    formulation += lpSum(((prob.Njg[i][g] * x[i][g][j] for j in sModel) for g in gModel) for i in sModel)

    for i in sModel:
        for j in sModel:
            for g in gModel:
                formulation += x[i][g][j] * prob.D[i][j] <= prob.d1

    for i in sModel:
        for j in sModel:
            for g in gModel:
                formulation += x[i][g][j] <= y[j]
    for i in sModel:
        for g in gModel:
            formulation += lpSum(x[i][g][j] for j in sModel) <= 1 - y[i]

    for j in sModel:
        formulation += ((lpSum(prob.Njg[j][g] for g in gModel) - prob.Nmax) * (1 - y[j])) <= 0

    for i in sModel:
        for j in sModel:
            if i != j and Beta[i] * Beta[j] != 1:
                formulation += (prob.D[i][j] - prob.d2) >= (y[i] + y[j] - 2) * M

    for g in gModel:
        formulation += lpSum(o[j][g] for j in sModel) == oHelper[g]
        formulation += lpSum(prob.Njg[i][g] for i in sModel) == oHelper[g]
        for j1 in sModel:
            formulation += lpSum(prob.Njg[i1][g]*x[i1][g][j1] for i1 in sModel) == o[j1][g]-prob.Njg[j1][g]*y[j1]

    formulation.solve()

person Ujjawal107    schedule 18.04.2017    source источник
comment
Вы, вероятно, получите более полезный ввод, если скопируете код, в котором обнаруживаете ошибки, в сам вопрос, а не на ссылку на zip-файл - надеюсь, что это поможет.   -  person bouteillebleu    schedule 18.04.2017
comment
Спасибо за совет, готово. Можете ли вы помочь найти решение   -  person Ujjawal107    schedule 18.04.2017


Ответы (1)


У вас могут быть ошибки в модели. Я бы попробовал следующее:

  • Постройте минимальную модель со всеми функциями. То есть сначала создайте самую маленькую модель, которую вы можете построить (игрушечный пример), чтобы сгенерированная модель была удобочитаемой. С одним или двумя студентами, только два местоположения и т. Д. Модель, решение которой можно вычислить вручную.
  • Используя функцию Pulp, создайте LP файл, содержащий модель.
  • Запустите модель с другим решателем, чтобы убедиться, что вы получаете такие же невыполнимые результаты (например, попробуйте SCIP, если вы не участвуете в коммерческом проекте).
  • Прочтите файл lp, чтобы проверить / найти ошибку в модели.
person eguaio    schedule 12.05.2017
comment
Спасибо за помощь и внимание. Наконец-то мы смогли найти решение - person Ujjawal107; 26.05.2017