-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
320 lines (263 loc) · 32.3 KB
/
Copy pathmain.py
File metadata and controls
320 lines (263 loc) · 32.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
import math
import random
from collections import namedtuple
import csv
import os
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import time
def generate_NPE(n):
block_ids = [str(i) for i in range(1, n + 1)]
operators = ['H', 'V']
expr = []
stack_depth = 0
random.shuffle(block_ids)
last_token = None #
while block_ids or stack_depth > 1:
if block_ids and (stack_depth < 2 or random.random() < 0.7):
token = block_ids.pop()
expr.append(token)
last_token = token
stack_depth += 1
else:
possible_ops = [op for op in operators if op != last_token]
op = random.choice(possible_ops)
expr.append(op)
last_token = op
stack_depth -= 1
return expr
def RandomMove(expr, blocks_dict):
new_expr = expr.copy()
new_blocks = blocks_dict.copy()
move_type = random.randint(1,10) #choose random move 1,2,3,4
#0,5 0,2 0,2 0,1 alternately
if move_type in [1]:
# exchange of two operands
i = random.randint(0, len(expr) - 2)
if (expr[i] in ['H', 'V'] and expr[i + 1] in ['H', 'V']) or (expr[i] not in ['H', 'V'] and expr[i + 1] not in ['H', 'V']):
new_expr[i], new_expr[i + 1] = new_expr[i + 1], new_expr[i]
elif move_type in [2,3,4,5,6]:
# reverse change
start = random.randint(0, len(expr) - 3)
end = random.randint(start + 2, len(expr) - 1)
sub = new_expr[start:end]
sub.reverse()
new_expr[start:end] = sub
elif move_type in [7,8]:
#exchange e(i) -- e(i+1)
for i in range(1, len(expr) - 1):
ei = expr[i]
if ei not in ['H', 'V']:
ei_prev = expr[i - 1]
ei_next = expr[i + 1]
if ei_prev != ei_next and expr.count(ei_next) * 2 < i:
new_expr[i], new_expr[i + 1] = new_expr[i + 1], new_expr[i]
break
elif move_type in [9,10]:
#exchange width - height
operand_indices = [i for i, token in enumerate(expr) if token not in ['H', 'V']]
if operand_indices:
index = random.choice(operand_indices)
block_id = new_expr[index]
original = new_blocks[block_id]
new_blocks[block_id] = Block(id=block_id, width=original.height, height=original.width)##
return new_expr, new_blocks
def IsValid(expr):
count = 0
for i in range(len(expr)):
token = expr[i]
# consecutive H or V
if i < len(expr) - 1:
if token in ['H', 'V'] and token == expr[i + 1]:
return False
#balanced
if token in ['H', 'V']:
count -= 1
else:
count += 1
if count < 1:
return False
return True
def EvaluateArea(expr, blocks_dict):
stack = []
for token in expr:
if token not in ['H', 'V']:
b = blocks_dict[token]
stack.append((b.width, b.height))
else:
b2 = stack.pop()
b1 = stack.pop()
if token == 'H':
w = max(b1[0], b2[0])
h = b1[1] + b2[1]
else: #if V
w = b1[0] + b2[0]
h = max(b1[1], b2[1])
stack.append((w, h))
final_w, final_h = stack[0]
return final_w * final_h
def EvaluateP(d,T):
negd = d - 2*d
p = math.exp( negd / T )
return p
def Evaluate_Polish_Expression(expr, blocks_dict):
stack = []
for token in expr:
if token not in ('H', 'V'):
block = blocks_dict[token]
stack.append({
'id': token,
'width': block.width,
'height': block.height,
'x': 0,
'y': 0,
'children': []
})
else:
b2 = stack.pop()
b1 = stack.pop()
if token == 'H':
width = max(b1['width'], b2['width'])
height = b1['height'] + b2['height']
b2['y'] = b1['height']
b2['x'] = 0
b1['x'] = 0
b1['y'] = 0
elif token == 'V':
width = b1['width'] + b2['width']
height = max(b1['height'], b2['height'])
b2['x'] = b1['width']
b2['y'] = 0
b1['x'] = 0
b1['y'] = 0
parent = {
'id': f"({b1['id']}{token}{b2['id']})",
'width': width,
'height': height,
'x': 0,
'y': 0,
'children': [b1, b2]
}
stack.append(parent)
return stack[0] # root block
def draw_block(block, offset_x=0, offset_y=0, ax=None):
if ax is None:
fig, ax = plt.subplots()
x = offset_x + block['x']
y = offset_y + block['y']
w = block['width']
h = block['height']
if not block['children']: # leaf block
facecolor = block_colors[block['id']]
else:
facecolor = 'white'
ax.add_patch(plt.Rectangle((x, y), w, h,
facecolor=facecolor,
edgecolor='white',
linewidth=0.2))
for child in block.get('children', []):
draw_block(child, offset_x + block['x'], offset_y + block['y'], ax=ax)
return ax
def random_color():
colors = list(mcolors.CSS4_COLORS.values())
excluded = {'white'}
filtered_colors = [c for c in colors if c.lower() not in excluded]
return random.choice(filtered_colors)
#crowd of block
n = 10
# block structure
Block = namedtuple('Block', ['id', 'width', 'height'])
block_colors = {str(i): random_color() for i in range(1, n+1)}
#expresion
E = ['6', '5', '2', 'H', '7', '10', '4', 'H', 'V', '3', '9', '8', 'V', '1', 'H', 'V', 'H', 'V', 'H']
#['72', '25', '96', '1', 'H', 'V', '127', 'H', '76', 'H', '129', '23', 'V', '112', 'V', '45', '150', 'V', 'H', 'V', '2', '90', 'H', '140', '43', 'H', 'V', '66', '4', 'V', 'H', 'V', '46', '94', 'V', '95', '56', '33', 'V', 'H', '84', 'V', '17', 'V', 'H', 'V', '111', '124', 'H', '57', '31', 'H', 'V', '75', '53', 'V', '100', 'V', '64', 'H', 'V', '37', '136', 'H', '59', '51', 'H', '107', 'H', '49', 'V', '101', 'H', '28', 'H', 'V', '99', '91', 'V', '34', 'V', '13', '9', 'H', '18', 'H', '105', 'H', '62', 'V', '7', '6', '32', '69', 'V', 'H', '116', 'V', 'H', 'V', '117', 'V', 'H', 'V', 'H', '24', '93', 'H', '11', '60', 'V', '106', 'V', '15', '109', 'V', '71', 'H', '26', 'V', 'H', '128', '97', 'H', '30', 'V', '138', 'H', 'V', '130', '29', '65', 'H', 'V', '5', 'V', '12', 'V', 'H', 'V', 'H', '47', '16', 'H', '48', '121', 'H', '38', 'V', 'H', '110', 'H', '58', '103', 'H', '80', '126', 'H', 'V', '40', 'V', '139', '108', 'V', 'H', '118', '77', '44', '74', 'H', 'V', 'H', '52', 'V', '92', 'V', 'H', 'V', '14', '87', '115', 'V', 'H', '27', '145', '8', 'H', 'V', 'H', '148', '122', 'V', '143', '114', '147', '88', 'H', '134', '3', 'H', 'V', 'H', '102', '86', '89', '70', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', '132', '20', 'H', '10', 'H', '119', '41', 'H', 'V', '104', '146', 'H', '79', 'V', '42', 'H', '120', 'H', 'V', '61', '113', '54', 'V', 'H', 'V', '83', '141', 'V', '78', '137', '144', 'V', 'H', 'V', 'H', '73', '63', '142', 'V', 'H', '98', '67', 'V', '85', 'V', '135', 'V', '21', '22', '39', 'V', 'H', '149', 'V', '68', 'V', 'H', 'V', '81', '133', 'H', '125', '19', 'V', '50', 'V', '55', '35', 'H', 'V', '36', 'H', 'V', 'H', 'V', '131', '123', 'H', '82', 'H', 'V', 'H']
#['28', '124', '96', 'V', '45', '24', 'H', '116', '16', '132', 'V', '130', '38', '35', '150', '105', '78', '8', '27', '23', '1', '100', '122', '106', 'V', '56', '127', 'H', 'V', '67', 'H', '10', '14', '4', '144', '25', '109', '95', '134', '91', '70', '73', '62', 'H', '42', '15', '61', '147', '37', '139', '148', 'H', 'V', 'H', '72', '32', '126', '6', '40', '129', '102', 'H', '121', 'V', 'H', '39', 'V', '31', '89', 'H', 'V', '80', '101', 'V', '117', '114', 'H', 'V', '133', '9', 'V', '115', '141', '119', '17', 'H', '20', '44', '22', '138', 'V', '29', '19', '60', '83', 'H', 'V', '86', '21', 'V', 'H', '145', '68', '7', 'H', '118', '142', '49', '146', '36', '65', '76', 'V', '107', 'V', '5', '82', '87', 'V', '64', 'H', '48', '12', '140', '77', '43', '30', '93', '34', '88', '103', 'H', '52', '41', '54', 'V', 'H', '11', '66', '131', 'H', '137', '149', '81', 'V', '26', 'V', '58', '75', '108', '85', '13', 'H', 'V', '33', 'V', '128', '90', '63', '92', '98', 'H', '123', '55', 'H', '125', 'H', 'V', '2', '74', '120', '46', '112', '59', '104', 'H', '18', '50', '136', '53', '79', 'V', 'H', '47', '84', '135', 'V', 'H', 'V', '94', '69', '71', 'H', 'V', '97', '99', 'V', '51', '143', '57', 'V', '3', '110', '111', 'V', '113', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#['44', '48', 'V', '2', '111', 'V', 'H', '105', 'H', '82', '108', 'V', 'H', '102', '129', 'V', '79', '120', '43', 'V', '46', 'H', 'V', 'H', '4', 'V', '136', 'H', '109', '20', 'V', '59', 'V', 'H', 'V', '86', '50', 'V', '23', 'H', '88', '11', 'H', '72', '22', 'V', 'H', 'V', '34', 'H', '91', 'V', 'H', '97', '68', '63', 'V', '67', 'H', '132', '5', 'V', '27', 'H', '90', 'H', 'V', '137', '99', 'V', '66', '47', 'H', 'V', '42', 'H', 'V', '52', '25', 'H', '28', 'H', '37', 'H', '124', '73', 'H', 'V', '18', '56', '95', 'H', 'V', '61', '15', '149', 'H', 'V', 'H', 'V', 'H', '60', '143', '53', 'V', 'H', '70', '127', 'H', 'V', '69', '29', '83', 'H', '147', 'V', 'H', 'V', '121', '128', '39', 'V', 'H', 'V', '133', '78', 'H', 'V', '93', '135', '145', 'V', 'H', '64', '146', 'V', 'H', '24', 'H', '49', '55', 'V', '117', '140', '89', '123', 'V', 'H', 'V', 'H', '81', '116', 'V', 'H', 'V', 'H', 'V', 'H', 'V', '30', '76', 'V', '131', '119', 'V', 'H', '104', '144', 'V', '14', '31', 'V', 'H', 'V', '51', '150', 'V', '71', '40', 'V', 'H', '3', '17', '142', '7', '96', 'V', 'H', '16', 'H', 'V', 'H', '9', '85', 'H', '13', 'V', '122', 'V', '38', 'V', 'H', 'V', 'H', '134', '80', 'H', '113', 'H', '1', 'H', '100', '54', 'H', '84', 'H', '45', 'H', 'V', '114', '107', '36', 'H', 'V', 'H', '130', '35', 'V', '106', 'V', 'H', '65', '115', '138', 'H', 'V', '98', 'V', 'H', 'V', '41', '62', 'V', '87', 'H', '141', '92', '58', '94', 'V', '6', '148', 'H', 'V', 'H', 'V', 'H', '110', '8', 'H', '118', 'V', '33', '32', 'V', 'H', '10', '75', 'H', '19', 'H', 'V', 'H', 'V', '139', '12', '74', 'V', 'H', '77', '103', 'V', '125', '126', 'H', 'V', 'H', '101', '26', 'H', '21', 'V', '57', 'V', '112', 'V', 'H', 'V', 'H']
#['122', '145', '12', 'V', '35', '28', '146', 'V', '27', '10', '25', '17', 'H', '57', '62', '101', '135', 'V', '2', 'H', '13', '65', 'V', '14', '1', 'H', '113', '23', 'V', '150', 'V', 'H', '105', '15', 'H', '79', '141', '84', '16', '47', 'H', '48', '91', '130', 'H', '87', '6', '123', '92', '97', '63', '126', '75', 'H', 'V', '95', '72', '46', '82', 'H', '45', '33', '103', '88', '85', '55', '127', '34', '40', '106', 'V', 'H', 'V', 'H', '109', '140', '67', '41', '78', '133', 'V', '144', '129', '83', 'V', '69', '134', 'V', '89', '112', '96', '36', '26', 'H', 'V', '20', '29', '108', '42', '139', '71', 'V', '66', '9', '121', '136', '19', 'V', '70', '77', '119', 'V', '93', '143', '110', 'H', '37', '149', 'V', '43', '53', '148', '104', '94', '102', '50', '137', '8', 'H', 'V', '32', 'H', 'V', '107', 'H', 'V', '3', 'V', '81', 'V', '73', 'H', '64', '22', 'H', '138', '11', '114', '68', '74', '100', '51', '124', '111', 'V', 'H', '125', '80', '120', '44', '21', '61', '4', '117', '30', 'V', '31', '99', '39', '49', '54', 'H', '60', '128', '59', '98', '118', '116', 'V', '7', 'V', '142', '115', 'H', '18', 'V', 'H', '132', '76', '56', '58', 'V', '86', '5', '24', 'V', '131', 'H', '38', '90', 'V', 'H', '147', 'V', 'H', '52', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#['49', '69', 'V', '91', '37', '64', '16', '44', '67', '76', 'H', 'V', '36', '40', '26', '14', 'H', '48', 'V', '80', '28', '75', '95', '52', '62', '63', '32', '53', '20', 'H', 'V', '61', 'H', 'V', '72', '68', 'H', '15', '47', 'H', 'V', '78', '11', '3', 'V', '60', '57', 'H', '70', '42', 'V', 'H', '88', '2', 'H', 'V', '93', '58', '24', '8', '73', '46', '74', '19', '79', 'H', '97', 'H', '1', '56', 'V', '9', '94', 'V', 'H', '50', '5', '83', 'V', '6', 'V', '18', '38', 'H', 'V', '30', '92', '33', '17', '34', '35', '45', 'V', '51', '77', '12', 'H', '13', '85', 'V', '10', '90', '99', '82', 'V', 'H', '54', 'H', '21', '55', '31', '41', '98', '22', 'H', '66', 'V', '59', '4', 'H', 'V', '29', 'H', '43', '96', 'H', '84', '81', '87', '7', '27', '65', '25', 'V', 'H', '23', '39', 'V', '89', '86', 'H', '100', 'V', '71', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H']
#['25', '61', '17', '62', 'V', '57', '5', '28', '29', '8', '75', '33', 'V', '79', '40', 'V', '23', '93', '63', '77', '10', '46', 'V', 'H', 'V', '30', '99', '15', '52', '69', '100', '85', '82', '2', 'V', '48', '53', 'V', '70', '43', '42', '44', '13', '91', 'V', '54', '74', '95', '11', '31', '78', '89', 'V', '51', '56', '86', '32', 'V', 'H', 'V', '34', '37', 'V', '81', '71', 'V', '58', '67', '3', '84', '92', '27', '21', '26', '55', '68', 'H', 'V', '76', 'V', '18', '97', '19', '24', '7', 'V', '59', '96', 'V', '16', '64', 'H', 'V', '60', '4', '20', '35', '6', '83', '39', '12', '47', '80', '22', '94', '87', '14', 'H', '98', '73', 'H', 'V', '1', '50', '36', '72', 'H', '65', '90', '38', '9', 'V', 'H', '45', '41', '49', '88', '66', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H']
#['6', '5', '2', 'H', '7', '10', '4', 'H', 'V', '3', '9', '8', 'V', '1', 'H', 'V', 'H', 'V', 'H']
#['122', '145', '12', 'V', '35', '28', '146', 'V', '27', '10', '25', '17', 'H', '57', '62', '101', '135', 'V', '2', 'H', '13', '65', 'V', '14', '1', 'H', '113', '23', 'V', '150', 'V', 'H', '105', '15', 'H', '79', '141', '84', '16', '47', 'H', '48', '91', '130', 'H', '87', '6', '123', '92', '97', '63', '126', '75', 'H', 'V', '95', '72', '46', '82', 'H', '45', '33', '103', '88', '85', '55', '127', '34', '40', '106', 'V', 'H', 'V', 'H', '109', '140', '67', '41', '78', '133', 'V', '144', '129', '83', 'V', '69', '134', 'V', '89', '112', '96', '36', '26', 'H', 'V', '20', '29', '108', '42', '139', '71', 'V', '66', '9', '121', '136', '19', 'V', '70', '77', '119', 'V', '93', '143', '110', 'H', '37', '149', 'V', '43', '53', '148', '104', '94', '102', '50', '137', '8', 'H', 'V', '32', 'H', 'V', '107', 'H', 'V', '3', 'V', '81', 'V', '73', 'H', '64', '22', 'H', '138', '11', '114', '68', '74', '100', '51', '124', '111', 'V', 'H', '125', '80', '120', '44', '21', '61', '4', '117', '30', 'V', '31', '99', '39', '49', '54', 'H', '60', '128', '59', '98', '118', '116', 'V', '7', 'V', '142', '115', 'H', '18', 'V', 'H', '132', '76', '56', '58', 'V', '86', '5', '24', 'V', '131', 'H', '38', '90', 'V', 'H', '147', 'V', 'H', '52', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#['122', '145', '12', 'V', '35', '28', '146', 'V', '27', '10', '25', '17', 'H', '57', '62', '101', '135', 'V', '2', 'H', '13', '65', 'V', '14', '1', 'H', '113', '23', 'V', '150', 'V', 'H', '105', '15', 'H', '79', '141', '84', '16', '47', 'H', '48', '91', '130', 'H', '87', '6', '123', '92', '97', '63', '126', '75', 'H', 'V', '95', '72', '46', '82', 'H', '45', '33', '103', '88', '85', '55', '127', '34', '40', '106', 'V', 'H', 'V', 'H', '109', '140', '67', '41', '78', '133', 'V', '144', '129', '83', 'V', '69', '134', 'V', '89', '112', '96', '36', '26', 'H', 'V', '20', '29', '108', '42', '139', '71', 'V', '66', '9', '121', '136', '19', 'V', '70', '77', '119', 'V', '93', '143', '110', 'H', '37', '149', 'V', '43', '53', '148', '104', '94', '102', '50', '137', '8', 'H', 'V', '32', 'H', 'V', '107', 'H', 'V', '3', 'V', '81', 'V', '73', 'H', '64', '22', 'H', '138', '11', '114', '68', '74', '100', '51', '124', '111', 'V', 'H', '125', '80', '120', '44', '21', '61', '4', '117', '30', 'V', '31', '99', '39', '49', '54', 'H', '60', '128', '59', '98', '118', '116', 'V', '7', 'V', '142', '115', 'H', '18', 'V', 'H', '132', '76', '56', '58', 'V', '86', '5', '24', 'V', '131', 'H', '38', '90', 'V', 'H', '147', 'V', 'H', '52', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#['130', '81', '99', 'H', '127', '52', '134', 'V', '150', 'H', '65', '69', '124', '84', '17', 'H', '94', '21', '138', '142', '115', '126', '78', 'H', 'V', '72', 'H', '23', '107', 'V', '113', '120', '43', 'V', '100', '82', '125', 'H', '93', 'H', '33', '136', '149', '41', '83', '74', '56', '66', '63', '119', 'V', '129', '28', '90', '37', '79', '55', '42', '85', '109', '14', 'V', 'H', '1', '141', '75', '7', 'V', '16', '10', '131', 'H', '70', '67', '89', 'V', '32', '76', 'H', '31', '62', '105', '102', '114', 'V', '111', '5', '71', '112', 'V', '48', 'V', 'H', '6', 'H', '133', '61', 'H', '20', '44', '9', '50', 'H', '58', '146', 'V', '97', '103', '122', '140', '96', 'H', 'V', '49', '73', 'H', '117', 'H', '108', '8', 'V', '11', '53', '2', '92', '123', 'H', '4', '148', '132', '13', 'V', '77', '137', '36', '68', '64', '30', '27', 'V', 'H', '29', '80', '12', '143', '51', '45', '86', '135', 'H', '101', '38', 'V', '46', '59', '40', 'H', '145', 'H', '57', '106', '34', '60', '3', 'V', 'H', '128', '116', '87', '88', 'H', '98', '95', '18', 'H', 'V', '19', '104', '110', '22', '147', '139', 'V', 'H', '25', '39', '35', '15', '144', '54', '91', 'H', '47', 'V', '121', '118', '26', '24', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#['28', '124', '96', 'V', '45', '24', 'H', '116', '16', '132', 'V', '130', '38', '35', '150', '105', '78', '8', '27', '23', '1', '100', '122', '106', 'V', '56', '127', 'H', 'V', '67', 'H', '10', '14', '4', '144', '25', '109', '95', '134', '91', '70', '73', '62', 'H', '42', '15', '61', '147', '37', '139', '148', 'H', 'V', 'H', '72', '32', '126', '6', '40', '129', '102', 'H', '121', 'V', 'H', '39', 'V', '31', '89', 'H', 'V', '80', '101', 'V', '117', '114', 'H', 'V', '133', '9', 'V', '115', '141', '119', '17', 'H', '20', '44', '22', '138', 'V', '29', '19', '60', '83', 'H', 'V', '86', '21', 'V', 'H', '145', '68', '7', 'H', '118', '142', '49', '146', '36', '65', '76', 'V', '107', 'V', '5', '82', '87', 'V', '64', 'H', '48', '12', '140', '77', '43', '30', '93', '34', '88', '103', 'H', '52', '41', '54', 'V', 'H', '11', '66', '131', 'H', '137', '149', '81', 'V', '26', 'V', '58', '75', '108', '85', '13', 'H', 'V', '33', 'V', '128', '90', '63', '92', '98', 'H', '123', '55', 'H', '125', 'H', 'V', '2', '74', '120', '46', '112', '59', '104', 'H', '18', '50', '136', '53', '79', 'V', 'H', '47', '84', '135', 'V', 'H', 'V', '94', '69', '71', 'H', 'V', '97', '99', 'V', '51', '143', '57', 'V', '3', '110', '111', 'V', '113', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#['5', '17', '92', '95', '148', '52', '136', '130', '38', '57', 'H', '109', '146', '71', '60', 'V', 'H', 'V', '72', 'V', '70', 'V', '39', '64', '25', '54', 'V', '110', 'H', '46', 'H', 'V', '50', '141', '61', '108', '89', '113', '51', '3', 'H', '138', '74', 'V', '107', '44', '77', 'V', '119', '65', '21', '94', '149', 'V', 'H', '88', '1', 'H', '102', 'V', '41', '42', '22', '80', '127', '32', '124', '33', '118', '82', '116', '128', 'H', '68', '147', 'H', '85', 'V', '76', '104', '97', 'V', '34', '98', '31', '144', '90', 'V', '73', 'V', '131', 'H', '145', '12', 'V', '59', 'H', '26', '29', '40', '91', '81', 'H', '135', '125', 'V', '56', 'H', 'V', '7', '101', '6', 'H', '121', 'H', '62', '137', '10', '67', '87', '129', '93', '139', 'H', '14', 'V', 'H', '126', '123', '8', '28', '49', '86', '117', 'H', 'V', 'H', '13', '43', '16', 'V', '133', '27', '69', '79', '111', '75', '2', '134', '9', '11', 'V', '35', '63', '66', '23', '24', '53', '150', 'V', '96', '55', 'V', '132', '140', '58', 'H', 'V', '15', '99', 'V', '115', '83', '47', 'V', '120', 'V', '45', 'V', '106', 'H', '122', 'V', '20', '100', '37', 'H', '18', 'V', '4', '36', '114', 'H', '84', '30', '103', '48', '105', '142', '19', '112', 'H', '78', 'H', '143', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#['63', '148', '43', '117', '15', '124', '27', 'V', 'H', '59', 'V', 'H', '115', '46', 'V', 'H', '73', 'H', 'V', '64', '48', 'H', 'V', '86', 'V', '135', '41', '138', '146', 'V', '31', '42', '95', '44', '69', '11', 'H', 'V', 'H', 'V', '133', 'H', '74', '102', 'V', '150', 'H', '56', '136', '79', '137', '122', '132', 'H', '3', '119', '108', '88', '127', 'V', '81', 'H', '51', 'H', '5', 'H', '111', '128', '23', 'V', '71', '91', '139', '58', 'V', '70', '149', '10', '21', '68', '147', '17', '90', '52', 'V', '2', '22', 'V', 'H', '130', 'H', '66', '47', 'V', 'H', 'V', '20', '112', '118', '55', '140', '99', 'V', '96', '8', 'H', 'V', '103', '78', '62', '116', '134', '145', '26', '84', '40', '75', '105', 'H', '50', 'V', '29', '142', '143', '106', 'H', 'V', '76', '16', '65', '120', 'H', 'V', '28', '131', '45', 'V', 'H', 'V', '36', '19', '24', '4', 'H', 'V', '49', 'H', '123', '83', '14', 'V', '33', '38', 'H', 'V', '37', 'H', '93', 'H', 'V', '100', '25', '110', '30', 'H', '141', 'V', '107', '126', 'V', '60', '92', '53', '87', '114', '67', '113', '104', '94', '89', '125', 'V', '97', '85', '61', '7', '98', 'H', '35', '80', '32', '72', '129', '18', '39', 'V', '9', '77', '82', '13', 'H', '34', 'H', '1', '6', '12', '121', '144', '109', '57', 'V', 'H', '54', '101', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H']
# ['40', '28', '91', '94', '76', '20', '23', '87', '31', '16', 'V', 'H', '37', 'V', '35', 'H', 'V', '44', 'V', 'H', 'V', '39', 'V', '12', 'H', '77', '57', '89', '22', 'V', 'H', 'V', '13', '61', '46', '83', '2', 'H', 'V', 'H', 'V', '99', '68', '78', '45', 'H', '7', '26', 'H', 'V', '79', 'H', 'V', '80', '49', 'V', '30', 'V', 'H', '36', 'V', 'H', 'V', '5', 'H', '43', '85', '54', '9', '27', '6', '24', '72', 'H', '98', 'H', '69', 'H', '29', '41', '38', '93', '3', '73', '11', '65', 'V', '14', '4', 'V', 'H', '18', 'V', '47', '82', '64', 'H', 'V', 'H', '56', 'H', 'V', 'H', 'V', '33', '19', 'H', '53', 'H', '34', '92', 'H', '15', '95', 'V', '71', 'H', '59', '63', 'H', '88', 'H', '58', '70', 'V', '96', 'H', 'V', 'H', '10', '86', '50', 'V', 'H', '32', '42', '75', 'H', '8', '60', 'V', 'H', 'V', '90', '48', '67', '62', '74', '55', '100', '51', 'H', '52', '1', '84', '25', '81', '21', 'V', '66', 'V', 'H', '17', 'H', 'V', '97', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H']
#5η['28', '40', '91', '76', '94', '39', 'V', '35', 'V', 'H', '44', 'V', 'H', 'V', '37', 'H', 'V', '16', '31', '87', '23', '20', 'V', '12', 'H', '77', '89', '22', '57', 'V', '13', 'H', 'V', 'H', '79', 'H', 'V', '80', 'V', '30', 'V', '7', '26', '49', 'H', '45', '99', '68', '78', 'V', 'H', 'V', 'H', '2', 'V', '83', '46', '61', 'H', '36', 'V', 'H', 'V', '9', '55', '74', '92', 'V', '95', '15', 'H', '73', '54', '47', '43', 'H', 'V', 'H', 'V', '63', '59', '70', '88', 'H', 'V', 'H', 'V', 'H', 'V', '60', '69', '51', 'H', 'V', '38', 'V', '18', 'H', 'V', '65', 'H', '11', '71', 'H', '100', 'H', '64', 'H', '42', '82', '75', 'H', '48', '67', 'H', 'V', '8', 'H', '32', 'H', 'V', '98', '90', 'H', 'V', '93', '41', 'V', 'H', '56', 'H', 'V', 'H', '6', '72', '85', '27', '3', 'V', 'H', 'V', '10', 'H', 'V', '96', '52', '81', '84', 'V', '17', 'V', '21', 'H', '97', 'H', '25', 'H', 'V', 'H', 'V', 'H', '66', 'H', 'V', 'H', '58', '24', '5', 'H', '34', 'V', '14', '62', '33', 'H', 'V', '19', 'H', 'V', '86', 'V', 'H', '4', '50', 'V', '53', 'H', '29', 'H', '1', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H']
#['49', '69', 'V', '91', '37', '64', '16', '44', '67', '76', 'H', 'V', '36', '40', '26', '14', 'H', '48', 'V', '80', '28', '75', '95', '52', '62', '63', '32', '53', '20', 'H', 'V', '61', 'H', 'V', '72', '68', 'H', '15', '47', 'H', 'V', '78', '11', '3', 'V', '60', '57', 'H', '70', '42', 'V', 'H', '88', '2', 'H', 'V', '93', '58', '24', '8', '73', '46', '74', '19', '79', 'H', '97', 'H', '1', '56', 'V', '9', '94', 'V', 'H', '50', '5', '83', 'V', '6', 'V', '18', '38', 'H', 'V', '30', '92', '33', '17', '34', '35', '45', 'V', '51', '77', '12', 'H', '13', '85', 'V', '10', '90', '99', '82', 'V', 'H', '54', 'H', '21', '55', '31', '41', '98', '22', 'H', '66', 'V', '59', '4', 'H', 'V', '29', 'H', '43', '96', 'H', '84', '81', '87', '7', '27', '65', '25', 'V', 'H', '23', '39', 'V', '89', '86', 'H', '100', 'V', '71', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H']
#['25', '61', '17', '62', 'V', '57', '5', '28', '29', '8', '75', '33', 'V', '79', '40', 'V', '23', '93', '63', '77', '10', '46', 'V', 'H', 'V', '30', '99', '15', '52', '69', '100', '85', '82', '2', 'V', '48', '53', 'V', '70', '43', '42', '44', '13', '91', 'V', '54', '74', '95', '11', '31', '78', '89', 'V', '51', '56', '86', '32', 'V', 'H', 'V', '34', '37', 'V', '81', '71', 'V', '58', '67', '3', '84', '92', '27', '21', '26', '55', '68', 'H', 'V', '76', 'V', '18', '97', '19', '24', '7', 'V', '59', '96', 'V', '16', '64', 'H', 'V', '60', '4', '20', '35', '6', '83', '39', '12', '47', '80', '22', '94', '87', '14', 'H', '98', '73', 'H', 'V', '1', '50', '36', '72', 'H', '65', '90', '38', '9', 'V', 'H', '45', '41', '49', '88', '66', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H']
#['18', '49', '16', '87', '8', 'H', '11', '14', 'H', '69', 'V', '73', '28', '53', '48', '60', 'V', 'H', '10', '52', '27', '57', 'V', 'H', 'V', '70', '90', '92', 'V', '68', '30', 'H', '89', 'V', '36', 'H', 'V', '3', '32', '75', '62', '84', '59', '5', '81', 'H', '7', '31', '76', '4', '19', '9', '66', '29', '79', '77', '82', '40', '67', '58', '94', '63', '65', 'V', '35', '55', 'V', '46', 'V', '78', '50', '2', '42', '1', 'H', '56', '54', '98', 'V', '96', 'V', '33', 'H', 'V', '21', '44', '38', 'H', 'V', '99', '47', 'H', '74', '85', '71', '51', '64', '25', '86', 'H', 'V', '61', '72', '12', '41', '100', '22', '93', '91', '20', '37', '95', 'V', '17', 'V', 'H', '43', 'V', 'H', 'V', '24', 'V', '88', 'V', 'H', '45', 'V', '26', '80', '13', '39', '15', '34', 'H', 'V', '83', '23', 'H', 'V', 'H', 'V', 'H', '6', '97', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V', 'H', 'V']
#generate_NPE(n)
# x, y for every block
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
blocks = {}
with open(os.path.join(BASE_DIR, 'blocks.csv'), newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
block_id = int(row['id'])
blocks[str(block_id)] = Block(block_id, int(row['width']), int(row['height']))
print('First NPE and Area:\n')
print(E, '\t')
Current = E.copy()
CurrentBlocks = blocks.copy()
CurrentArea = EvaluateArea(Current, CurrentBlocks)
Best = Current.copy()
BestBlocks = CurrentBlocks.copy()
BestArea = CurrentArea
# Layout First_Floorplan
layout = Evaluate_Polish_Expression(Current, CurrentBlocks)
# Drawing
ax = draw_block(layout)
plt.title("First Floorplan")
plt.axis('equal')
plt.show()
print(BestArea)
#Temperture 10 100 150 5Ε για το καθενα
T = 100
r = 0.999
#0.999 0.995 0.991
# New T after each repeat = r*T >>> 0.999*100 = 99.9
limit =0.001
repeats = 0
rejects = 0
#MT = 1
start = time.time()
temperature_log_path = os.path.join(BASE_DIR, "temperature_log.csv")
with open(temperature_log_path, "w", newline="") as temp_file:
temp_writer = csv.writer(temp_file)
temp_writer.writerow(["repeat", "T", "CurrentArea", "BestArea"])
temp_writer.writerow([0, T, CurrentArea, BestArea])
while (T > limit) and (repeats < 15000000):
NE, NewBlocks = RandomMove(Current, CurrentBlocks)
if IsValid(NE):
area = EvaluateArea(NE, NewBlocks)
delta = area - CurrentArea
if delta < 0 or random.random() < EvaluateP(delta, T):
Current = NE
CurrentBlocks = NewBlocks
CurrentArea = area
if area < BestArea:
Best = NE.copy()
BestBlocks = NewBlocks.copy()
BestArea = area
else:
rejects += 1
T *= r
if rejects > 60:
T *= 1.125
rejects = 0
repeats += 1
temp_writer.writerow([repeats, T, CurrentArea, BestArea])
end = time.time()
print('[Final NPE] -> Area -> Repeats\n')
print(Best,'\t', BestArea,'\t', repeats)
print("Running Time:", end - start, "sec")
with open(os.path.join(BASE_DIR, "csvVersion_results.txt"), "a") as file:
file.write(f"{Best}\t{BestArea}\t{repeats}\t\n")
# Final Floorplan Layout
layout = Evaluate_Polish_Expression(Best, BestBlocks)
ax = draw_block(layout)
plt.title("Final Floorplan")
plt.axis('equal')
plt.show()