2017-04-15 9 views
1

私はpyomoを使用してTSPの問題を解決しようとしています。私はpythonとGurobiを使用して正常に実装しましたが、私のGurobiライセンスは期限切れですので、今はpyomoとGLPKを使用してTSPの問題を実装したいと考えています。これはこれまで私が思いつくことができるものです。客観的な価値は0ではありません。助けてください。Pyomoを使用してセールスマンを旅行

from pyomo.environ import * 
from pyomo.opt import SolverFactory 
import pyomo.environ 

n=13 
distanceMatrix=[[0,8,4,10,12,9,15,8,11,5,9,4,10], 
    [8,0,7,6,8,6,7,10,12,9,8,7,5], 
    [4,7,0,7,9,5,8,5,4,8,6 ,10,8], 
    [10,6 ,7,0,6,11,5 ,9,8,12,11,6,9], 
    [12,8 ,9,6, 0,7,9,6,9,8,4,11,10], 
    [9,6,5,11,7,0,10,4,3,10,6,5,7], 
    [15,7 ,8,5,9,10,0,10,9,8,5,9,10], 
    [8,10 ,5,9,6,4,10,0,11,5,9,6,7], 
    [11,12,4,8, 9,3,9,11,0, 9,11,11,6], 
    [5,9,8,12,8,10,8,5,9,0,6,7,5], 
     [9,8,6,11,4,6,5,9,11,6,0,10,7], 
     [4,7,10,6,11,5,9,6,11,7,10,0,9], 
     [10,5,8,9,10,7,10,7,6,5,7,9,0]] 
startCity = 0 

model = ConcreteModel() 
model.N=Set() 
model.M=Set() 
model.c=Param(model.N,model.M, initialize=distanceMatrix) 
model.x=Var(model.N,model.M, within=NonNegativeReals) 
def obj_rule(model):    
    return sum(model.c[n,j]*model.x[n,j] for n in model.N for j in model.M) 
model.obj = Objective(rule=obj_rule,sense=minimize) 
def con_rule(model, n): 
    return sum(model.x[j,n] for j in model.M if j < n) + sum(model.x[n,j] for j in Model.M if j > i) == 2 

model.con = Constraint(model.N, rule=con_rule,doc='constraint1') 
opt = SolverFactory("glpk") 
results = opt.solve(model) 
results.write() 
print('Printing Values') 

答えて

1

次の回答は、Python 3.5.3とPyomo 5.1.1でテストされています。

  1. セットmodel.Mmodel.Nが初期化されていません。

    これは空のセットを宣言する効果があります。したがって、実行する場合:

    model.con.pprint() 
    

    あなたは制約が宣言されていないことがわかります。同様に、model.objは0にほぼ等しく、model.cmodel.xは空の宣言です。

    あなたは(私はあなたが1からnまでのインデックスを作成すると仮定しています)でこの問題を解決することができます

    model.M以来
    model.M = Set(initialize=range(1, n+1)) 
    model.N = Set(initialize=range(1, n+1)) 
    

    model.NRangeSetを使用して範囲ですが、以下のものを使用して、つまり、おそらくより適しています代わりに、上記の:

    model.M = RangeSet(n) 
    model.N = RangeSet(n) 
    

    ザはPyomo RangeSet上方集合{1、2、...、N}に等しいです。

    さらに、model.Mmodel.Nが同じであるため、セットの1つを宣言するだけで十分です。したがって、model.Nという宣言を削除し、model.Nへの参照をmodel.Mに置き換えた場合、同じ動作になります。

  2. model.cの初期化は、(i, j)インデックスごとに実行する必要があります。

    あなたは(lambda機能を使用して)でこの問題を解決することができます

    model.c = Param(model.N, model.M, initialize=lambda model, i, j: distanceMatrix[i-1][j-1]) 
    

    Pythonはそれゆえ、我々はインデックスdistanceMatrix[i-1][j-1]を使用する1から0、model.Mmodel.N最初からインデックスを示しています。

  3. 変数model.xはバイナリではありません。

    TSPでは、model.xが表す変数は通常バイナリです。行った後、問題を解決することは、手順1と2はmodel.x変数はあなたがしてバイナリにmodel.xのドメインを変更することができ、このような2

    として値取ることができます:

    model.x = Var(model.N, model.M, within=Binary) 
    
  4. 制約をmodel.conことはできません。 TSPツアー。、(model.xがバイナリであることを仮定して)私たちは= N 1を取る場合は、model.conは、TSPの解決策は、都市1を始動から訪れた2つの都市を持つことになりますどの

    model_con

    model.conは同等ですTSPの定義では許可されていません。

関連する問題