Регистрация | Вход
import mathimport randomfrom matplotlib import pyplot as pltclass SolveTSPUsingACO: class Edge: def __init__(self, a, b, weight, initial_pheromone): self.a = a self.b = b self.weight = weight self.pheromone = initial_pheromone class Ant: def __init__(self, alpha, beta, num_nodes, edges): self.alpha = alpha self.beta = beta self.num_nodes = num_nodes self.edges = edges self.tour = None self.distance = 0.0 def _select_node(self): roulette_wheel = 0.0 unvisited_nodes = [node for node in range(self.num_nodes) if node not in self.tour] heuristic_total = 0.0 for unvisited_node in unvisited_nodes: heuristic_total += self.edges[self.tour[-1]][unvisited_node].weight for unvisited_node in unvisited_nodes: roulette_wheel += pow(self.edges[self.tour[-1]][unvisited_node].pheromone, self.alpha) * \ pow((heuristic_total / self.edges[self.tour[-1]][unvisited_node].weight), self.beta) random_value = random.uniform(0.0, roulette_wheel) wheel_position = 0.0 for unvisited_node in unvisited_nodes: wheel_position += pow(self.edges[self.tour[-1]][unvisited_node].pheromone, self.alpha) * \ pow((heuristic_total / self.edges[self.tour[-1]][unvisited_node].weight), self.beta) if wheel_position >= random_value: return unvisited_node def find_tour(self): self.tour = [random.randint(0, self.num_nodes - 1)] while len(self.tour) < self.num_nodes: self.tour.append(self._select_node()) return self.tour def get_distance(self): self.distance = 0.0 for i in range(self.num_nodes): self.distance += self.edges[self.tour[i]][self.tour[(i + 1) % self.num_nodes]].weight return self.distance def __init__(self, mode='ACS', colony_size=10, elitist_weight=1.0, min_scaling_factor=0.001, alpha=1.0, beta=3.0, rho=0.1, pheromone_deposit_weight=1.0, initial_pheromone=1.0, steps=100, nodes=None, labels=None): self.mode = mode self.colony_size = colony_size self.elitist_weight = elitist_weight self.min_scaling_factor = min_scaling_factor self.rho = rho self.pheromone_deposit_weight = pheromone_deposit_weight self.steps = steps self.num_nodes = len(nodes) self.nodes = nodes if labels is not None: self.labels = labels else: self.labels = range(1, self.num_nodes + 1) self.edges = [[None] * self.num_nodes for _ in range(self.num_nodes)] for i in range(self.num_nodes): for j in range(i + 1, self.num_nodes): self.edges[i][j] = self.edges[j][i] = self.Edge(i, j, math.sqrt( pow(self.nodes[i][0] - self.nodes[j][0], 2.0) + pow(self.nodes[i][1] - self.nodes[j][1], 2.0)), initial_pheromone) self.ants = [self.Ant(alpha, beta, self.num_nodes, self.edges) for _ in range(self.colony_size)] self.global_best_tour = None self.global_best_distance = float("inf") def _add_pheromone(self, tour, distance, weight=1.0): pheromone_to_add = self.pheromone_deposit_weight / distance for i in range(self.num_nodes): self.edges[tour[i]][tour[(i + 1) % self.num_nodes]].pheromone += weight * pheromone_to_add def _acs(self): for step in range(self.steps): for ant in self.ants: self._add_pheromone(ant.find_tour(), ant.get_distance()) if ant.distance < self.global_best_distance: self.global_best_tour = ant.tour self.global_best_distance = ant.distance for i in range(self.num_nodes): for j in range(i + 1, self.num_nodes): self.edges[i][j].pheromone *= (1.0 - self.rho) def _elitist(self): for step in range(self.steps): for ant in self.ants: self._add_pheromone(ant.find_tour(), ant.get_distance()) if ant.distance < self.global_best_distance: self.global_best_tour = ant.tour self.global_best_distance = ant.distance self._add_pheromone(self.global_best_tour, self.global_best_distance, weight=self.elitist_weight) for i in range(self.num_nodes): for j in range(i + 1, self.num_nodes): self.edges[i][j].pheromone *= (1.0 - self.rho) def _max_min(self): for step in range(self.steps): iteration_best_tour = None iteration_best_distance = float("inf") for ant in self.ants: ant.find_tour() if ant.get_distance() < iteration_best_distance: iteration_best_tour = ant.tour iteration_best_distance = ant.distance if float(step + 1) / float(self.steps) <= 0.75: self._add_pheromone(iteration_best_tour, iteration_best_distance) max_pheromone = self.pheromone_deposit_weight / iteration_best_distance else: if iteration_best_distance < self.global_best_distance: self.global_best_tour = iteration_best_tour self.global_best_distance = iteration_best_distance self._add_pheromone(self.global_best_tour, self.global_best_distance) max_pheromone = self.pheromone_deposit_weight / self.global_best_distance min_pheromone = max_pheromone * self.min_scaling_factor for i in range(self.num_nodes): for j in range(i + 1, self.num_nodes): self.edges[i][j].pheromone *= (1.0 - self.rho) if self.edges[i][j].pheromone > max_pheromone: self.edges[i][j].pheromone = max_pheromone elif self.edges[i][j].pheromone < min_pheromone: self.edges[i][j].pheromone = min_pheromone def run(self): print('Started : {0}'.format(self.mode)) if self.mode == 'ACS': self._acs() elif self.mode == 'Elitist': self._elitist() else: self._max_min() print('Ended : {0}'.format(self.mode)) print('Sequence : <- {0} ->'.format(' - '.join(str(self.labels[i]) for i in self.global_best_tour))) print('Total distance travelled to complete the tour : {0}\n'.format(round(self.global_best_distance, 2))) def plot(self, line_width=1, point_radius=math.sqrt(2.0), annotation_size=8, dpi=120, save=True, name=None): x = [self.nodes[i][0] for i in self.global_best_tour] x.append(x[0]) y = [self.nodes[i][1] for i in self.global_best_tour] y.append(y[0]) plt.plot(x, y, linewidth=line_width) plt.scatter(x, y, s=math.pi * (point_radius ** 2.0)) plt.title(self.mode) for i in self.global_best_tour: plt.annotate(self.labels[i], self.nodes[i], size=annotation_size) if save: if name is None: name = '{0}_tour.png'.format(self.mode) plt.savefig(name, dpi=dpi) plt.show() plt.gcf().clear()if __name__ == '__main__': _colony_size = 5 _steps = 50 _nodes = [(random.uniform(-400, 400), random.uniform(-400, 400)) for _ in range(0, 15)] acs = SolveTSPUsingACO(mode='ACS', colony_size=_colony_size, steps=_steps, nodes=_nodes) acs.run() acs.plot() elitist = SolveTSPUsingACO(mode='Elitist', colony_size=_colony_size, steps=_steps, nodes=_nodes) elitist.run() elitist.plot() max_min = SolveTSPUsingACO(mode='MaxMin', colony_size=_colony_size, steps=_steps, nodes=_nodes) max_min.run() max_min.plot()
# "Я" (1701 "I") personal pronoun; nominative; 2016may21 $t=501; $ear[$t] = "\x9F,0,1701"; # 2018-09-25: "Я" $psi=1701; $hlc=3; $jux=0; $pos=7; $dba=1; $num=1; $mfn=0; # 2018-09-27 $pre=0; $seq=1866; $tkb=510; $rv=501; KbLoad(); # 2019-06-03: flag-panel order $t=502; $ear[$t] = " ,0,0"; # 2018-09-25: blank space for AudRecog $t=503; $ear[$t] = "\N{U+0},0,0"; # 2017-12-06: necessary for Unicode?# ПОНИМАЮ -- 2019-06-03: #1866 ("understand"); first person singular verb $t=504; $ear[$t] = "\x8F,0,0"; # 2018-09-25: "П" $t=505; $ear[$t] = "\x8E,0,0"; # 2018-09-25: "О" $t=506; $ear[$t] = "\x8D,0,0"; # 2018-09-25: "Н" $t=507; $ear[$t] = "\x88,0,0"; # 2018-09-25: "И" $t=508; $ear[$t] = "\x8C,0,0"; # 2018-09-25: "М" $t=509; $ear[$t] = "\x80,0,1866"; # 2019-06-03: "А" $t=510; $ear[$t] = "\x9E,0,1866"; # 2019-06-03: "Ю" $psi=1866; $hlc=3; $mtx=892; $jux=0; $pos=8; $dba=1; $num=1; $mfn=0; # 2019-06-03 $pre=1701; $seq=1707; $tkb=516; $rv=504; KbLoad(); # 2018-09-25: flag-panel order $t=511; $ear[$t] = " ,0,0"; # 2018-09-25: blank space for AudRecog $t=512; $ear[$t] = "\N{U+0},0,0"; # 2018-09-25: necessary for Unicode?# ТЕБЯ (1707 "you") pronoun; familiar; acc. sing. 2016may22 $t=513; $ear[$t] = "\x92,0,0"; # 2018-09-25: "Т" $t=514; $ear[$t] = "\x85,0,0"; # 2018-09-25: "Е" $t=515; $ear[$t] = "\x81,0,0"; # 2018-09-25: "Б" $t=516; $ear[$t] = "\x9F,0,1707"; # 2018-09-25: "Я" $psi=1707; $hlc=3; $jux=0; $pos=7; $dba=4; $num=1; $mfn=0; # 2018-09-27 $pre=1866; $seq=0; $tkb=0; $rv=513; KbLoad(); # 2019-06-03: flag-panel order $t=517; $ear[$t] = " ,0,0"; # 2018-09-25: blank space for AudRecog
char* find(char* text, const char* word){ char* p = text; while (*p++) { char b = 1; char* pp = p; char* w = word; while (*w) if (*w++ != *pp++) { b = 0; break; } if (b) return p; }}
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
static void EncodeBase64(string frompath, string topath) { Byte[] bytes = File.ReadAllBytes(frompath); String file = Convert.ToBase64String(bytes); File.WriteAllText(topath, file); } public static void DecodeBase64(string frompath, string topath) { string text = File.ReadAllText(frompath); Byte[] bytes = Convert.FromBase64String(text); File.WriteAllBytes(topath, bytes); } static void Main(string[] args) { Console.WriteLine("encode - E decode - D"); int mode = 0; ConsoleKey key = Console.ReadKey().Key; if (key == ConsoleKey.E) mode = 1; if (key == ConsoleKey.D) mode = 2; Console.WriteLine("enter path"); string path = Console.ReadLine(); if(mode==1) EncodeBase64(path,path+"b64e"); if(mode==2) DecodeBase64(path,path+"b64d"); }