Я пытаюсь решить проблему оптимизации, используя python 3.7.1, spider и or-tools. В настоящее время я хочу классифицировать объекты по 3 различным классам, используя ограничения.
Сначала я попытался решить эту проблему, используя:
#solver = pywraplp.Solver('LinearExample',
# pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
Я получил некоторые результаты, но не ожидаемые, потому что xA xB xC должно быть 3 двоичных вектора.
Итак, я заменил эти две строки, чтобы решить эту проблему как целочисленную проблему, которая кажется мне более логичной, следующим образом:
solver = pywraplp.Solver('SolveIntegerProblem',
pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)
Когда я запускаю код, открывается окно с сообщением: он перестал работать, тогда я получаю следующее предупреждение:
"An error ocurred while starting the kernel"
WARNING: Logging before InitGoogleLogging() is written to STDERR
F0327 09:54:41.733001 3784 map_util.h:126] Check failed: collection‑>insert(value_type(key, data)).second duplicate key: xA
*** Check failure stack trace: ***
Тогда я должен закрыть консоль
Я не понимаю, почему проблема, кажется, х ... в то время как это не было с 'LinearExample'
Здесь код, воспроизводящий ошибку:
from __future__ import print_function
import pandas as pd
from ortools.linear_solver import pywraplp
def main():
solver = pywraplp.Solver('SolveIntegerProblem',
pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)
#solver = pywraplp.Solver('LinearExample',
# pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
#
xA = [] # xA[i]=1 if i classified in A, else 0
xB = [] # xB[i]=1 if i classified in B, else 0
xC = [] # xC[i]=1 if i classified in C, else 0
d={'A':[19286.0,23786.0,9822,5054.0,97466.0,728998.0,275708.0,4576.0,67284.0,385582.0,13450.0,43271.0,44601.0,88372.0],
'B':[12073.0,21563.0,13077.0,6407.0,91850.0,557996.0,206372.0,2812.0,52362.0,244102.0,11225.0,50612.0,49299.0,76099.0],
'C':[12048.0,42648.0,35491.0,19800.0,117602.0,643498.0,232377.0,5217.0,79200.0,234259.0,19296.0,114048.0,100725.0,130911.0]}
coeff = pd.DataFrame(data=d)
c={'A':[11503,10638,1984,364,15022,40343,41478,238,3528,51649,5759,5305,7883,301],
'B':[1783,2047,425,88,2306,6261,6423,51,610,7976,1034,1021,1443,537],
'C':[128,250,61,15,161,453,461,8,60,566,111,125,161,57]}
weight = pd.DataFrame(data=c)
nb_obj=len(coeff['A'])
#variables values : 0 or 1
for i in range(nb_obj):
xA.append(solver.IntVar(0.0, 1.0, 'xA'))
xB.append(solver.IntVar(0.0, 1.0, 'xB'))
xC.append(solver.IntVar(0.0, 1.0, 'xC'))
# total weight per class is limited
solver.Add(sum(xA*weight.A)<=80000)
solver.Add(sum(xB*weight.B)<=15000)
solver.Add(sum(xC*weight.C)<=1500)
# number of object in each class is limited
solver.Add(sum(xA)<=3)
solver.Add(sum(xB)<=6)
solver.Add(sum(xC)<=5)
# 1 object can only belong to a single class
for i in range (nb_obj):
solver.Add(xA[i]+xB[i]+xC[i]==1)
objective = solver.Objective()
for i in range(nb_obj):
objective.SetCoefficient(xA[i], coeff.A[i])
objective.SetCoefficient(xB[i], coeff.B[i])
objective.SetCoefficient(xC[i], coeff.C[i])
objective.SetMaximization()
"""Solve the problem and print the solution."""
result_status = solver.Solve()
# The problem has an optimal solution.
assert result_status == pywraplp.Solver.OPTIMAL
print('Number of variables =', solver.NumVariables())
print('Number of constraints =', solver.NumConstraints())
# The objective value of the solution.
print('Optimal objective value = %d' % solver.Objective().Value())
print()
# The value of each variable in the solution.
for i in range(nb_obj):
print("obj",i+1," : ",xA[i].solution_value(),xB[i].solution_value(),xC[i].solution_value())
if __name__ == '__main__':
main()
Не могли бы вы помочь мне запустить код?