質問編集履歴

3

コードの追記

2017/03/05 11:13

投稿

okazujet
okazujet

スコア11

test CHANGED
File without changes
test CHANGED
@@ -72,8 +72,290 @@
72
72
 
73
73
  不明瞭な点があれば質問をお願いします。
74
74
 
75
-
76
-
77
- ###補足情報(言語/FW/ツール等のバージョンなど
78
-
79
- python
75
+ ```python
76
+
77
+ # -*- coding: utf-8 -*-
78
+
79
+ import math
80
+
81
+ import itertools
82
+
83
+ import queue
84
+
85
+ import numpy as np
86
+
87
+ import csv
88
+
89
+
90
+
91
+ def compute_travel_time_between2shops(shop1, shop2):
92
+
93
+ start_node = ""
94
+
95
+ goal_node = ""
96
+
97
+ shop1_node_distance = 0
98
+
99
+ shop2_node_distance = 0
100
+
101
+
102
+
103
+ #shop1とshop2には,Nodeも許すので,条件分岐する
104
+
105
+ if isinstance(shop1, Node) and isinstance(shop2, Node):
106
+
107
+ start_node = shop1
108
+
109
+ goal_node = shop2
110
+
111
+ elif isinstance(shop1, Node):
112
+
113
+ start_node = shop1
114
+
115
+ goal_node = shop2.node
116
+
117
+ shop2_node_distance = math.sqrt((shop2.x - goal_node.x)**2 + (shop2.y - goal_node.y)**2)
118
+
119
+ elif isinstance(shop2, Node):
120
+
121
+ start_node = shop1.node
122
+
123
+ goal_node = shop2
124
+
125
+ shop1_node_distance = math.sqrt((shop1.x - start_node.x)**2 + (shop1.y - start_node.y)**2)
126
+
127
+ else:
128
+
129
+ start_node = shop1.node
130
+
131
+ goal_node = shop2.node
132
+
133
+ shop1_node_distance = math.sqrt((shop1.x - start_node.x)**2 + (shop1.y - start_node.y)**2)
134
+
135
+ shop2_node_distance = math.sqrt((shop2.x - goal_node.x)**2 + (shop2.y - goal_node.y)**2)
136
+
137
+
138
+
139
+ result_time = shop1_node_distance + shop2_node_distance
140
+
141
+
142
+
143
+ if start_node == goal_node:
144
+
145
+ return result_time
146
+
147
+
148
+
149
+ searched_nodes = []
150
+
151
+ unsearched_nodes = []
152
+
153
+
154
+
155
+ start_node = Neo_Node(start_node)
156
+
157
+ unsearched_nodes.append(start_node)
158
+
159
+
160
+
161
+ while True:
162
+
163
+ if len(unsearched_nodes) == 0:
164
+
165
+ break
166
+
167
+
168
+
169
+ #確定nodeを一つ決める
170
+
171
+ done_node = ""
172
+
173
+ temp_cost = 100000
174
+
175
+ for un_n in unsearched_nodes:
176
+
177
+ if un_n.cost < temp_cost:
178
+
179
+ done_node = un_n
180
+
181
+ temp_cost = un_n.cost
182
+
183
+
184
+
185
+ #決まったら入れ替え
186
+
187
+ searched_nodes.append(done_node)
188
+
189
+ unsearched_nodes.remove(done_node)
190
+
191
+
192
+
193
+ #done_nodeに繋がるnodeを未確定に入れる
194
+
195
+ for (edge, cost) in zip(done_node.edges_to, done_node.edges_cost):
196
+
197
+ new_edge = Neo_Node(edge)
198
+
199
+ new_edge.cost = done_node.cost + cost
200
+
201
+
202
+
203
+ #x,y が同じnodeがsearchedに入ってたら入れない
204
+
205
+ canInsert = True
206
+
207
+ for node in searched_nodes:
208
+
209
+ if node.x == edge.x and node.y == edge.y:
210
+
211
+ canInsert = False
212
+
213
+
214
+
215
+ #x,yが同じnodeがunsearchedに入ってたらcostを比較する
216
+
217
+ for node in unsearched_nodes:
218
+
219
+ if node.x == edge.x and node.y == edge.y and new_edge.cost < node.cost:
220
+
221
+ unsearched_nodes.remove(node)
222
+
223
+
224
+
225
+ if canInsert and new_edge.floor == done_node.floor:
226
+
227
+ unsearched_nodes.append(new_edge)
228
+
229
+
230
+
231
+
232
+
233
+ #goal_nodeと同じヤツを出力
234
+
235
+ for searched_node in searched_nodes:
236
+
237
+ if searched_node.x == goal_node.x and searched_node.y == goal_node.y:
238
+
239
+ result_time += searched_node.cost
240
+
241
+
242
+
243
+ return result_time * multiple_value(shop1.floor)
244
+
245
+
246
+
247
+ #ノードの階数、x座標、y座標を記録
248
+
249
+ #nosが廊下にある分岐点、elsがエレベーターノード
250
+
251
+ nos201 = Node(2,253,273)
252
+
253
+
254
+
255
+ #Shopの店名、カテゴリ、階数、x座標、y座標、リンクを持つノードを記録,本当は他にもショップの定義があります。
256
+
257
+ shop2 = Shop(2, " URBAN RESEARCH DOORS", "レディス・メンズ・キッズ・雑貨",4,263,235,nos403)
258
+
259
+
260
+
261
+ # 配列読み込み
262
+
263
+ granfront = np.load("a.npy")
264
+
265
+
266
+
267
+ user = [(shop28,1),(shop70,2),(shop71,2),(shop72,2),(shop83,2),(shop86,2),(shop99,1),(shop123,2),(shop133,2),(shop144,2)]
268
+
269
+
270
+
271
+ limit_time = 7200
272
+
273
+ tb = 180 # 1
274
+
275
+ tw = 600 # 2
276
+
277
+
278
+
279
+ for i in range(len(user)):
280
+
281
+ shop_combinations = list(itertools.combinations(user, len(user)-i))
282
+
283
+ for shop_comb in shop_combinations:
284
+
285
+ shop_permutations = list(itertools.permutations(shop_comb))
286
+
287
+ result_time = 100000
288
+
289
+ result_root = []
290
+
291
+ for shop_perm in shop_permutations:
292
+
293
+ temp_time = 0
294
+
295
+ temp_shops = []
296
+
297
+ for sh, like in shop_perm:
298
+
299
+ temp_shops.append(sh)
300
+
301
+ if like == 1:
302
+
303
+ temp_time += tb
304
+
305
+ else:
306
+
307
+ temp_time += tw
308
+
309
+
310
+
311
+ temp_time += compute_travel_time_between2shops(start_node, temp_shops[0])
312
+
313
+ previous_node = temp_shops[0]
314
+
315
+ for sh in temp_shops:
316
+
317
+ if previous_node == sh:
318
+
319
+ continue
320
+
321
+
322
+
323
+ temp_time += granfront[sh.id][previous_node.id]
324
+
325
+ previous_node = sh
326
+
327
+
328
+
329
+ if temp_time < result_time:
330
+
331
+ result_time = temp_time
332
+
333
+ result_root = temp_shops
334
+
335
+
336
+
337
+ # 時間がlimit_timeより少ないなら時間と順番書き込み
338
+
339
+ if result_time <= limit_time:
340
+
341
+ print("制限時間内にいける店舗の順番と時間:" + str(result_time))
342
+
343
+ with open("user1.csv", "a") as f:
344
+
345
+ result = []
346
+
347
+ result.append(result_time)
348
+
349
+ for sh in result_root:
350
+
351
+ result.append(sh.name)
352
+
353
+
354
+
355
+ writer = csv.writer(f, lineterminator='\n')
356
+
357
+ writer.writerow(result)
358
+
359
+
360
+
361
+ ```

2

追記

2017/03/05 11:13

投稿

okazujet
okazujet

スコア11

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,16 @@
7
7
  参考URL
8
8
 
9
9
  http://blog.livedoor.jp/komq/archives/1012592617.html
10
+
11
+
12
+
13
+ 要は2地点間の移動時間がすべて計算されている上での
14
+
15
+ 遺伝的アルゴリズムを用いた巡回セールスマン問題を解ける方法を知りたいですが、
16
+
17
+ 以下長文でやりたいことを書きます。
18
+
19
+
10
20
 
11
21
 
12
22
 

1

不必要な情報の削除

2017/03/05 08:36

投稿

okazujet
okazujet

スコア11

test CHANGED
File without changes
test CHANGED
@@ -42,42 +42,28 @@
42
42
 
43
43
  1と2でその地点に滞在する時間を変えており、それぞれtb = 180,tw = 600のように設定できるようにしています。
44
44
 
45
- ・訪問する制限時間をT=7200のように設定しており、その時間内で滞在時間と移動時間を含めて
45
+ ・訪問する制限時間をT=7200のように設定しており、その時間内で滞在時間と移動時間を含めて移動パターンを作成します。
46
+
47
+ ・アンケート結果で1,2と回答しているお店のどこかに行くものとします。
48
+
49
+ 回答数が10店舗であれば10C10+10C9+10C8+・・・・+10C1だけ巡回セールスマンを解いて
50
+
51
+ かかった時間と順路を1行目からExcelファイルに吐き出せるようにしたいです。
46
52
 
47
53
 
48
54
 
55
+ 現在巡回セールスマン問題を総当たりで解いており
56
+
57
+ 10店舗であれば2分ぐらいで修了するのですが、
58
+
59
+ 20店舗になると何年もかかる計算になっており困っています。
60
+
61
+ ご協力お願いします。
62
+
63
+ 不明瞭な点があれば質問をお願いします。
49
64
 
50
65
 
51
66
 
67
+ ###補足情報(言語/FW/ツール等のバージョンなど
52
68
 
53
- ###発生している問題・エラーメッセージ
54
-
55
-
56
-
57
- ```
58
-
59
- エラーメッセージ
60
-
61
- ```
62
-
63
-
64
-
65
- ###該当のソースコード
66
-
67
- ```ここに言語を入力
68
-
69
- ここにご自身が実行したソースコードを書いてください
70
-
71
- ```
72
-
73
-
74
-
75
- ###試したこと
76
-
77
- 課題に対してアプローチしたことを記載してください
78
-
79
-
80
-
81
- ###補足情報(言語/FW/ツール等のバージョンなど)
82
-
83
- より詳細な情報
69
+ python