Re: [問題] 想把整數存成陣列 該怎麼存?
原文恕刪。
※ 引述《flyingcop (飛揚的杯子)》之銘言:
以下是我的猜測,
在不討論任何演算法 (原 po 使用了粒子移動、模擬退火法) 與資料結構之情況下,
問題應是簡易的 tsp 問題,看碼大概是這意思
假設有 City 個城市,所有經過之城市均不可重覆走過,
一旅行員該怎麼走才能花最少的距離走遍所有城市?
目前看程式碼和該圖執行結果 http://ppt.cc/OK~(
圖看最上面的 第 x 個粒子解,那就代表旅行員可走的一種解法,
原 po 的限制條件較鬆,起點與終點可自己挑,沒有限定住。
所以程式碼裡有一行是 if((i!=ii)&& (S.Coord[ii])<(S.Coord[i]))
Coord[i] 距離上的概念是第 i 個城市到 (-∞) 之距離為何。
簡單的說原 po 使用的策略,應與 Insert Sort 想法相似,
主要是選定第 i 個城市,去 polling 1~n (不含 i) 的城市做比較,
假設第 i 個城市到 -∞ 之距離,排名是第 5 位,此時使用之變數 order=5,
便代表要第 5 個走到該城市; ex:
City A B C D E F G H I J
COORD 1 6 3 12 9 20 6 30 5 11
Order 1 4? 2 8 6 9 4? 10 3 7
↑
第六小的城市為 E
所以 原 po 想要的走法將是
A-> C -> I -> B-> G -> E -> J -> D -> F -> H ,
上面的 Order ,是原 po , int t[City] 的東西。
故以原本程式碼而言,若要依序輸出所經過城市座標的話,可以這麼做
for(i=0; i<City; ++i) {
printf("%d ", S.Coord[ t[i]-1 ]);
}
上面這段可能有點幫助。然而不用排序法的話,用 Order polling 會有個麻煩之處,
就是 B/G 以他的方法都是 4 (二個4),所以最後出來不會有 5,直接跳 6
除非那個 -∞ 的參考點設得夠好,而且保證每個城市在座標上不會同一點,
不然還是用一般排序法為佳。
推斷原本的資料結構寫得較不好,大概是長這樣:
#define City 16 // 16 個 city
typedef struct tagSA{
double Coord[City]; // 座標上,紀錄每個 City 與 (-∞) 之相對位置
/* other algorithm param value define. */
}SA;
SA S;
裡面只有紀錄座標,沒有紀錄要走的順序,
而 S 是不是該宣告成 arry (SA S[CNT])便不知。
若在問題規模不大,且記憶體可負荷之情況下,直接改 struct 較為方便,
也可避開 re-cal. 之窘境。
#define City 16 // 16 個 city
typedef struct tagSA{
double Coord[City]; // 座標上,紀錄每個 City 與 (-∞) 之相對位置
int Order[City]; // 紀錄 Travel City 順序
double Distance; // 紀錄此走法之總距離
/* other algorithm param value define. */
}SA;
其它的便不再多言。
struct 怎麼定義,絕對會影響程式碼之可讀性與維護性,
但我比較好奇的是, pso 那裡你沒這問題,為何 pso+sa 反而出現這問題?
其餘的已超過 C language 籌範,不便多述,下次建議 詳述 其需求為佳 ,
另這方面問題發到 Programming 可能較切需求。
: http://ppt.cc/OK~(
: 請問一下 我的陣列參數該怎麼設比較好?!
: 另外在問一下 設好了 怎麼把他們顯示出來??
--
No matter how gifted you are,
alone, can not change the world.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
推
11/09 22:38, , 1F
11/09 22:38, 1F
推
11/09 22:52, , 2F
11/09 22:52, 2F
推
11/10 00:50, , 3F
11/10 00:50, 3F
推
11/10 01:21, , 4F
11/10 01:21, 4F
※ 編輯: tropical72 來自: 180.177.78.41 (11/10 02:29)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):