от go6aih » 17 Фев 2012, 22:00
ClearAll;
"Курсова задача №2
Задача за търговския пътник"
"ПРОБА;
n=6;
mat=N[{{0,0},{3,0},{5,1},{3,1},{6,0},{5,0},{6,8},{6,4}}]";
Горните 3 реда са за проба като махнеш "" от началото и края
и ги сложиш на долните 3 реда можеш да провериш че задачата работи правилно
горните точки са така подбрани че да показват правилността изчисленията в задачата
n = Input[n]; брой на генерираните точки(имат вида {5,0}т.е. двойка числа)
If[n < 10, n = Input[n]] проверка дали числата са повече от 10
mat = N[RandomInteger[100, {n, 2}]] генерира матрица с n числа от 0 100
x = mat[[1]]; взимам І-я елемент
NEAR = x; правя нова матрица NEAR
mat1 = mat[[2 ;;]]; от матрицата mat правя нова матрица mat1 без І-я елемент на mat
nearX = Nearest[mat1, x]; намирам най-близката до х точка от матрица mat1
x = nearX[[1]]; замествам старата х с новата точка nearX
p = EuclideanDistance[x, NEAR]; изчислявам разстоянието от новата х до старата х
pat = 0; въвеждам променлива pat за сумата на пътя
pat += p; сумата на пътя
NEAR = Append[{NEAR}, x]; допълвам матрица NEAR с новата точка х
w = Count[mat1, _Real, Infinity]; смятам броя елементи на mat1
w = w/2; смятам броя елементи на mat1
t = Position[mat1, x]; намирам позицията на х в матрица mat1
t = t[[1, 1]]; намирам позицията на х в матрица mat1
While[w > 1, Правя цикъл - Докато w > 1
{If[w >= 3, Ако w >= 3
{mat1 = Drop [mat1, {t, t}]; правя нова матрица mat1 от старата матрица mat1 без елемента х
nearX = Nearest[mat1, x]; намирам най-близката до х точка от матрица mat1
x = nearX[[1]]; замествам старата х с новата точка nearX
t = Position[mat1, x]; намирам позицията на х в матрица mat1
t = t[[1, 1]]; намирам позицията на х в матрица mat1
p = EuclideanDistance[x, NEAR[[-1]]]; изчислявам разстоянието от новата х до старата х
pat += p; сумата на пътя+разстоянието от новата х до последната х
NEAR = Append[NEAR, x]; допълвам матрица NEAR с новата точка х
w = w - 1; намалявам w с 1
}]; оттук до IF по-горе е тялото на IF-a
IF-a се изпълнява докато w>2 поради по-долните редове
При w == 2 се изпълнява долният If
If[w == 2, {Which[t == 2, x1 = mat1[[1]], t == 1, x1 = mat1[[2]]];
Which[t == 1, mat1 = mat1[[1]], t == 2, mat1 = mat1[[2]]];
като останат 2 елемента в матрица mat1 ги взимам поред по близост
p = EuclideanDistance[mat1, x]; изчислявам разстоянието от новата х(mat1) до старата х
pat += p; сумата на пътя+разстоянието от новата х до последната х
NEAR = Append[NEAR, mat1]; допълвам матрица NEAR с новата точка х
p = EuclideanDistance[mat1, x1]; изчислявам разстоянието от новата х до старата х
pat += p; сумата на пътя+разстоянието от новата х до последната х
NEAR = Append[NEAR, x1]; допълвам матрица NEAR с новата точка х
Break[]; Прекъсвам цикъла
}]}];
p = EuclideanDistance[NEAR[[-1]], NEAR[[1]]]; изчислявам разстоянието от последната х до
първата х(началото на пътя)
pat += p; сумата на пътя+разстоянието от последната х до първата х
"дължина на ЦЕЛИЯТ ПЪТ с връщане в нач.точка"
pat показвам целият път
"последователност на точките"
NEAR показвам последователността на точките
Graphics[{Arrow [NEAR], PointSize[Large], Red, Point[NEAR]},
Frame -> True] изчертавам пътя, със стрелка е последната точка
Ето го решението, ето го обяснението...Благодаря на всички за помощта...