質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1094閲覧

意図しない繰り返しをなくしたい

syc98

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/08/28 08:13

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

下記のプログラムを実行すると、SolveModelの部分を三度繰り返してしまいます。 クラス化する前は問題なく動いていたのですが…

該当のソースコード

python

1N = 2.0 #確保すべき非重複経路の本数 2start_node = "hoge" 3goal_node = "hogehoge" 4 5class MinPath(): 6 def __init__(self): 7 self.list_base = [] 8 self.list_ward = [] 9 self.list_node = [] 10 self.list_link = [] 11 self.my_vars = [] 12 self.my_obj = [] 13 self.my_types = [] 14 self.my_senses = [] 15 self.my_rhs = [] 16 self.my_lhs = [] 17 self.my_cons = [] 18 self.list_solution = [] 19 20#### 道路と頂点のデータを読み込む 21 def ReadCsv(self): 22 with open("hogehogehoge.csv", encoding = "utf-8-sig") as f: 23 reader = csv.reader(f) 24 25 for row in reader: 26 self.list_node.append(row[1]) 27 if "base" in row[0]: 28 self.list_base.append(row[1]) 29 elif "ward" in row[0]: 30 self.list_ward.append(row[1]) 31 else: 32 pass 33 34 35 with open("hogehogehoge.csv", encoding = "utf-8-sig") as p: 36 reader = csv.reader(p) 37 header = next(reader) 38 39 for row in reader: 40 self.list_link.append([row[0], row[1], row[2], row[3], row[4]]) 41 #[変数 , 始点 , 終点 , 距離 , 所属] 42 43 44 45#### 線形計画問題の作成 46 def CreateModel(self): 47 list_start_in = [] 48 list_start_in_coeff = [] 49 list_start_out = [] 50 list_start_out_coeff = [] 51 list_goal_in = [] 52 list_goal_in_coeff = [] 53 list_goal_out = [] 54 list_goal_out_coeff = [] 55 56## 目的関数の係数、変数名とタイプを追加 57 for link in self.list_link: 58 self.my_vars.append(link[0]) 59 self.my_types.append("B") 60 self.my_obj.append(float(link[3])) 61 62 63## 制約式の係数と変数、等号、右辺の値を追加 64 i = 1 65 for node in self.list_node: 66## nodeがstart_nodeと同じ場合 67 if node == start_node: 68 for link in self.list_link: 69 if node == link[1]: 70 list_start_out.append(link[0]) 71 list_start_out_coeff.append(1.0) 72 elif node == link[2]: 73 list_start_in.append(link[0]) 74 list_start_in_coeff.append(1.0) 75 else: 76 pass 77 78 self.my_lhs.append([list_start_in, list_start_in_coeff]) 79 self.my_rhs.append(0.0) 80 self.my_senses.append("E") 81 self.my_cons.append("c{}".format(i)) 82 i += 1 83 84 self.my_lhs.append([list_start_out, list_start_out_coeff]) 85 self.my_rhs.append(N) 86 self.my_senses.append("E") 87 self.my_cons.append("c{}".format(i)) 88 i += 1 89 90 91## nodeがgoal_nodeと同じ場合 92 elif node == goal_node: 93 for link in self.list_link: 94 if node == link[1]: 95 list_goal_out.append(link[0]) 96 list_goal_out_coeff.append(1.0) 97 elif node == link[2]: 98 list_goal_in.append(link[0]) 99 list_goal_in_coeff.append(1.0) 100 else: 101 pass 102 103 self.my_lhs.append([list_goal_in, list_goal_in_coeff]) 104 self.my_rhs.append(N) 105 self.my_senses.append("E") 106 self.my_cons.append("c{}".format(i)) 107 i += 1 108 109 self.my_lhs.append([list_goal_out, list_goal_out_coeff]) 110 self.my_rhs.append(0.0) 111 self.my_senses.append("E") 112 self.my_cons.append("c{}".format(i)) 113 i += 1 114 115 116## nodeがstart_nodeでもgoal_nodeでもない場合 117 else: 118 list_vars = [] 119 list_coeff = [] 120 for link in self.list_link: 121 if node == link[1]: 122 list_vars.append(link[0]) 123 list_coeff.append(-1.0) 124 elif node == link[2]: 125 list_vars.append(link[0]) 126 list_coeff.append(1.0) 127 else: 128 pass 129 130 self.my_lhs.append([list_vars, list_coeff]) 131 self.my_rhs.append(0.0) 132 self.my_senses.append("E") 133 self.my_cons.append("c{}".format(i)) 134 i += 1 135 136 137 138### 線形計画問題を解く 139 def SolveModel(self): 140 prob = cplex.Cplex() 141 prob.set_results_stream(None) 142 prob.objective.set_sense(prob.objective.sense.minimize) 143 prob.variables.add(obj = self.my_obj, types = self.my_types, names = self.my_vars) 144 prob.linear_constraints.add(lin_expr = self.my_lhs, senses = self.my_senses, rhs = self.my_rhs, names = self.my_cons) 145 prob.solve() 146 147 numrows = prob.linear_constraints.get_num() 148 numcols = prob.variables.get_num() 149 150 if prob.solution.status[prob.solution.get_status()] == "MIP_infeasible": 151 print("\n!!!!!実行可能解がないか、エラーがあります!!!!!") 152 print("!!!!!非重複経路数の条件を緩和してください!!!!!") 153 sys.exit() 154 else: 155 vname = prob.variables.get_names() 156 x = prob.solution.get_values() 157 for j in range(numcols): 158 if x[j] == 0: 159 pass 160 else: 161 for link in self.list_link: 162 if vname[j] == link[0]: 163 self.list_solution.append(link) 164 else: 165 pass 166 167 return prob.solution.status[prob.solution.get_status()], prob.solution.get_objective_value() 168 169 170### 解を表示する 171 def print_ans(self): 172 if self.SolveModel()[0] == "MIP_infeasible": 173 pass 174 else: 175 print("始点:{}、終点:{}、非重複経路数{}本".format(start_node, goal_node, N)) 176 print("総延長は", self.SolveModel()[1], "kmです。\n") 177 178 for link in self.list_solution: 179 print(link[4], ":", link[1], "から", link[2], "({}km)".format(link[3])) 180 181 182 183a = MinPath() 184a.ReadCsv() 185a.CreateModel() 186a.SolveModel() 187a.print_ans() 188

試したこと

プログラム全体を確認していくとどうやらSolveModelの部分に問題がありそうということが分かりました。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

print_ans関数の中でself.SolveModel()[0]のようにSolveModel関数を呼び出しているところが2か所ありa.CreateModel()と合わせて3回呼ばれています。
a.SolveModel()の戻り値を変数に代入して、それをprint_ansの引数として渡すように処理を見直してはいかがでしょうか?
概念修正例

Python

1# 略 2ret = a.SolveModel() 3a.print_ans(ret)

投稿2020/08/28 08:23

編集2020/08/28 08:26
can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syc98

2020/08/28 08:39

おかげさまでうまく動作するようになりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問