2017-07-15 27 views
0

CPLEXとPythonの統合時に新規です。タイトルに書かれているCplex-Python統合のエラーがあります。私のコードは以下の通りです。エラーの原因は最後に設定された制約です。私は何かアドバイスを受けています。 ありがとうございます。 Mathematical formulation of the last constraint setCplexSolverError:CPLEXエラー1222:重複したエントリまたはエントリ

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 
""" 
Created on Sun Jul 9 10:06:38 2017 

@author: nazmisener 
""" 
from __future__ import print_function 
import pandas as pd 
import cplex 
from cplex.exceptions import CplexSolverError 
import numpy as np 
import xlrd 


noph=25 
noz=[ 25 for i in range(noph) ] 
#acquiring data from excel 
dem = [ [ 1000 for i in range(noph) ] for j in range(noph) ] 

fc = [ [ 0.5 for i in range(noph) ] for j in range(noph) ] 

c=[ [ 0 for i in range(noph) ] for j in range(noph) ] 
for i in range(noph): 
    for k in range(noph): 
     c[i][k]=fc[i][k]/25000 

hoc=[ 10000 for i in range(noph) ] 
#determining link with maximum length 
maxar=max(fc) 
maxlin=max(maxar) 

#coverage percentage 
perc=0.7 
meas=perc*maxlin 


A=[ [ 0 for i in range(noph) ] for j in range(noph) ] 
objt=[ [ 0 for i in range(noph) ] for j in range(noph) ] 
#calculating matrix A 
for d1 in range(noph): 
    for d2 in range(noph): 
     if meas<fc[d1][d2] or d1==d2: 
      A[d1][d2]=0 
     else: 
      A[d1][d2]=1 

O=[ 0 for i in range(noph) ] 
D=[ 0 for i in range(noph) ] 
for i in range(noph): 
    for j in range(noph): 
     O[i]=+dem[i][j] 
     D[i]=+dem[j][i] 

for i in range(noph): 
    for k in range(noph): 
     if i!=k: 
      objt[i][k] = c[i][k]*(O[i]+D[i]) 
     else: 
      objt[i][k]=0 


def dethub(): 
    model=cplex.Cplex() 
    model.objective.set_sense(model.objective.sense.minimize) 

#defining decision variables 
    x=["x{0}".format(i+1) for i in range(noph)] 
    model.variables.add(obj=hoc, lb=[0.0]*noph, ub=[1.0] *noph, 
          types=["B"] *noph , names=x) 

    z=[] 
    for i in range(noph): 
     z.append([]) 
     for j in range(noph): 
      varName = "z." + str(i) + "." + str(j) 
      z[i].append(model.variables.get_num()) 
      model.variables.add(obj=[objt[i][j]], 
           lb=[0.0], ub=[1.0], 
           names=[varName]) 

# colname_y = ["y{0}{1}{2}".format(i+1,j+1,z+1) for i in range(noph) 
# for j in range(noph) for z in range(noph)] 
# model.variables.add(obj=c) 
    y = [] 
    for i in range(noph): 
     y.append([]) 
     for k in range(noph): 
      y[i].append([]) 
      for j in range(noph): 
       yvarName = "y." + str(i) + "." + str(k) + "." + str(j) 
       y[i][k].append(model.variables.get_num()) 
       model.variables.add(obj=[c[i][k]], 
            lb=[0.0], 
            ub=[cplex.infinity], 
            names=[yvarName]) 

#defining constraints 
#the coverage constraints 
    for i in range(noph): 
     for k in range(noph): 
      thevars=[] 
      thecoefs=[] 
      thevars.append(z[i][k]) 
      thecoefs.append(1) 
      thevars.append(A[i][k]*z[k][k]) 
      thecoefs.append(-1) 
      model.linear_constraints.add(
          lin_expr=[cplex.SparsePair(thevars, thecoefs)], 
          senses=["L"], 
          rhs=[0.0]) 

#summation of flow constraints 
    for i in range(noph): 
     summation_constraint = cplex.SparsePair(ind=[z[i][k] for k in 
                 range(noph)], 
               val=[1.0] * noph) 
     model.linear_constraints.add(lin_expr=[summation_constraint], 
            senses=["E"], 
            rhs=[1]) 

#flow ensure constraints   
    for i in range(noph): 
     for k in range(noph): 
      thevarws=[z[i][k]] 
      thecoefws=[-O[i]] 
      for l in [q for q in xrange(noph) if q!=k]: 
       thevarws.append(y[i][k][l]) 
       thecoefws.append(1) 
      model.linear_constraints.add(
          lin_expr=[cplex.SparsePair(thevarws, thecoefws)], 
          senses=["L"], 
          rhs=[0.0]) 

#x equality constraints 
    for k in range(noph): 
     thevarys=[] 
     thecoefys=[] 
     thevarys.append(z[k][k]) 
     thecoefys.append(1) 
     thevarys.append(x[k]) 
     thecoefys.append(-1) 
     model.linear_constraints.add(
          lin_expr=[cplex.SparsePair(thevarys, thecoefys)], 
          senses=["E"], 
          rhs=[0.0]) 

#flow conservation constraints 
    for i in range(noph): 
     for k in range(noph): 
      thevarxs=[z[i][k]] 
      thecoefxs=[O[i]] 
      for l in [q for q in xrange(noph) if q!=k]: 
       thevarxs.append(y[i][k][l]) 
       thecoefxs.append(-1) 
       thevarxs.append(y[i][l][k]) 
       thecoefxs.append(1) 
      for j in range(noph): 
       thevarxs.append(z[j][k]) 
       thecoefxs.append(-dem[k][j]) 
      model.linear_constraints.add(
          lin_expr=[cplex.SparsePair(thevarxs, thecoefxs)], 
          senses=["E"], 
          rhs=[0.0]) 

    try: 
     model.solve() 
    except CplexSolverError as e: 
     print("Exception raised during solve: " + e) 
    else: 
     solution = model.solution 

     # solution.get_status() returns an integer code 
     print("Solution status = ", solution.get_status(), ":", end=' ') 
     # the following line prints the corresponding string 
     print(solution.status[solution.get_status()]) 

     # Display solution. 
     print("Total cost = ", solution.get_objective_value()) 

if __name__ == "__main__": 
    dethub() 
+0

この質問は、[crossposted](https://www.ibm.com/developerworks/community/forums/html/topic?id=1f29c497-d455-42c6-a9a7-627c19d21f63)です。将来はそれを避けてください。 – rkersh

答えて

0

エラーが言うように、問題は、あなたが重複したエントリを追加しているということです。最後の制約セットで、ちょうどmodel.linear_constraints.addの呼び出しの前に次の行を追加します。それに

print("thevarxs: ", sorted(thevarxs)) 

、我々は次の出力を参照してください。

thevarxs: [25, 25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500, 525, 550, 575, 600, 625, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 700, 725, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1025, 1050, 1075, 1100, 1125, 1150, 1175, 1200, 1225, 1250] 

インデックスは、2つのエントリがあります。これを修正すると、問題は解決しなくなります。

自分で簡単にするには、モデルのより小さなバージョンを使用することを強くお勧めします。それから、一度に1歩ずつ作業していくうちに、より大きなモデルを試してみてください。

関連する問題