資源簡介
對基于動態規劃的TSP問題的求解 ,這個源碼很好的說明其中的求解過程,以及數據結構的設計問題
代碼片段和文件信息
#include
#include
#include
typedef?struct?tf*?cnode;
struct?tf{
?int?currentNode;//當前的節點
?int?set;???//當前的狀態集合用二進制表示
?int?pathLength;//當前的路徑值
?cnode?last;//記錄上一個節點以保存上一個的信息
?cnode?next;//記錄下一個節點
};
struct?tsp
{
int?count;//當前的城市的個數
cnode*?ltf;//記錄struct?tf數組
};
void?output1(int?*aint?n)
{
??int?i;
??for(i?=?0;i? ??printf(“%d??“a[i]);
??printf(“\n“);
}
void?output2(int?**aint?n)
{
int?ij;
for(i?=?0;i? {
for(j?=?0;j? {
??printf(“%d?“a[i][j]);
}
printf(“\n“);
}
}
//自定義的冪函數<用于之后的集合的表示>
int?mypow(int?xint?y)
{
return?(int)pow((double)x(double)y);
}
//判斷元素i是否在set集合中
int?inSet(int?setint?i)
{
if((set&mypow(2i-1))?>?0)
return?1;
else
return?0;
}
//將元素i插入集合set中
void?insertSet(int?&setint?i)
{
???int?p?=?mypow(2i-1);
???set?=?set|p;
}
//刪除set中的i
void?deleteSet(int?&setint?i)
{
set?=?~(mypow(2i-1))&set;
}
//讀權矩陣
int**?readWeight(int?&nchar*?filename)
{
?FILE?*fp;
?fp?=?fopen(filename“r“);
?if(fp?==?NULL)
?{
???printf(“文件%s打開時出錯\n“filename);
???exit(1);
?}
??int?ij**w;
??fscanf(fp“%d“&n);
??w?=?(int**)calloc(nsizeof(int*));
??for(i?=?0;i???{
????w[i]?=?(int*)calloc(nsizeof(int));
??}
??for(i?=?0;i???{
??for(j?=?0;j? ??{
????fscanf(fp“%d“&w[i][j]);
??}
??}
??fclose(fp);
??return?w;
}
//返回組合數C(nr)值
int?ZuHeShu(int?nint?r)
{
int?ick*a;
a?=?(int*)calloc(nsizeof(int));
for(i?=?0;i? {
a[i]?=?i+1;
}
c?=?0;
??do{
i?=?-1;
for(k?=?0;k? if(a[k]? i?=?k;
if(i?!=?-1)
{
??a[i]++;
??for(k?=?i+1;k? ???? a[k]?=?a[k-1]+1;
??????c++;
}
??}while(i?!=?-1);
??free(a);
??return?c+1;
}
//指定組合c(nr)中所有可能組合,返回其轉化后的01格式的int數組
int*?ZuHeArray(int?*a0int?nint?rint?sn)
{?
int?ick*set*a;
c?=?0;
set?=?(int*)calloc(snsizeof(int));
for(i?=?0;i? {
??set[i]?=?0;
}
????
a?=?(int*)calloc(nsizeof(int));
for(i?=?0;i? {
a[i]?=?i+1;
}
int?t;
for(i?=?0;i? {
???t?=?a[i]-1;
???insertSet(set[c]a0[t]);
}
??do{
i?=?-1;
for(k?=?0;k? if(a[k]? i?=?k;
????if(i?!=?-1)
{
?????a[i]++;
for(k?=?i+1;k? a[k]?=?a[k-1]+1;
????c++;
for(k?=?0;k? {
???t?=?a[k]-1;
???insertSet(set[c]a0[t]);
}
???}
}while(i?!=?-1);
??free(a);
??return?set;
}
//設置最后一個集合
int?setLastSet(int?n)
{
??int?iset;
??set?=?0;
??for(i?=?0;i???{
????set?=?set|mypow(2i);
??}
??return?set;
}
//獲得第row行的set中所有元素集合?,總元素的個數為n<非set集合中的元素個數>
int*?getSetNum(int?setint?rowint?n)
{
??int?ij*a;
??a?=?(int*)calloc(rowsizeof(int));
??j?=?0;
??for(i?=?1;i???{
????if(inSet(seti)?==?1)
{
a[j]?=?i;
j++;
}
if(j?==?row)
{
break;
}
??}
??return?a;
}
//將集合a轉為二進制的數
int?setNumSet(int?*aint?n)
{
?
評論
共有 條評論