TSP - Travelling Salesman Problem

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

TSP - Travelling Salesman Problem

Bài gửi by Admin on 31/3/2010, 23:39

Travelling Salesman Problem

http://www.lalena.com/AI/tsp/
http://www.vias.org/simulations/simusoft_travsalm.html


http://www.obitko.com/tutorials/genetic-algorithms/tsp-example.php

http://www.delphiforfun.org/Programs/traveling_salesman.htm

Viet: http://vi.wikipedia.org/wiki/B%C3%A0i_to%C3%A1n_ng%C6%B0%E1%BB%9Di_b%C3%A1n_h%C3%A0ng

Eng: http://en.wikipedia.org/wiki/Travelling_salesman_problem

TSP game: http://www.tsp.gatech.edu/games/index.html


Được sửa bởi Admin ngày 15/4/2010, 22:06; sửa lần 3.

Admin
Admin

Tổng số bài gửi : 2046
Points : 3620
Reputation : 0
Join date : 25/10/2009
Đến từ : http://casablanca.top-forum.net

Xem lý lịch thành viên http://casablanca.top-forum.net

Về Đầu Trang Go down

Re: TSP - Travelling Salesman Problem

Bài gửi by Admin on 1/4/2010, 00:01

Mot thuat toan khac, khong biet co chut quan he gi khong:
Thuật toán Dijkstra

http://07ck2.forum-2007.com/forum-f19/topic-t1650.htm

Bài gửi by ChuongTienPhat on 15/9/2009, 11:54
Ở Silde thứ 30 trong bài Tìm Kiếm môn Trí Tuệ Nhân Tạo, có nhận xét là thuật toán tìm kiếm theo chiều rộng trong bài giống với thuật toán Dijkstra, vậy thuật toán Dijkstra là gì? Mời các bạn cùng tìm hiểu.

===========================================
Thuật toán Dijkstra, mang tên của nhà khoa học máy tính người Hà Lan Edsger Dijkstra, là một thuật toán giải quyết bài toán đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng không có cạnh mang trọng số âm.
Bài toán


Cho một đồ thị có hướng G=(V,E), một hàm trọng số w: E → [0, ∞) và một đỉnh nguồn s. Cần tính toán được đường đi ngắn nhất từ đỉnh nguồn s đến mỗi đỉnh của đồ thị.
Ví dụ: Chúng ta dùng các đỉnh của đồ thị để mô hình các thành phố và
các cạnh để mô hình các đường nối giữa chúng. Khi đó trọng số các cạnh
có thể xem như độ dài của các con đường (và do đó là không âm). Chúng
ta cần vận chuyển từ thành phố s đến thành phố t. Thuật toán Dijkstra
sẽ giúp chỉ ra đường đi ngắn nhất chúng ta có thể đi.
Trọng số không âm của các cạnh của đồ thị mang tính tổng quát hơn
khoảng cách hình học giữa hai đỉnh đầu mút của chúng. Ví dụ, với 3 đỉnh
A, B, C đường đi A-B-C có thể ngắn hơn so với đường đi trực tiếp A-C.

Thuật toán


Thuật toán Dijkstra có thể mô tả như sau:
Ta quản lý một tập hợp động S. Ban đầu S={s}.
Với mỗi đỉnh v, chúng ta quản lý một nhãn d[v] là độ dài bé nhất trong các đường đi từ nguồn s đến một đỉnh u nào đó thuộc S, rồi đi theo cạnh nối u-v.
Trong các đỉnh ngoài S, chúng ta chọn đỉnh u có nhãn d[u] bé nhất, bổ sung vào tập S. Tập S được mở rộng thêm một đỉnh, khi đó chúng ta cần cập nhật lại các nhãn d cho phù hợp với định nghĩa.
Thuật toán kết thúc khi toàn bộ các đỉnh đã nằm trong tập S, hoặc
nếu chỉ cần tìm đường đi ngắn nhất đến một đỉnh đích t, thì chúng ta
dừng lại khi đỉnh t được bổ sung vào tập S.
Tính chất không âm của trọng số các cạnh liên quan chặt chẽ đến tính
đúng đắn của thuật toán. Khi chứng minh tính đúng đắn của thuật toán,
chúng ta phải dùng đến tính chất này.

Chứng minh


Ý tưởng của chứng minh như sau.
Chúng ta sẽ chỉ ra, khi một đỉnh v được bổ sung vào tập S, thì d[v] là giá trị của đường đi ngắn nhất từ nguồn s đến v.
Theo định nghĩa nhãn d, d[v] là giá trị của đường đi ngắn nhất trong các đường đi từ nguồn s, qua các đỉnh trong S, rồi theo một cạnh nối trực tiếp u-v đến v.
Giả sử tồn tại một đường đi từ s đến v có giá trị bé hơn d[v]. Như vậy trong đường đi, tồn tại đỉnh giữa s và v không thuộc S. Chọn w là đỉnh đầu tiên như vậy.
Đường đi của ta có dạng s - ... - w - ... - v. Nhưng do trọng số các
cạnh không âm nên đoạn s - ... - w có độ dài không lớn hơn hơn toàn bộ
đường đi, và do đó có giá trị bé hơn d[v]. Mặt khác, do cách chọn w của ta, nên độ dài của đoạn s - ... - w chính là d[w]. Như vậy d[w] < d[v], trái với cách chọn đỉnh v. Đây là điều mâu thuẫn. Vậy điều giả sử của ta là sai. Ta có điều phải chứng minh.

Mã giả



Phân tích


Với giải thuật đã mô tả ta dễ dàng thực hiện trực tiếp trên các đồ
thị kích thước nhỏ,để có thể mã hóa và cài đặt hệ quả cần đưa thêm các
cấu trúc dữ liệu để sử dụng trong giải thuật.

Dữ liệu



* Hàm d(u) dùng để lưu trữ độ dài đường đi ngắn nhất từ đỉnh nguồn s đến đỉnh u. Rõ ràng d(s)= 0. Ký hiệu X − (u) là tập tất cả các đỉnh có cạnh đi tới đỉnh u. Nếu với mọi đã xác định được d(v) thì:



.


* Để tính được giá trị nhỏ nhất này, như thông thường khi khởi tạo ta phải gán cho d(v)=, sau đó gặp giá trị nhỏ hơn thì thay thế lại.
* Những đỉnh đã tính được d(v)hữu hạn được cho vào một hàng đợi có ưu
tiên. Hàng đợi này luôn được bổ sung và sắp xếp lại nên một cấu trúc
hợp lý là cấu trúc đống nhị phân (heap).
* Để theo dõi trạng thái của các đỉnh trong quá trình xét, ta dùng hàm COLOR(u) xác định với mọi .
Lúc đầu các đỉnh được tô màu trắng (WHITE), khi cho vào hàng đợi nó
được tô màu xám (GRAY), khi đã tính xong khoảng cách nó được tô màu
đen(BLACK).
* Nếu cần ghi lại đường đi ta sẽ phải dùng một hàm con trỏ PRE(u) để
chỉ đỉnh đứng ngay trước đỉnh u trên đường đi ngắn nhất từ s tới u.






Procedure Dijkstra {
For each v of V do {
d(v)=M
COLOR(v)=WHITE
d(s)=0

InsertHeap(Q,s)
k=1
While Q khác rỗng do {
u=Head(Q)
Push(Q,u)
k=k-1
COLOR(u)=BLACK
For each v of Ajd(u) {
if COLOR(v)=WHITE then {
k=k+1
HeapIndex(v)=k
InsertHeap(Q,v)
COLOR(v)=GRAY
PRE(v)=u
dv=d(u)+w(u,v)
}
if (COLOR(v)=GRAY) and d(v)>d(u)+w(u,v) then{
d(v)=d(u)+w(u,v)
PRE(v)=u
UpHeap(Q,HeapIndex(v))
}
}
}


Các thủ tục InsertHeap và UpHeap xem trong thuật toán Prim (Tìm cây bao trùm nhỏ nhất)Thêm một thủ tục mô phỏng dễ hiểu hơn cho thuật toán này như sau:
Dijkstra(G, s) {
Khởi tạo tập S chỉ chứa đỉnh ban đầu s;
for (mỗi đỉnh v thuộc G) {
D[v] = C(s, v); // C(s, v)=vô cùng nếu s và v không nối với nhau
}
D[s] = 0;
while ( (V-S) != Φ ) {
Chọn đỉnh u thuộc (V-S) sao cho D[u] ngắn nhất;
S = S U {u};
for ( mỗi v thuộc (V-S) ) {
if (D[u] + C(u, v) < D[v]) {
D[v] = D[u] + C(u, v);
}
}
}


}

Ví dụ



Thời gian chạy


Thuật toán Dijkstra bình thường sẽ có độ phức tạp là O( n^2+m ). Tuy
nhiên ta có thể sử dụng kết hợp với cấu trúc heap, khi đó độ phức tạp
sẽ là O( (n+m)*log2(n) ).

Admin
Admin

Tổng số bài gửi : 2046
Points : 3620
Reputation : 0
Join date : 25/10/2009
Đến từ : http://casablanca.top-forum.net

Xem lý lịch thành viên http://casablanca.top-forum.net

Về Đầu Trang Go down

Re: TSP - Travelling Salesman Problem

Bài gửi by Admin on 15/4/2010, 22:24

TSP with Python

http://scripts.top4download.com/linear-equations-solver-/download-nezrv.html

http://www.velocityreviews.com/forums/t329418-travelling-salesman-variation-in-python.html

http://www.vclcomponents.com/s/0__/traveling__salesman_problem__python

Admin
Admin

Tổng số bài gửi : 2046
Points : 3620
Reputation : 0
Join date : 25/10/2009
Đến từ : http://casablanca.top-forum.net

Xem lý lịch thành viên http://casablanca.top-forum.net

Về Đầu Trang Go down

Re: TSP - Travelling Salesman Problem

Bài gửi by Admin on 15/4/2010, 22:29

Recipe 365013: Linear equations solver in 3 lines (Python) by Maxim Krikun
ActiveState Code (http://code.activestate.com/recipes/365013/)

Just a little bit of hak: a linear equations solver using eval and built-in complex numbers:

>>> solve("x - 2*x + 5*x - 46*(235-24) = x + 2")
3236.0

Python, 4 lines

def solve(eq,var='x'):
eq1 = eq.replace("=","-(")+")"
c = eval(eq1,{var:1j})
return -c.real/c.imag

One could add one more line to insert '' where needed, i.e. "100x" -> "100x", add some input validation, in particular check whether the equation is actually linear and not quadratic or cubic, and finally add a GUI to solve and plot multiple linear functions using different colors and get a nice tool for use in elementary mathematical education.

See also "Manipulate simple polynomials in Python" by Rick Muller http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/362193

Admin
Admin

Tổng số bài gửi : 2046
Points : 3620
Reputation : 0
Join date : 25/10/2009
Đến từ : http://casablanca.top-forum.net

Xem lý lịch thành viên http://casablanca.top-forum.net

Về Đầu Trang Go down

Re: TSP - Travelling Salesman Problem

Bài gửi by Admin on 5/5/2010, 19:55

http://pyevolve.sourceforge.net/wordpress/?p=308


import psp2d, pspos

WHITE_COLOR = psp2d.Color(255,255,255)
CLEAR_COLOR = psp2d.Color(0,0,0,255)
RED_COLOR = psp2d.Color(255, 0, 0)

cm = []
coords = []
CITIES = 20

pspos.setclocks(333,166)
psp_scr = psp2d.Screen()
psp_font = psp2d.Font('font.png')
psp_scr.clear(CLEAR_COLOR)
psp_font.drawText(psp_scr, 0, 5, "Loading Pyevolve modules...")
psp_scr.swap()

from pyevolve import G1DList
from pyevolve import GSimpleGA
from pyevolve import GAllele
from pyevolve import Mutators
from pyevolve import Crossovers
from pyevolve import Consts

from random import shuffle as rand_shuffle, randint as rand_randint
from math import sqrt

def cartesian_matrix(coords):
""" A distance matrix """
matrix={}
for i,(x1,y1) in enumerate(coords):
for j,(x2,y2) in enumerate(coords):
dx, dy = x1-x2, y1-y2
dist=sqrt(dx*dx + dy*dy)
matrix[i,j] = dist
return matrix

def tour_length(matrix, tour):
""" Returns the total length of the tour """
total = 0
for i in range(CITIES):
j = (i+1)%CITIES
total += matrix[tour[i], tour[j]]
return total

def write_tour_to_img(coords, tour):
""" The function to plot the graph """
psp_scr.clear(CLEAR_COLOR)
for i in range(CITIES):
j = (i+1)%CITIES
city_i = tour[i]
city_j = tour[j]
x1, y1 = coords[city_i]
x2, y2 = coords[city_j]
psp_scr.drawLine(int(x1), int(y1), int(x2), int(y2), WHITE_COLOR)
psp_font.drawText(psp_scr, int(x1)+7, int(y1)-5, str(i))
psp_scr.fillRect(int(x1), int(y1), 6, 6, RED_COLOR)

psp_scr.swap()

def G1DListTSPInitializator(genome, **args):
""" The initializator for the TSP """
lst = [i for i in xrange(genome.getListSize())]
rand_shuffle(lst)
genome.genomeList = lst

def evolve_callback(ga_engine):
""" Callback called every generation by Pyevolve """
write_tour_to_img(coords, ga_engine.bestIndividual())
return False

def main_run():
global cm, coords

width, height = psp_scr.size
coords = [(rand_randint(0, width),rand_randint(0, height))
for i in xrange(CITIES)]
cm = cartesian_matrix(coords)

setOfAlleles = GAllele.GAlleles(homogeneous=True)
range_allele = GAllele.GAlleleRange(0, len(coords)-1)
setOfAlleles.add(range_allele)

genome = G1DList.G1DList(len(coords))
genome.setParams(allele=setOfAlleles)

genome.evaluator.set(lambda chromosome: tour_length(cm, chromosome))
genome.mutator.set(Mutators.G1DListMutatorSwap)
genome.crossover.set(Crossovers.G1DListCrossoverOX)
genome.initializator.set(G1DListTSPInitializator)

ga = GSimpleGA.GSimpleGA(genome)
ga.setMinimax(Consts.minimaxType["minimize"])
ga.setGenerations(300)
ga.setPopulationSize(200)
ga.setCrossoverRate(1.0)
ga.setMutationRate(0.1)
ga.stepCallback.set(evolve_callback)

ga.evolve()

if __name__ == "__main__":
main_run()

Admin
Admin

Tổng số bài gửi : 2046
Points : 3620
Reputation : 0
Join date : 25/10/2009
Đến từ : http://casablanca.top-forum.net

Xem lý lịch thành viên http://casablanca.top-forum.net

Về Đầu Trang Go down

Re: TSP - Travelling Salesman Problem

Bài gửi by Admin on 5/5/2010, 20:29

a excellent researching into GA "A fast TSP solver using a genetic algorithm" by Hiroaki Sengoku and Ikuo Yoshihara.

http://www.gcd.org/sengoku/docs/arob98.pdf

Genetic Algorithm and Traveling Salesman Problem
http://www.codeguru.com/Cpp/misc/misc/article.php/c3795

Admin
Admin

Tổng số bài gửi : 2046
Points : 3620
Reputation : 0
Join date : 25/10/2009
Đến từ : http://casablanca.top-forum.net

Xem lý lịch thành viên http://casablanca.top-forum.net

Về Đầu Trang Go down

Re: TSP - Travelling Salesman Problem

Bài gửi by Admin on 5/5/2010, 20:43

pygene - simple python genetic algorithms/programming library
pygene is a simple and easily understandable library for genetic algorithms and genetic programming in python.
Submodules

* gamete: Implements gametes, which are the result of splitting an organism's genome in two, and are used in the organism's sexual reproduction
* gene: Implements a collection of gene classes
* organism: Implements classes for entire organisms
* population: pygene/population.py - Represents a population of organisms
* prog: Implements genetic programming organisms
* xmlio: xmlio.py

http://www.freenet.org.nz/python/pygene/
Download
http://www.freenet.org.nz/python/pygene/pygene-0.2.1.tar.gz

Admin
Admin

Tổng số bài gửi : 2046
Points : 3620
Reputation : 0
Join date : 25/10/2009
Đến từ : http://casablanca.top-forum.net

Xem lý lịch thành viên http://casablanca.top-forum.net

Về Đầu Trang Go down

Re: TSP - Travelling Salesman Problem

Bài gửi by Sponsored content Today at 20:38


Sponsored content


Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết