2013年8月28日 星期三
2011年5月10日 星期二
C++怎麼輸出檔案?
ofstream outfile("output.txt"); /*宣告輸出檔名*/
outfile << "輸出內容" ; /*把"輸出內容"寫進檔裡*/
outfile << endl;
其實C++的輸出檔案很簡單,只要把所有的cout換成outfile,並且新增一個#include <fstream>
當執行之後~
就會看到桌面上多了一個output
就大功告成拉^^
outfile << "輸出內容" ; /*把"輸出內容"寫進檔裡*/
outfile << endl;
其實C++的輸出檔案很簡單,只要把所有的cout換成outfile,並且新增一個#include <fstream>
當執行之後~
就會看到桌面上多了一個output
就大功告成拉^^
最新資訊---哇奇網!!
當您走在東區、西門町的街頭或百貨公司,時常可拿到許多美容美髮產品的試用包;當您回
到家中打開電視享受電視購物帶來的便利,同時也享受到7天商品免費鑑賞期的福利;坐在電
腦桌前開始徜徉在無邊的網際網路世界時,可以看到許多商品試用專家對各商品精闢、詳細、透澈且易懂的評論及解說。許許多多商品的試用機會充斥在您生活周遭,但要擁有7天免費鑑賞期福利必須先支付商品的費用,方可把商品帶回家仔細鑑賞;而在路邊所得到的是試用品多為美容美髮相關商品;若為各式相關產品的試用,可得到此機會的門檻較高,必定為相關的專家或達人。相信大家時常透過各式電視新聞報導看過不同手法的商品置入性文案,其真實性從多方面來觀察是需要待商確的,在這樣廣告充斥的時代,哇奇網將帶給您鞏固消費權益的服務,哇奇網將提供一般消費者參與試用活動,並給予發表試用心得、各項基準評分及共同討論之平台,依試用會員的不同相信所探討的真實性一定會大大提升。
哇奇網是一個專門提供新奇、實用,以及包含台灣未販售之海外商品的“免費!”試用網路平台。
提到“試用”,大多數的人會聯想到化妝品和健康食品的試用包。
先聲明,哇奇網提供的是實際的消費電子、美容器材、家電等產品的試用喔!
不怕您不想要,只怕您不知道或沒用過!讓你先試了再說。
哇奇網不僅可以免費試用,也提供完整的商品資訊、真實的試用心得與論壇的資訊分享平台,當然也包含了購物功能,讓您想購買立即可以買到!
哇奇網不僅可以免費試用,也提供完整的商品資訊、真實的試用心得與論壇的資訊分享平台,當然也包含了購物功能,讓您想購買立即可以買到!
哇奇網邀請您來體驗“免費試用”!讓您試了再說,用過了再購買的全新消費鏈!
所有試用品都是贊助商贊助或哇奇網自掏腰包提供各式精選款項或未知產品及體驗感大的商品,希望獲得會員們試用後感受到的真誠心得與口碑,也藉由這樣免費試用服務模式好讓一般消費者和贊助商更深得了解商品的優點及缺點。
試一下試一下,讓我試用一下!!
哇奇網 (http://www.wachi.com.tw) 於民國100年5(哇)月7(奇)日正式開跑。
2011年3月31日 星期四
C語言 函式庫
C語言標準函式庫
C-1 標準輸出輸入函數
® FILE* fopen(const char* filename, const char* mode):使用 mode模式開啟參數 filename的檔案,傳回檔案串流,失敗傳回 NULL。
® FILE* f reopen(const char* filename, const char* mode, FILE* stream):關閉檔案後重新開啟檔案。
® int fflush(FILE* stream):清除緩衝區的內容,成功傳回 0,失敗傳回EOF。
® int fclose(FILE* stream):關閉檔案。
® int remove(const char* filename):刪除參數的檔案,失敗傳回非零值。
® int rename(const char* oldname, const char* newname):將檔案名稱oldname 改為 newname,失敗傳回非零值。
® FILE* tmpfile():建立"wb+"模式的暫存檔案,當結束程式後就會關閉且刪除此檔案。
® char* tmpname(char s[L_tmpnam]):指定暫存檔案的名稱為s。
® int setvbuf(FILE* stream, char* buf, int mode, size_t size):指定串流暫存區尺寸size,使用 mode參數值_IOFBF 為完整暫存區、_IOLBF 是線性暫存區或_IONBF沒有暫存區。
® void setbuf(FILE* stream, char* buf):指定串流的暫存區為參數buf。
® int fprintf(FILE* stream, const char* format, ...):將格式化字串寫入檔案串流。
® int printf(const char* format, ...):在標準輸出顯示格式化字串。
® int sprintf(char* s, const char* format, ...):將格式化字串輸出到字串s。
® int fscanf(FILE* stream, const char* format, ...):從檔案串流讀取指定格式的資料。
® int scanf(const char* format, ...):從標準輸入讀取指定格式的資料。
® int sscanf(char* s, const char* format, ...):從字串 s 讀取指定格式的資料。
® int fgetc(FILE* stream):從檔案串流讀取一個字元。
® char* fgets(char* s, int n, FILE* stream):從檔案串流讀取一個字串。
® int fputc(int c, FILE* stream):寫入一個字元到檔案。
® char* fputs(const char* s, FILE* stream):寫入一個字串到檔案。
® int getc(FILE* stream):從檔案串流讀取一個字元。
® int getchar(void):從標準輸入讀取一個字元。
® char* gets(char* s):從標準輸入讀取一個字串。
® int putc(int c, FILE* stream):寫入一個字元到檔案。
® int putchar(int c):在標準輸出顯示一個字元。
® int puts(const char* s):在標準輸出顯示一個字串。
® int ungetc(int c, FILE* stream):將一個字元放回檔案串流。
® size_t fread(void* ptr, size_t size, size_t nobj, FILE* stream):從檔案讀取指定大小的資料。
® size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* stream):將指定大小的資料寫入檔案。
® int fseek(FILE* stream, long offset, int origin):移動檔案指標到 offset位移量,其方向是 origin 參數值 SEEK_SET 的檔案開頭、SEEK_CUR 是目前位置或 SEEK_END檔尾。
® long ftell(FILE* stream):目前檔案指標的位置。
® void rewind(FILE* stream):重設檔案指標到檔頭。
® int feof(FILE* stream):是否到達檔尾。
® int ferror(FILE* stream):是否檔案串流產生錯誤。
C-2 字元檢查函數(ctype.h)
® int isalnum(int c):isalpha(c)或 isdigit(c)的字元。
® int isalpha(int c):isupper(c)或 islower(c)的字元。
® int iscntrl(int c):是否是ASCII控制字元。
® int isdigit(int c):是否是數字。
® int isgraph(int c):是否是顯示字元,不含空白字元。
® int islower(int c):是否是小寫字元。
® int isprint(int c):是否是顯示字元 0x20 (' ')到0x7E ('~')。
® int ispunct(int c):是否是顯示字元,不包含空白、字母、數字字元。
® int isspace(int c):是否是空白字元。
® int isupper(int c):是否是大寫字元。
® int isxdigit(int c):是否是十六進位字元。
® int tolower(int c):轉換成小寫字元。
® int toupper(int c):轉換成大寫字元。
C-3 字串函數
® char* strcpy(char* s, const char* ct):將字串 ct複製到字串 s。
® char* strncpy(char* s, const char* ct, size_t n):將字串 ct前 n個字元複製到字串s。
® char* strcat(char* s, const char* ct):連結字串ct 到字串s之後。
® char* strncat(char* s, const char* ct, size_t n):連結字串 ct前 n個字元到字串 s。
® int strcmp(const char* cs, const char* ct):比較字串cs和 ct。
® int strncmp(const char* cs, const char* ct, size_t n):比較字串cs和 ct的前 n個字元。
® char* strchr(const char* cs, int c):傳回字元 c第一次出現在字串 cs位置的指標。
® char* strrchr(const char* cs, int c):傳回字元 c第後一次出現在字串 cs位置的指標。
® char* strpbrk(const char* cs, const char* ct):傳回字串 ct任何字元在字串 cs第一次出現的位置指標。
® char* strstr(const char* cs, const char* ct):傳回字串 ct在字串 cs 第一次出現的位置指標。
® size_t strlen(const char* cs):傳回字串 cs的長度。
® char* strerror(int n):傳回指定錯誤代碼的說明文字內容。
® char* strtok(char* s, const char* t):以字串t 的任何字元為分隔字元,找尋字串 s中下一個 token記號。
® void* memcpy(void* s, const void* ct, size_t n):從位置 ct複製 n個字元到位置s,傳回 s。
® void* memmove(void* s, const void* ct, size_t n):從位置ct 搬移 n個字元到位置s,傳回 s。
® int memcmp(const void* cs, const void* ct, size_t n):比較位置 ct 和位置cs的前 n個字元。
® void* memchr(const void* cs, int c, size_t n):傳回cs位置開始前 n個字元第一次出現字元 c的位置指標。
® void* memset(void* s, int c, size_t n):取代 cs 位置開始前n個字元成為字元 c,傳回位置指標 s。
C-4 數學函數
® double exp(double x):自然數的指數e^x。
® double log(double x):自然對數 logx
® double log10(double x):十為底的對數 log10x。
® double pow(double x, double y):傳回參數 x為底,參數y的次方值x^y。
® double sqrt(double x):參數 x的平方根。
® double ceil(double x):傳回大於或等於參數 x的最小 double 整數。
® double floor(double x):傳回小於或等於參數x的最大double整數。
® double fabs(double x):傳回參數 x的絕對值。
® hypot(double x, double y):傳回√(x^2+y^2)公式的值
® double ldexp(double x, int n):x乘以 2 的 n次方是 x*2^n。
® double frexp(double x, int* exp):將參數x的浮點數分解成尾數和指標,x = m*2^exp,傳回 m值的尾數,將指數存入參數 exp。
® double modf(double x, double* ip):將浮點數x分解成整數和小數部分,傳回小數部分,將整數部分存入參數 ip。
® double fmod(double x, double y):如果 y為非零值,傳回浮點數 x/y的餘數。
® double sin(double x):正弦函數。
® double cos(double x):餘弦函數。
® double tan(double x):正切函數。
® double asin(double x):反正弦函數。
® double acos(double x):反餘弦函數。
® double atan(double x):反正切函數。
® double atan2(double y, double x):參數 y/x的反正切函數值。
® double sinh(double x):hyperbolic 正弦函數,sinh(x)=(e^x -e^(-x))/2。
® double cosh(double x): hyperbolic 餘弦函數, cosh(x)=(e^x+e^(-x))/2。
® double tanh(double x): hyperbolic 正切函數,tanh(x)=(e^x-e^(-x))/(e^2+e^( -x))。
C-5 日期/時間函數
® clock_t clock(void):傳回程式開始執行後所使用的 CPU 時間,以ticks為單位,除以常數CLK_TCK就是秒數。
® time_t time(time_t* tp):傳回目前的曆法時間(Calendar Time),也會指定給參數的 tp指標,如為無效時間,傳回-1。
® double difftime(time_t time2, time_t time1):傳回參數time2和 time1的時間差,即 time2-time1。
® time_t mktime(struct tm* tp):將參數*tp的當地時間改為曆法時間, 如果不能轉換傳回-1。
® char* asctime(const struct tm* tp):傳回參數 tm結構指標轉換成日期/時間格式的字串,字串最後有新行字元\n。
® char* ctime(const time_t* tp):傳回參數 time_t 指標轉換成當地日期/時間的字串,字串最後有新行字元\n。
® struct tm* gmtime(const time_t* tp):傳回將參數的 time_t指標轉換成UTC(Coordinated Universal Time)日期/時間的tm結構指標。
® struct tm* localtime(const time_t* tp):傳回將參數的 time_t 指標轉換成當地日期/時間的tm結構指標。
® size_t strftime(char* s, size_t smax, const char* fmt, const struct tm* tp):將參數 tp 的日期/時間以格式化字串 fmt 輸出到字串 s,s 最多儲存 smax個字元。
C-6 工具函數
® int abs(int n)、long labs(long n):傳回整數n的絕對值。
® double atof(const char* s):將參數字串 s轉換成浮點數,如果字串不能轉換傳回0.0。
® int atoi(const char* s):將參數字串 s轉換成整數,如果字串不能轉換傳回 0。
® long atol(const char* s):將參數字串 s 轉換成長整數,如果字串不能轉換傳回0。
® double strtod(const char* s, char** endp):函數忽略字串 s前的空白字元,將數字部分轉換成浮點數,如果尚有未轉換的部分字串,則設成參數 endp 指標。
® long strtol(const char* s, char** endp, int base):函數忽略字串s 前的空白字元,將數字部分轉換成長整數,如果尚有未轉換的部分字串,則設成參數 endp 指標。
® unsigned long strtoul(const char* s, char** endp, int base):如同 strtol函數,其傳回值是無符號長整數。
® void* calloc(size_t nobj, size_t size):傳回一塊參數 nobj陣列大小的記憶體指標,nobj元素大小為 size 初值為 0,錯誤傳回 NULL。
® void* malloc(size_t size):傳回大小 size 記憶體指標,沒有指定初值,錯誤傳回 NULL。
® void* realloc(void* p, size_t size):將指標 p 的記憶體改為size大小,不會更改原記憶體的值,多配置部分初值為0,錯誤傳回NULL。
® void free(void* p):釋放參數 p指標的記憶體空間。
® void abort():強迫程式以不正常方式結束,如同呼叫 raise(SIGABRT)函數。
® void exit(int status):程式以正常方式結束,傳回系統環境狀態值,0表示正常結束。
® int system(const char* s):將字串 s 的指令傳給環境來執行,也就是執行 MS-DOS的指令。
® char* getenv(const char* name):傳回參數 name 的環境字串,如果沒有傳回 NULL。
® void* bsearch(const void* key, const void* base, size_t n, size_t size, int (*cmp)(const void* keyval, const void* datum)):陣列基礎的二元搜尋函數,陣列是參數 base,鍵值是參數 key,n 是陣列大小,size 是每個元素的大小,最後的參數是指向函數的指標,這是比較元素大小的函數,找到傳回該元素指標,沒有找到傳回 NULL。
® void qsort(void* base, size_t n, size_t size, int (*cmp)(const void*, const void*)):陣列基礎的快速排序法函數,陣列是參數 base,n 是陣列大小,size 是每個元素的大小,最後的參數是指向函數的指標,這是比較元素大小的函數。
® int rand(void):傳回亂數的整數值,其值的範圍是 0到 RAND_MAX常數,其值為 0x7FFF。
® void srand(unsigned int seed):指定亂數的種子數,參數是無符號整數,如果沒有指定,預設的種子數為1。
C-1 標準輸出輸入函數
® FILE* fopen(const char* filename, const char* mode):使用 mode模式開啟參數 filename的檔案,傳回檔案串流,失敗傳回 NULL。
® FILE* f reopen(const char* filename, const char* mode, FILE* stream):關閉檔案後重新開啟檔案。
® int fflush(FILE* stream):清除緩衝區的內容,成功傳回 0,失敗傳回EOF。
® int fclose(FILE* stream):關閉檔案。
® int remove(const char* filename):刪除參數的檔案,失敗傳回非零值。
® int rename(const char* oldname, const char* newname):將檔案名稱oldname 改為 newname,失敗傳回非零值。
® FILE* tmpfile():建立"wb+"模式的暫存檔案,當結束程式後就會關閉且刪除此檔案。
® char* tmpname(char s[L_tmpnam]):指定暫存檔案的名稱為s。
® int setvbuf(FILE* stream, char* buf, int mode, size_t size):指定串流暫存區尺寸size,使用 mode參數值_IOFBF 為完整暫存區、_IOLBF 是線性暫存區或_IONBF沒有暫存區。
® void setbuf(FILE* stream, char* buf):指定串流的暫存區為參數buf。
® int fprintf(FILE* stream, const char* format, ...):將格式化字串寫入檔案串流。
® int printf(const char* format, ...):在標準輸出顯示格式化字串。
® int sprintf(char* s, const char* format, ...):將格式化字串輸出到字串s。
® int fscanf(FILE* stream, const char* format, ...):從檔案串流讀取指定格式的資料。
® int scanf(const char* format, ...):從標準輸入讀取指定格式的資料。
® int sscanf(char* s, const char* format, ...):從字串 s 讀取指定格式的資料。
® int fgetc(FILE* stream):從檔案串流讀取一個字元。
® char* fgets(char* s, int n, FILE* stream):從檔案串流讀取一個字串。
® int fputc(int c, FILE* stream):寫入一個字元到檔案。
® char* fputs(const char* s, FILE* stream):寫入一個字串到檔案。
® int getc(FILE* stream):從檔案串流讀取一個字元。
® int getchar(void):從標準輸入讀取一個字元。
® char* gets(char* s):從標準輸入讀取一個字串。
® int putc(int c, FILE* stream):寫入一個字元到檔案。
® int putchar(int c):在標準輸出顯示一個字元。
® int puts(const char* s):在標準輸出顯示一個字串。
® int ungetc(int c, FILE* stream):將一個字元放回檔案串流。
® size_t fread(void* ptr, size_t size, size_t nobj, FILE* stream):從檔案讀取指定大小的資料。
® size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* stream):將指定大小的資料寫入檔案。
® int fseek(FILE* stream, long offset, int origin):移動檔案指標到 offset位移量,其方向是 origin 參數值 SEEK_SET 的檔案開頭、SEEK_CUR 是目前位置或 SEEK_END檔尾。
® long ftell(FILE* stream):目前檔案指標的位置。
® void rewind(FILE* stream):重設檔案指標到檔頭。
® int feof(FILE* stream):是否到達檔尾。
® int ferror(FILE* stream):是否檔案串流產生錯誤。
C-2 字元檢查函數(ctype.h)
® int isalnum(int c):isalpha(c)或 isdigit(c)的字元。
® int isalpha(int c):isupper(c)或 islower(c)的字元。
® int iscntrl(int c):是否是ASCII控制字元。
® int isdigit(int c):是否是數字。
® int isgraph(int c):是否是顯示字元,不含空白字元。
® int islower(int c):是否是小寫字元。
® int isprint(int c):是否是顯示字元 0x20 (' ')到0x7E ('~')。
® int ispunct(int c):是否是顯示字元,不包含空白、字母、數字字元。
® int isspace(int c):是否是空白字元。
® int isupper(int c):是否是大寫字元。
® int isxdigit(int c):是否是十六進位字元。
® int tolower(int c):轉換成小寫字元。
® int toupper(int c):轉換成大寫字元。
C-3 字串函數
® char* strcpy(char* s, const char* ct):將字串 ct複製到字串 s。
® char* strncpy(char* s, const char* ct, size_t n):將字串 ct前 n個字元複製到字串s。
® char* strcat(char* s, const char* ct):連結字串ct 到字串s之後。
® char* strncat(char* s, const char* ct, size_t n):連結字串 ct前 n個字元到字串 s。
® int strcmp(const char* cs, const char* ct):比較字串cs和 ct。
® int strncmp(const char* cs, const char* ct, size_t n):比較字串cs和 ct的前 n個字元。
® char* strchr(const char* cs, int c):傳回字元 c第一次出現在字串 cs位置的指標。
® char* strrchr(const char* cs, int c):傳回字元 c第後一次出現在字串 cs位置的指標。
® char* strpbrk(const char* cs, const char* ct):傳回字串 ct任何字元在字串 cs第一次出現的位置指標。
® char* strstr(const char* cs, const char* ct):傳回字串 ct在字串 cs 第一次出現的位置指標。
® size_t strlen(const char* cs):傳回字串 cs的長度。
® char* strerror(int n):傳回指定錯誤代碼的說明文字內容。
® char* strtok(char* s, const char* t):以字串t 的任何字元為分隔字元,找尋字串 s中下一個 token記號。
® void* memcpy(void* s, const void* ct, size_t n):從位置 ct複製 n個字元到位置s,傳回 s。
® void* memmove(void* s, const void* ct, size_t n):從位置ct 搬移 n個字元到位置s,傳回 s。
® int memcmp(const void* cs, const void* ct, size_t n):比較位置 ct 和位置cs的前 n個字元。
® void* memchr(const void* cs, int c, size_t n):傳回cs位置開始前 n個字元第一次出現字元 c的位置指標。
® void* memset(void* s, int c, size_t n):取代 cs 位置開始前n個字元成為字元 c,傳回位置指標 s。
C-4 數學函數
® double exp(double x):自然數的指數e^x。
® double log(double x):自然對數 logx
® double log10(double x):十為底的對數 log10x。
® double pow(double x, double y):傳回參數 x為底,參數y的次方值x^y。
® double sqrt(double x):參數 x的平方根。
® double ceil(double x):傳回大於或等於參數 x的最小 double 整數。
® double floor(double x):傳回小於或等於參數x的最大double整數。
® double fabs(double x):傳回參數 x的絕對值。
® hypot(double x, double y):傳回√(x^2+y^2)公式的值
® double ldexp(double x, int n):x乘以 2 的 n次方是 x*2^n。
® double frexp(double x, int* exp):將參數x的浮點數分解成尾數和指標,x = m*2^exp,傳回 m值的尾數,將指數存入參數 exp。
® double modf(double x, double* ip):將浮點數x分解成整數和小數部分,傳回小數部分,將整數部分存入參數 ip。
® double fmod(double x, double y):如果 y為非零值,傳回浮點數 x/y的餘數。
® double sin(double x):正弦函數。
® double cos(double x):餘弦函數。
® double tan(double x):正切函數。
® double asin(double x):反正弦函數。
® double acos(double x):反餘弦函數。
® double atan(double x):反正切函數。
® double atan2(double y, double x):參數 y/x的反正切函數值。
® double sinh(double x):hyperbolic 正弦函數,sinh(x)=(e^x -e^(-x))/2。
® double cosh(double x): hyperbolic 餘弦函數, cosh(x)=(e^x+e^(-x))/2。
® double tanh(double x): hyperbolic 正切函數,tanh(x)=(e^x-e^(-x))/(e^2+e^( -x))。
C-5 日期/時間函數
® clock_t clock(void):傳回程式開始執行後所使用的 CPU 時間,以ticks為單位,除以常數CLK_TCK就是秒數。
® time_t time(time_t* tp):傳回目前的曆法時間(Calendar Time),也會指定給參數的 tp指標,如為無效時間,傳回-1。
® double difftime(time_t time2, time_t time1):傳回參數time2和 time1的時間差,即 time2-time1。
® time_t mktime(struct tm* tp):將參數*tp的當地時間改為曆法時間, 如果不能轉換傳回-1。
® char* asctime(const struct tm* tp):傳回參數 tm結構指標轉換成日期/時間格式的字串,字串最後有新行字元\n。
® char* ctime(const time_t* tp):傳回參數 time_t 指標轉換成當地日期/時間的字串,字串最後有新行字元\n。
® struct tm* gmtime(const time_t* tp):傳回將參數的 time_t指標轉換成UTC(Coordinated Universal Time)日期/時間的tm結構指標。
® struct tm* localtime(const time_t* tp):傳回將參數的 time_t 指標轉換成當地日期/時間的tm結構指標。
® size_t strftime(char* s, size_t smax, const char* fmt, const struct tm* tp):將參數 tp 的日期/時間以格式化字串 fmt 輸出到字串 s,s 最多儲存 smax個字元。
C-6 工具函數
® int abs(int n)、long labs(long n):傳回整數n的絕對值。
® double atof(const char* s):將參數字串 s轉換成浮點數,如果字串不能轉換傳回0.0。
® int atoi(const char* s):將參數字串 s轉換成整數,如果字串不能轉換傳回 0。
® long atol(const char* s):將參數字串 s 轉換成長整數,如果字串不能轉換傳回0。
® double strtod(const char* s, char** endp):函數忽略字串 s前的空白字元,將數字部分轉換成浮點數,如果尚有未轉換的部分字串,則設成參數 endp 指標。
® long strtol(const char* s, char** endp, int base):函數忽略字串s 前的空白字元,將數字部分轉換成長整數,如果尚有未轉換的部分字串,則設成參數 endp 指標。
® unsigned long strtoul(const char* s, char** endp, int base):如同 strtol函數,其傳回值是無符號長整數。
® void* calloc(size_t nobj, size_t size):傳回一塊參數 nobj陣列大小的記憶體指標,nobj元素大小為 size 初值為 0,錯誤傳回 NULL。
® void* malloc(size_t size):傳回大小 size 記憶體指標,沒有指定初值,錯誤傳回 NULL。
® void* realloc(void* p, size_t size):將指標 p 的記憶體改為size大小,不會更改原記憶體的值,多配置部分初值為0,錯誤傳回NULL。
® void free(void* p):釋放參數 p指標的記憶體空間。
® void abort():強迫程式以不正常方式結束,如同呼叫 raise(SIGABRT)函數。
® void exit(int status):程式以正常方式結束,傳回系統環境狀態值,0表示正常結束。
® int system(const char* s):將字串 s 的指令傳給環境來執行,也就是執行 MS-DOS的指令。
® char* getenv(const char* name):傳回參數 name 的環境字串,如果沒有傳回 NULL。
® void* bsearch(const void* key, const void* base, size_t n, size_t size, int (*cmp)(const void* keyval, const void* datum)):陣列基礎的二元搜尋函數,陣列是參數 base,鍵值是參數 key,n 是陣列大小,size 是每個元素的大小,最後的參數是指向函數的指標,這是比較元素大小的函數,找到傳回該元素指標,沒有找到傳回 NULL。
® void qsort(void* base, size_t n, size_t size, int (*cmp)(const void*, const void*)):陣列基礎的快速排序法函數,陣列是參數 base,n 是陣列大小,size 是每個元素的大小,最後的參數是指向函數的指標,這是比較元素大小的函數。
® int rand(void):傳回亂數的整數值,其值的範圍是 0到 RAND_MAX常數,其值為 0x7FFF。
® void srand(unsigned int seed):指定亂數的種子數,參數是無符號整數,如果沒有指定,預設的種子數為1。
2011年1月3日 星期一
色遇評價(影片)
話說我前幾天看了這部片之後只有三個字形容...
"好想睡"
如果你去電影院看電影一定不想遲到
但是色遇這部片就算你遲到一小時都沒關西!!!
因為他前一小時根本沒重點
前一小時根本就是在看風景阿~或者看安潔莉娜瓊俐換美美的衣服展走來走去
重點全部都可以在預告片中看完
劇情更是不合理到只有"蝦"可以形容
這部根據法國改編的電影真的讓我很disappointed
在看的時候心理不斷出現一個念頭就是
"她們兩個的錢也太好賺了吧= = (男女主角)"
重點是整部片的刺激感完全沒有表現出來
追殺距離沒有超過10公里
歹徒笨到距離不到三步用槍可以打不中?
整個逃跑劇情太老梗
如果硬是要把這部片當成是風景片和"慢動作"片的話
那我給這部片的分數是.....
60分!
喜歡看風景或服裝展的
推薦可以去看看這部片唷~
最後放上預告片讓想看的人先了解劇情唷
P.S不過安潔莉娜瓊俐在這部片真的有性感到拉~尤其那嘴唇真讓人想....: P
"好想睡"
如果你去電影院看電影一定不想遲到
但是色遇這部片就算你遲到一小時都沒關西!!!
因為他前一小時根本沒重點
前一小時根本就是在看風景阿~或者看安潔莉娜瓊俐換美美的衣服展走來走去
重點全部都可以在預告片中看完
劇情更是不合理到只有"蝦"可以形容
這部根據法國改編的電影真的讓我很disappointed
在看的時候心理不斷出現一個念頭就是
"她們兩個的錢也太好賺了吧= = (男女主角)"
重點是整部片的刺激感完全沒有表現出來
追殺距離沒有超過10公里
歹徒笨到距離不到三步用槍可以打不中?
整個逃跑劇情太老梗
如果硬是要把這部片當成是風景片和"慢動作"片的話
那我給這部片的分數是.....
60分!
喜歡看風景或服裝展的
推薦可以去看看這部片唷~
最後放上預告片讓想看的人先了解劇情唷
P.S不過安潔莉娜瓊俐在這部片真的有性感到拉~尤其那嘴唇真讓人想....: P
2010年12月20日 星期一
(雜記)新成員
話說我們家前幾天家裡新增了一個新成員呢
他叫澎澎!!
我們特別殺到嘉義去把他接上來台北
再去寵物店拼掉了三.四千塊
一切都只是為了這位新成員阿
沒錯
他就是一隻剛出生不到2個月的紅貴賓喔
活潑好動的他
一定能為我們家增加許多樂趣
他叫澎澎!!
我們特別殺到嘉義去把他接上來台北
再去寵物店拼掉了三.四千塊
一切都只是為了這位新成員阿
沒錯
他就是一隻剛出生不到2個月的紅貴賓喔
活潑好動的他
一定能為我們家增加許多樂趣
python 中文亂碼問題
這個,是非常非常小的事情,貼上來感覺實在很混,不過,還是放吧~
Python 有很多好用的編輯器,可以讓你直接看到程式的結果,不過當你是要輸出中文字串的時候,常常會給他出現 ??? 的亂碼,這時候,只要在你的 Python 檔案開頭加上一行指令,就可以輕鬆解決掉這樣的問題。
轉貼自http://atedev.wordpress.com/2008/07/23/python-é¡¯ç¤ºä¸æ/
Python 有很多好用的編輯器,可以讓你直接看到程式的結果,不過當你是要輸出中文字串的時候,常常會給他出現 ??? 的亂碼,這時候,只要在你的 Python 檔案開頭加上一行指令,就可以輕鬆解決掉這樣的問題。
#-*- coding:utf-8 -*-很混吧?好了…完畢。
#-*- coding:big5 -*- (Windows 系統)
轉貼自http://atedev.wordpress.com/2008/07/23/python-é¡¯ç¤ºä¸æ/
2010年12月14日 星期二
模擬退火法完整介紹
【摘要】模仿自然界的退火現象而得的演算法「模擬退火」,可應用到電腦輔助電路設計、影像處理、生物學、材料科學等。
自然現象
在熱力學上,退火(annealing)現象指物體逐漸降溫的物理現象,溫度愈低,物體的能量狀態會低;夠低後,液體開始冷凝與結晶,在結晶狀態時,系統的能量狀態最低。如圖一所示,大自然在緩慢降溫(亦即,退火)時,可「找到」最低能量狀態:結晶。但是,如果過程急就章,快速降溫(亦稱「淬煉」,quenching)時,會導致不是最低能態的非晶形。
似乎,大自然知道慢工出細活:緩緩降溫,使得物體分子在每一溫度時,能夠有足夠時間找到安頓位置,則逐漸地,到最後可得到最低能態,系統最安穩。
人類在找尋最適解(optimal solution)──例如系統的最低能態──時,可以學學大自然的「智慧」嗎?
關鍵人物
美國物理學家默察波利斯(N.Metropolis)和同仁在1953年發表研究複雜系統、計算其中能量分布的文章,他們使用蒙特卡羅模擬(Monte Carlo simulation)〔註一〕計算多分子系統中分子的能量分布。
美國IBM公司物理學家科克派特瑞克(S.Kirkpatrick)和同仁於1983年在《科學》(Science)上發表了一篇頗具影響力的文章:〈以模擬退火法求最適解〉(Optimization by Simulated Annealing)。
他們借用了默察波利斯等人的方法探討一種旋轉玻璃態系統(spin glass system)時,發覺其物理系統的能量和一些組合最適(combinatorial optimization)問題(以下將描述的旅行推銷員問題即是一個代表例子)的成本函數相當類似:尋求最低成本即似尋求最低能量。於是,他們發展出以默察波利方法為本的一套演算法(algorithm),可用來解決組合問題等的尋求最適解。
幾乎同時,歐洲物理學家卡尼(V.Carny)也發表了幾乎相同的發現,但兩者是各自獨立發現的;只是卡尼「運氣不佳」,當時沒什麼人注意到他的大作;或許可以說,《科學》雜誌行銷全球,「曝光度」很高,素負盛名,而卡尼卻在發行數量小的專門學術期刊(J.Opt.Theory Appl.)發表的。
科克派特瑞克等人受到默察波利斯等人用蒙特卡羅模擬的啟發而發明了「模擬退火」這個名詞,因為它和物體退火過程相類似。尋找問題的最適解(最小值)即類似尋找系統的最低能量〔註二〕。因此系統降溫時,能量也逐漸下降,而同樣意義地,問題的解也「下降」到最小值。此兩者的類似可用表一對照表明。
簡單的數學描述
在一物達熱平衡時,溫度為T,其能量狀態為E,則其概率值P(E)可表為波茲曼分布律(Boltzmann distribution):P(E)=1/Z( T ).exp(-E/kT)
其中,Z(T)為歸一化因數(normaliz-ation factor),k為波茲曼常數(Boltzmann constant),exp(-E/kT)稱為波茲曼因數(Boltzmann factor)。
由上述方程式可知,在溫度降低時波茲曼分布傾向於最低能量狀態。
默察波利斯標準
為了模擬物體熱平衡的進展,默察波利斯等人提議以蒙特卡羅法,逐漸計算系列中不同能態。從某一狀態開(降溫),隨意選一粒子施予小小隨意產生的擾動(perturbation),此前後兩能態的差是dE。如果dE<0(即為負值),表示此種擾動導致物體的較低能態,因為這是所要的方向,因此繼續由此狀態改變下去。但是如果dE≧0,則表示能態升高,不是我們所要的方向,但是,且慢,先不要放棄這個方向,暫時假設可行,但不是像負的dE能差值一樣順勢推舟放行,而是有條件的接納此行進方向,此條件接受此新狀態的概率是exp(-dE/kT)。此值可由上述的波茲曼分布律公式推導而得:將前後兩不同狀態的方程式相除,可得此前後變化的相對概率為左邊,而方程式右邊即為此值。以方程式表示即為
P=exp(-dE/kT)〔註三〕
此一接受新狀態的規則即稱為默察波利斯標準(Metropolis criterion),亦即,若磁到能態降低時,立即放行,但若能態升高,但要看看默察波利斯標準,以決定繼續此方向,或停止尋找此方向而另起爐灶,找新的方向以求得最低狀態。
我們為何要這麼自找麻煩地弄個默察波利斯標準為尋找較低能態的指導原則呢?這和一般難題的佈景(landscape)有關,它們常是起起伏伏的(「故佈疑陣」地讓你弄不清尋找方向,但「山窮水盡疑無路,柳暗花明又一村」)。
為何它有效?
一般求最小值的麻煩在於跳不出局部解(local minimum),如圖二的點(x2,y2)。
假設我們從右邊向左(向下)尋找函數的最小值(y1),每一次能量均降低,我們順利地抵達(x2,y2)點,發現無論怎麼嘗試都會以為我們已找到最小值,因為「在附近」它最低,但是其實它只是個局部最小值,實際上我們並沒有如圖二的全圖可宏觀地知道到底我們是否已找到真正最小解(global minimum)。要怎樣才會跳出那個陷阱而達到真正的最小值(y1)所在的點(x1,y1)呢?
模擬退火法提供的管道是有條件的接受較高方向的爬升,其接受的概率是exp(-dE/kT)。就因為它能「忍讓一時」才得以「顧全大局」,最後終於求得最小值。這也是為何使用此方法需要一些「嘗試錯誤」,各方向到處試試升降,若實在試不出,則表示確已抵達真正最小解。以數學證明,它漸近地(asymptotically)可找到最小值(概率為1)──這可由馬可夫鏈(Markov chain)理論解得。
模擬退火方法
將它用在求最小解上,先找個可行的初解,以某一擾動方式產生下一可能解,比較新舊「能態」(或是別的衡量函數,例如成本費用、總收入、使用的時間等),若新值較小就接受此一新解,若新值較大則接受此新解的概率是exp(-dE/kT)。通常在運算時視k為1(或結合在溫度T值內),因此概率值是exp(-dE/T)。
但是,「接受的概率是exp(-dE/T)」是如何運作的呢?首先,產生一個隨機數(randomnumber)q,q值在0與1之間。比較q和exp(-dE/T),若q<exp(-dE/T),則接受此新解;若q≧exp(-dE/T),則不接受此新解,另外再產生一可能解(另謀生路),比照上法繼續下去。
總之,接受新解較高能(或者說,向上爬)的概率依默察波利斯標準而定,它來自人模仿大自然智慧(退火以找到最低能態)時,發出的「智慧火花」。
求解的步驟
使用模擬退火方法解決最適化問題的步驟是:
(1)分析問題與退火方法的類比
(2)選擇退火的計畫(溫度遞減方式、停留在每個溫度的時間)
(3)找一個擾動、形成新能態的方法(函數)
通常從某個「高溫」開始,在系統達平衡後,逐漸降溫,平衡,降溫……直到系統沒改善(能量不再變低)。
在這兒,溫度T是個借用的「物理名詞」,和實際的物理意義無關;它可以是個自變數,或某個「系統往低下的方向」,因此它只是個「控制參數」。而所謂的能態在大部分最適化問題中可能是總成本、花費時間、總共行進距離……等,而可以「成本函數」(cost function)來表示。
有四個因素影響最適化過程(求解的速度、計算工作量、答案趨近真正最佳解的程度等):
(1)起始狀態(或稱熱狀態,hotcondition)
(2)步驟大小(或稱降溫量,temperature decrement)
(3)平衡狀態(equilibriumcondition)
(4)終結狀態(或稱冷凝狀態,frozen condition)
此四因素和待解問題均有關,因此了解問題和模擬退火的類比方式很重要,然後才方便決定此四個因素,也許需要「嘗試錯誤」幾次後才解得較有效率些。
起始條件通常是個可行的解答(feasible solution)即可,亦即在「有效解的範疇內」。對大部分的最適問題,這通常不難找到。步驟大小是指下降的幅度;改變的太大,可能跨過最低值而「錯失良機」,改變的太小則有可能太費時間(缺乏效率)。溫度下降方式常以函數表示,也許是線性、對數方程式等,也許在最初階段,步伐大些,在計算後半段起,就步伐小些、精細些。在每個溫度時通常要反覆運算多次(例如,在多維空間中,各個角度、各個方向嘗試);平衡狀態即指在跳到一個新溫度時,嘗試到什麼地步(程度)才算是已達平衡狀態,而可跳到下一新溫度。嘗試計算的次數可能是溫度的函數,而其中一個指標是成功的次數(例如,在此溫度下,已嘗試5000次,其中2000次是成功的:亦即能量降低2000次)。終結條件可能是總嘗試次數已達某個量,或嘗試成功的次數是零(一直找不到更低能態),或已達某個特定溫度,因此就不再嘗試,可以宣告此最終能態為最適化問題的答案。
以上的描述看似繁複,但實際上由電腦來做(產生隨機數、反覆執行5000次等)易如反掌折枝,有興趣的讀者請參考文末附記的兩本書。
應用例子
模擬退火方法有很多實際應用的例子。積體電路的電腦輔助設計、影像處理、類神經網路、平衡運算等,也有生物學上的應用例子。
模擬退火方法在組合問題(combinatorial problems)的求解方面,相當管用。組合問題是不同選擇的排列組合,一個有名的例子是旅行推銷員問題(traveling salesman problem, TSP):
他必需到N個地方,每個地方只經過一次,然後回到起始點。問題是找最適解(最短時間、最短行程、或最少花費……)。
這問題自1931年發表以來已引起不少迴響,它很容易描述,但不容易解答,尤其是N值大的時候(例如N=500,或5000)時更難倒眾生!它的重要性不只是在現實世界中有不少應用例子,更要緊的是它代表一類非常要緊的「組合最適化問題」(combinatorial-optimization problem),而且是資源分配、管理的例子〔註四〕。
旅行推銷員問題的計算複雜度(computational complexity)可以簡單說明如下:
走過N+1個地方的方法有N!/2種(若無方向性限制);例如,6個地方的走法就有5!/2=60種,51個地方的走法是3×1064種。若N=1001,則可能解有上千上萬種,要從其中找出「最適解」,恐怕是幾輩子也算不出來。這是組合最適化問題令人傷腦筋的原因。
如果再改一下旅行者所受的限制(例如,他必需先到第5個地方才能到第9個地方),即擴充為「一般化的(generalized)旅行推銷員問題,GTSP」,則麻煩就更大了。
適合一般求解
由於組合問題可能很不易求得最適解,而求解的方式又不少,一般的做法是在「效率」和「儘可能合理地近似」間求平衡。若尋找完全解(exact solution)可能需很多的時間、心力,甚至可能在有生之年還看不見答案,因此可用近似解,或稱近乎最適解(near optimum)。近似解法又分為:
(1)特定演算法(tailoredalgorithm)──亦即針對某一問題而裁剪的解法。
(2)一般演算法(generalalgorithm)──可解答相當多類的問題。
模擬退火方法是解組合最適化問題的一般解法;而從另一種歸類角度看,它是一種適應學習法(adaptive heuristics),因為它的演算過程包含「自我修正」的機制(mechanism),例如默察波利斯標準。它適合複雜的多維難題,不論是整數解與否均管用。
結語
自從模擬退火方法發表以來,已有不少「改進」的新方法出籠。美國橡嶺國家實驗室的波哈謝斯基(I.Bohachevsky)等人1986年即提出「一般化的模擬退火方法」(generalized simulated annealing, GSA)。另外,它也衍生了波茲曼機器(Boltzmann machine)的方法等。
它又和其他的人工智慧方法有所關聯(系列之後會談);例如,有些求解的方法結合它和遺傳演算法(genetic algorithm)的優點。它也和類神經網路有某些程度的相似。
國內中研院數學所與台大資訊所等有人從事模擬退火研究;有興趣的讀者可參考:
1.William Press等人在1989年出的書《Numerical Recipes》。
2.P.van Laarhovern和E.Aarts在1988年合寫的書《Simulated Annealing: Theory and Applications》。
註一:它大約在1945年由馮諾曼(John von Neumann)和烏蘭(S.M.Ulam)提出,以隨機數(random number)建立數學模式。有人稱模擬退火法為「蒙特卡羅法」,讀者將可從本文的描述知道原因。
註二:若是找最大值,很簡單,只要在原問題加個負號就行,亦即,把問題「顛倒看」。
註三:因為dE、kT均是正值,因此p值一定在0與1之間,符合一般概率定義。
註四:在作業研究(operations research),旅行推銷員和它的無數演變問題一直是個熱門題目。美國航空暨太空協會(AIAA)在1988年提出「人工智慧設計挑戰」難題,即是前述旅行推銷員的演變。筆者即以模擬退火方法求解,成績很好。
林基興任職於行政院科技顧問組
轉貼自:http://tw.myblog.yahoo.com/jw!2I.ae0ieQ0bJH5eWZoCQkA--/article?mid=209 朱色虫居
自然現象
在熱力學上,退火(annealing)現象指物體逐漸降溫的物理現象,溫度愈低,物體的能量狀態會低;夠低後,液體開始冷凝與結晶,在結晶狀態時,系統的能量狀態最低。如圖一所示,大自然在緩慢降溫(亦即,退火)時,可「找到」最低能量狀態:結晶。但是,如果過程急就章,快速降溫(亦稱「淬煉」,quenching)時,會導致不是最低能態的非晶形。
似乎,大自然知道慢工出細活:緩緩降溫,使得物體分子在每一溫度時,能夠有足夠時間找到安頓位置,則逐漸地,到最後可得到最低能態,系統最安穩。
人類在找尋最適解(optimal solution)──例如系統的最低能態──時,可以學學大自然的「智慧」嗎?
關鍵人物
美國物理學家默察波利斯(N.Metropolis)和同仁在1953年發表研究複雜系統、計算其中能量分布的文章,他們使用蒙特卡羅模擬(Monte Carlo simulation)〔註一〕計算多分子系統中分子的能量分布。
美國IBM公司物理學家科克派特瑞克(S.Kirkpatrick)和同仁於1983年在《科學》(Science)上發表了一篇頗具影響力的文章:〈以模擬退火法求最適解〉(Optimization by Simulated Annealing)。
他們借用了默察波利斯等人的方法探討一種旋轉玻璃態系統(spin glass system)時,發覺其物理系統的能量和一些組合最適(combinatorial optimization)問題(以下將描述的旅行推銷員問題即是一個代表例子)的成本函數相當類似:尋求最低成本即似尋求最低能量。於是,他們發展出以默察波利方法為本的一套演算法(algorithm),可用來解決組合問題等的尋求最適解。
幾乎同時,歐洲物理學家卡尼(V.Carny)也發表了幾乎相同的發現,但兩者是各自獨立發現的;只是卡尼「運氣不佳」,當時沒什麼人注意到他的大作;或許可以說,《科學》雜誌行銷全球,「曝光度」很高,素負盛名,而卡尼卻在發行數量小的專門學術期刊(J.Opt.Theory Appl.)發表的。
科克派特瑞克等人受到默察波利斯等人用蒙特卡羅模擬的啟發而發明了「模擬退火」這個名詞,因為它和物體退火過程相類似。尋找問題的最適解(最小值)即類似尋找系統的最低能量〔註二〕。因此系統降溫時,能量也逐漸下降,而同樣意義地,問題的解也「下降」到最小值。此兩者的類似可用表一對照表明。
簡單的數學描述
在一物達熱平衡時,溫度為T,其能量狀態為E,則其概率值P(E)可表為波茲曼分布律(Boltzmann distribution):P(E)=1/Z( T ).exp(-E/kT)
其中,Z(T)為歸一化因數(normaliz-ation factor),k為波茲曼常數(Boltzmann constant),exp(-E/kT)稱為波茲曼因數(Boltzmann factor)。
由上述方程式可知,在溫度降低時波茲曼分布傾向於最低能量狀態。
默察波利斯標準
為了模擬物體熱平衡的進展,默察波利斯等人提議以蒙特卡羅法,逐漸計算系列中不同能態。從某一狀態開(降溫),隨意選一粒子施予小小隨意產生的擾動(perturbation),此前後兩能態的差是dE。如果dE<0(即為負值),表示此種擾動導致物體的較低能態,因為這是所要的方向,因此繼續由此狀態改變下去。但是如果dE≧0,則表示能態升高,不是我們所要的方向,但是,且慢,先不要放棄這個方向,暫時假設可行,但不是像負的dE能差值一樣順勢推舟放行,而是有條件的接納此行進方向,此條件接受此新狀態的概率是exp(-dE/kT)。此值可由上述的波茲曼分布律公式推導而得:將前後兩不同狀態的方程式相除,可得此前後變化的相對概率為左邊,而方程式右邊即為此值。以方程式表示即為
P=exp(-dE/kT)〔註三〕
此一接受新狀態的規則即稱為默察波利斯標準(Metropolis criterion),亦即,若磁到能態降低時,立即放行,但若能態升高,但要看看默察波利斯標準,以決定繼續此方向,或停止尋找此方向而另起爐灶,找新的方向以求得最低狀態。
我們為何要這麼自找麻煩地弄個默察波利斯標準為尋找較低能態的指導原則呢?這和一般難題的佈景(landscape)有關,它們常是起起伏伏的(「故佈疑陣」地讓你弄不清尋找方向,但「山窮水盡疑無路,柳暗花明又一村」)。
為何它有效?
一般求最小值的麻煩在於跳不出局部解(local minimum),如圖二的點(x2,y2)。
假設我們從右邊向左(向下)尋找函數的最小值(y1),每一次能量均降低,我們順利地抵達(x2,y2)點,發現無論怎麼嘗試都會以為我們已找到最小值,因為「在附近」它最低,但是其實它只是個局部最小值,實際上我們並沒有如圖二的全圖可宏觀地知道到底我們是否已找到真正最小解(global minimum)。要怎樣才會跳出那個陷阱而達到真正的最小值(y1)所在的點(x1,y1)呢?
模擬退火法提供的管道是有條件的接受較高方向的爬升,其接受的概率是exp(-dE/kT)。就因為它能「忍讓一時」才得以「顧全大局」,最後終於求得最小值。這也是為何使用此方法需要一些「嘗試錯誤」,各方向到處試試升降,若實在試不出,則表示確已抵達真正最小解。以數學證明,它漸近地(asymptotically)可找到最小值(概率為1)──這可由馬可夫鏈(Markov chain)理論解得。
模擬退火方法
將它用在求最小解上,先找個可行的初解,以某一擾動方式產生下一可能解,比較新舊「能態」(或是別的衡量函數,例如成本費用、總收入、使用的時間等),若新值較小就接受此一新解,若新值較大則接受此新解的概率是exp(-dE/kT)。通常在運算時視k為1(或結合在溫度T值內),因此概率值是exp(-dE/T)。
但是,「接受的概率是exp(-dE/T)」是如何運作的呢?首先,產生一個隨機數(randomnumber)q,q值在0與1之間。比較q和exp(-dE/T),若q<exp(-dE/T),則接受此新解;若q≧exp(-dE/T),則不接受此新解,另外再產生一可能解(另謀生路),比照上法繼續下去。
總之,接受新解較高能(或者說,向上爬)的概率依默察波利斯標準而定,它來自人模仿大自然智慧(退火以找到最低能態)時,發出的「智慧火花」。
求解的步驟
使用模擬退火方法解決最適化問題的步驟是:
(1)分析問題與退火方法的類比
(2)選擇退火的計畫(溫度遞減方式、停留在每個溫度的時間)
(3)找一個擾動、形成新能態的方法(函數)
通常從某個「高溫」開始,在系統達平衡後,逐漸降溫,平衡,降溫……直到系統沒改善(能量不再變低)。
在這兒,溫度T是個借用的「物理名詞」,和實際的物理意義無關;它可以是個自變數,或某個「系統往低下的方向」,因此它只是個「控制參數」。而所謂的能態在大部分最適化問題中可能是總成本、花費時間、總共行進距離……等,而可以「成本函數」(cost function)來表示。
有四個因素影響最適化過程(求解的速度、計算工作量、答案趨近真正最佳解的程度等):
(1)起始狀態(或稱熱狀態,hotcondition)
(2)步驟大小(或稱降溫量,temperature decrement)
(3)平衡狀態(equilibriumcondition)
(4)終結狀態(或稱冷凝狀態,frozen condition)
此四因素和待解問題均有關,因此了解問題和模擬退火的類比方式很重要,然後才方便決定此四個因素,也許需要「嘗試錯誤」幾次後才解得較有效率些。
起始條件通常是個可行的解答(feasible solution)即可,亦即在「有效解的範疇內」。對大部分的最適問題,這通常不難找到。步驟大小是指下降的幅度;改變的太大,可能跨過最低值而「錯失良機」,改變的太小則有可能太費時間(缺乏效率)。溫度下降方式常以函數表示,也許是線性、對數方程式等,也許在最初階段,步伐大些,在計算後半段起,就步伐小些、精細些。在每個溫度時通常要反覆運算多次(例如,在多維空間中,各個角度、各個方向嘗試);平衡狀態即指在跳到一個新溫度時,嘗試到什麼地步(程度)才算是已達平衡狀態,而可跳到下一新溫度。嘗試計算的次數可能是溫度的函數,而其中一個指標是成功的次數(例如,在此溫度下,已嘗試5000次,其中2000次是成功的:亦即能量降低2000次)。終結條件可能是總嘗試次數已達某個量,或嘗試成功的次數是零(一直找不到更低能態),或已達某個特定溫度,因此就不再嘗試,可以宣告此最終能態為最適化問題的答案。
以上的描述看似繁複,但實際上由電腦來做(產生隨機數、反覆執行5000次等)易如反掌折枝,有興趣的讀者請參考文末附記的兩本書。
應用例子
模擬退火方法有很多實際應用的例子。積體電路的電腦輔助設計、影像處理、類神經網路、平衡運算等,也有生物學上的應用例子。
模擬退火方法在組合問題(combinatorial problems)的求解方面,相當管用。組合問題是不同選擇的排列組合,一個有名的例子是旅行推銷員問題(traveling salesman problem, TSP):
他必需到N個地方,每個地方只經過一次,然後回到起始點。問題是找最適解(最短時間、最短行程、或最少花費……)。
這問題自1931年發表以來已引起不少迴響,它很容易描述,但不容易解答,尤其是N值大的時候(例如N=500,或5000)時更難倒眾生!它的重要性不只是在現實世界中有不少應用例子,更要緊的是它代表一類非常要緊的「組合最適化問題」(combinatorial-optimization problem),而且是資源分配、管理的例子〔註四〕。
旅行推銷員問題的計算複雜度(computational complexity)可以簡單說明如下:
走過N+1個地方的方法有N!/2種(若無方向性限制);例如,6個地方的走法就有5!/2=60種,51個地方的走法是3×1064種。若N=1001,則可能解有上千上萬種,要從其中找出「最適解」,恐怕是幾輩子也算不出來。這是組合最適化問題令人傷腦筋的原因。
如果再改一下旅行者所受的限制(例如,他必需先到第5個地方才能到第9個地方),即擴充為「一般化的(generalized)旅行推銷員問題,GTSP」,則麻煩就更大了。
適合一般求解
由於組合問題可能很不易求得最適解,而求解的方式又不少,一般的做法是在「效率」和「儘可能合理地近似」間求平衡。若尋找完全解(exact solution)可能需很多的時間、心力,甚至可能在有生之年還看不見答案,因此可用近似解,或稱近乎最適解(near optimum)。近似解法又分為:
(1)特定演算法(tailoredalgorithm)──亦即針對某一問題而裁剪的解法。
(2)一般演算法(generalalgorithm)──可解答相當多類的問題。
模擬退火方法是解組合最適化問題的一般解法;而從另一種歸類角度看,它是一種適應學習法(adaptive heuristics),因為它的演算過程包含「自我修正」的機制(mechanism),例如默察波利斯標準。它適合複雜的多維難題,不論是整數解與否均管用。
結語
自從模擬退火方法發表以來,已有不少「改進」的新方法出籠。美國橡嶺國家實驗室的波哈謝斯基(I.Bohachevsky)等人1986年即提出「一般化的模擬退火方法」(generalized simulated annealing, GSA)。另外,它也衍生了波茲曼機器(Boltzmann machine)的方法等。
它又和其他的人工智慧方法有所關聯(系列之後會談);例如,有些求解的方法結合它和遺傳演算法(genetic algorithm)的優點。它也和類神經網路有某些程度的相似。
國內中研院數學所與台大資訊所等有人從事模擬退火研究;有興趣的讀者可參考:
1.William Press等人在1989年出的書《Numerical Recipes》。
2.P.van Laarhovern和E.Aarts在1988年合寫的書《Simulated Annealing: Theory and Applications》。
註一:它大約在1945年由馮諾曼(John von Neumann)和烏蘭(S.M.Ulam)提出,以隨機數(random number)建立數學模式。有人稱模擬退火法為「蒙特卡羅法」,讀者將可從本文的描述知道原因。
註二:若是找最大值,很簡單,只要在原問題加個負號就行,亦即,把問題「顛倒看」。
註三:因為dE、kT均是正值,因此p值一定在0與1之間,符合一般概率定義。
註四:在作業研究(operations research),旅行推銷員和它的無數演變問題一直是個熱門題目。美國航空暨太空協會(AIAA)在1988年提出「人工智慧設計挑戰」難題,即是前述旅行推銷員的演變。筆者即以模擬退火方法求解,成績很好。
林基興任職於行政院科技顧問組
轉貼自:http://tw.myblog.yahoo.com/jw!2I.ae0ieQ0bJH5eWZoCQkA--/article?mid=209 朱色虫居
2010年12月7日 星期二
用eclipse實做android 當client端 + java 當server端 聊天室 廣播 伺服器
實做了之後才發現,原來server端每開一次,再執行一次server端的時候就會出現error,所以必
須要先將eclipse整個關掉在開啟之後才能再執行server端,而java檔如果想要在命令字元下執
行,必須先將java檔執行javac之後變成class檔才可以在命令字元下執行。(在執行javac的前提是
要先設定好java的jdk環境變數,否則會出現"不是內部或外部命令"的字唷~)
須要先將eclipse整個關掉在開啟之後才能再執行server端,而java檔如果想要在命令字元下執
行,必須先將java檔執行javac之後變成class檔才可以在命令字元下執行。(在執行javac的前提是
要先設定好java的jdk環境變數,否則會出現"不是內部或外部命令"的字唷~)
2010年12月6日 星期一
股票個人評估(電信股該買哪支?)
以三大龍頭電信業者來說,個人非常看好遠傳,第一遠傳的s市集慢慢逐漸在起步,和android
market有一股較勁的意味(但個人還是認為s市集根本敵不過android market啦= ="),第二是遠傳宣布
在明年要引進第一批ipad,立誓要當國內平板電腦龍頭地位,挑戰年收"破百億"!!,想必遠傳已
經做好萬全的準備來對抗別家電信業者了吧,所以小弟我的分析是......買遠傳就對了啦!XD
P.S遠傳目前股價:42.95
market有一股較勁的意味(但個人還是認為s市集根本敵不過android market啦= ="),第二是遠傳宣布
在明年要引進第一批ipad,立誓要當國內平板電腦龍頭地位,挑戰年收"破百億"!!,想必遠傳已
經做好萬全的準備來對抗別家電信業者了吧,所以小弟我的分析是......買遠傳就對了啦!XD
P.S遠傳目前股價:42.95
2010年12月2日 星期四
Google Android Vs. Apple iPhone
總結
iPhone: 多媒體影音娛樂較強, 且品牌力夠, 使用者3C產品能力不需太強的一般使用者
Android: 可自定項目較多, 適合喜愛3C產品且有研究興趣者
轉貼至JerryHSU's Place blog
2010年11月30日 星期二
何謂未上市股票?風險?
未上市股票的高利潤亦伴隨著高風險,投資人如不稍加注意,即可能碰到以下問題:
1. 投資人所投資股票的公司經營不善,以致股票變成了「壁紙」。2. 投資人所投資股票公司負責人品德欠佳,印股票換鈔票,甚至惡性倒閉。3. 產業走下坡,獲利減緩下降,連帶影響股價。4. 所託非人,買當假股票。
1. 投資人所投資股票的公司經營不善,以致股票變成了「壁紙」。2. 投資人所投資股票公司負責人品德欠佳,印股票換鈔票,甚至惡性倒閉。3. 產業走下坡,獲利減緩下降,連帶影響股價。4. 所託非人,買當假股票。
基於未上市股票制度在台灣尚未有一套明文法律規定,坊間盤商素質更是參差不齊,全球統一集團提醒您,如果有意介入此市場,應慎選買家,同時,更需對所投資的產業有基本了解。(投資人為避免買到假股票,應注意所拿到的股票背面是否有鋼印。)
如何選擇具潛力的未上市股票?
由於未上市股票的資訊較不公開,因此投資人在介入之前,除應具備基本的選股知識外,更需詳加評估其產業前景及謹慎檢視其財務報表。
未上市股的基本選股知識,約有下列幾點:
2010年11月29日 星期一
模擬退火法簡介
Simulated Annealing 簡單來講是一種 optimizing brute-forcesearch 的演算法. 所謂的 brute-force
search 看名字就知是蠻幹解題. 當遇到一個沒有辦法直接找出答案的問題, 只能靠檢查每一組
可能的組合是否為答案. Optimizing 則是在各答案中(盡量)選取最佳的答案.
search 看名字就知是蠻幹解題. 當遇到一個沒有辦法直接找出答案的問題, 只能靠檢查每一組
可能的組合是否為答案. Optimizing 則是在各答案中(盡量)選取最佳的答案.
2010年11月15日 星期一
post和get的差別
html語法當中用來存取帳號和密碼的指令post和get的差別到底在哪裡?
簡單來說就是post安全,get比較不安全
差別在於post不會顯示資料在url上
ex.yahoo@php?
而get則會顯示
ex.yahoo@php?id:abcdef
用get就會顯示id:abcdef
其餘功能都一樣嚕~
簡單來說就是post安全,get比較不安全
差別在於post不會顯示資料在url上
ex.yahoo@php?
而get則會顯示
ex.yahoo@php?id:abcdef
用get就會顯示id:abcdef
其餘功能都一樣嚕~
2010年10月31日 星期日
python的反轉字串
str="abcd"
用lin(x)回傳字串長度: 'num':len(str)
將字串反轉:'num':str[::-1]
python筆記:http://sls.weco.net/blog/jeffean/30-dec-2008/12001
用lin(x)回傳字串長度: 'num':len(str)
將字串反轉:'num':str[::-1]
python筆記:http://sls.weco.net/blog/jeffean/30-dec-2008/12001
2010年10月26日 星期二
嫌手機程式很難找嗎?快來下載"手機快手程式"!(free)
滿滿的程式庫,找個東西都嫌麻煩嗎?就先畫出一張看似不錯
的圖,然後就像貼標籤一樣到處貼在你喜愛或炙手的程式上,
每當想它的時候,只要利用程式上面的手勢搜尋就可快速的找
出被貼上大大標籤的程式們了。
快來下載吧!
下載網址:http://www.appbrain.com/app/drawfile%28free%29/Andriod.DrawFile.Free
的圖,然後就像貼標籤一樣到處貼在你喜愛或炙手的程式上,
每當想它的時候,只要利用程式上面的手勢搜尋就可快速的找
出被貼上大大標籤的程式們了。
快來下載吧!
下載網址:http://www.appbrain.com/app/drawfile%28free%29/Andriod.DrawFile.Free
2010年10月11日 星期一
如何download網頁中的css和javascript檔案教學
1.首先檢視網頁的原始檔
2.找到你需要的css和javascript檔案的路徑並複製起來 (通常會放在src底下)
3.將網頁網址後面的檔案都先刪掉
針對第3點做個範例:網址譬如這樣http://tw.yahoo.com/123/456/789,把123/456/789都刪掉!!
4.最後將複製起來的路徑貼在網址底下
5.就會出現是否下載檔案的視窗
這樣就大功告成啦!!
如有問題歡迎留言給我喔 ^ ^
2.找到你需要的css和javascript檔案的路徑並複製起來 (通常會放在src底下)
3.將網頁網址後面的檔案都先刪掉
針對第3點做個範例:網址譬如這樣http://tw.yahoo.com/123/456/789,把123/456/789都刪掉!!
4.最後將複製起來的路徑貼在網址底下
5.就會出現是否下載檔案的視窗
這樣就大功告成啦!!
如有問題歡迎留言給我喔 ^ ^
Google map真的是很厲害~(新聞)
Google街景到南極 直擊頷帶企鵝大本營
Google街景在上月登陸南極(Antarctica),工程師在半月島(Half Moon Islan)上捕捉到頷帶企鵝成群聚集的畫面,非常壯觀。游標也從過去常用的「黃色小人」變成一隻可愛的小企鵝,由牠帶領網友前往想觀賞的景點。
谷歌工程師布萊恩麥克蘭登(Brian McClendon),騎著可拍攝360度街景的三輪車,前往「世界最難道達的景點」拍照。他在網誌記述,到了南極的半月島,拍到了非常難得的景象,一群頷帶企鵝聚集在島上,十分壯觀!
相較以往Google街景車總是拍到藝人花邊、奇人軼事而上報,現在多了一層教育意義,包括英國史前巨石陣、義大利龐貝古城、巴西海灘、南極風景,都一一建立實景畫面。布萊恩麥克蘭登期望,當每個網友點進地圖後,就像身歷其境,不用出門,就可以在網路上展開探險。
半月島(Half Moon Islan)的形狀就像一輪新月,它更是頷帶企鵝(Chinstrap Penguin)的大本營。頷帶企鵝在頭的左右兩側,各有黑色線條,就像帽子的綁帶一般,因此得名,牠們目前是全世界第二大宗的企鵝,總數約1千400萬隻。
如果到Google Map上搜尋Antarctica(南極),便可以找到半月島,而觀看實景的游標,也從過去常用的「黃色小人」變成一隻可愛的小企鵝,移動時,企鵝還會變成游泳姿勢,由牠帶領網友前往想去的景點,賞遍南極雪景。
谷歌工程師布萊恩麥克蘭登(Brian McClendon),騎著可拍攝360度街景的三輪車,前往「世界最難道達的景點」拍照。他在網誌記述,到了南極的半月島,拍到了非常難得的景象,一群頷帶企鵝聚集在島上,十分壯觀!
相較以往Google街景車總是拍到藝人花邊、奇人軼事而上報,現在多了一層教育意義,包括英國史前巨石陣、義大利龐貝古城、巴西海灘、南極風景,都一一建立實景畫面。布萊恩麥克蘭登期望,當每個網友點進地圖後,就像身歷其境,不用出門,就可以在網路上展開探險。
半月島(Half Moon Islan)的形狀就像一輪新月,它更是頷帶企鵝(Chinstrap Penguin)的大本營。頷帶企鵝在頭的左右兩側,各有黑色線條,就像帽子的綁帶一般,因此得名,牠們目前是全世界第二大宗的企鵝,總數約1千400萬隻。
如果到Google Map上搜尋Antarctica(南極),便可以找到半月島,而觀看實景的游標,也從過去常用的「黃色小人」變成一隻可愛的小企鵝,移動時,企鵝還會變成游泳姿勢,由牠帶領網友前往想去的景點,賞遍南極雪景。
2010年10月4日 星期一
session 和 cookie 到底有什麼差別?安全性?
Cookie
基本介紹當Server想要保存使用者的某些狀態,如登入資訊,頁面風格時,會發送Cookie給Client。Cookie通常是一份數對,有Cookie名與相對應的值,而Cookie會在使用者本地端的電腦系統裡保存。之後當使用者瀏覽同一網頁時,Cookie值便會隨著請求發送,如此Server就能根據Cookie值進行操作。舉例來說,許多購物網站均擁有購物車的功能,當使用者在已選取商品但未結帳前就關閉瀏覽器時,下次再登入時上次的購物車資訊仍會存在,讓使用者不用再重新去點選。
安全性考量
在使用Cookie時,最主要的問題在於Cookie是以明文的方式在網際網路上傳輸及在客戶端電腦儲存,因此我們建議儘量避免使用Cookie儲存敏感的資料。但別因此就捨棄Cookie不用,相對於Session來說,使用Cookie能減輕Server的負擔,所以要是當資料的內容不是很重要,像是用戶的個人設定,仍然可以使用Cookie。
Session
基本介紹Session與Cookie最主要的差異在於Session是保存在Server端,而不是Client端。但事實上在使用Session時仍需要配合Cookie使用。首先,Server會傳輸名稱為PHPSESSID的cookie給client,並且在server端建立此session id的資料夾。在之後使用者瀏覽網頁時都會夾帶這個sessionid,而server即可根據此id尋找對應的資料夾。舉例來說,當我們登入網站進行瀏覽時,即使對某一主題開新頁面,也無需再重覆進行登入,這就是因為網站會透過跟著請求發送的的session id來辨認使用者。
安全性考量
相對於Cookie,Session多用來儲存敏感性的資料,實用性較高也因此常常會成為攻擊者的目標。攻擊者會想辦法取得使用者的Session id(即PHPSESSID),有了user的id,即可冒充使用者對網站進行存取。
2010年10月2日 星期六
google協作平台基本介紹
基本介紹
「Google 協作平台」是一種線上應用程式,透過「Google 協作平台」,使用者可以很快地將各種資訊彙整一處並輕鬆共用 (包括影片、日曆、簡報、附件和文字),以便與小型團隊、整個組織或世上所有人一同檢視或編輯。主要功能:
配合小組或專案的外觀以自訂協作平台的介面。
只要按一下按鈕即可建立新的子網頁。
有網頁、通告、檔案櫃這些頁面類型可供選擇,而且有更多類型陸續推出。
集中共用資訊:將豐富的內容 (影片、「Google 文件」的文件、試算表、簡報、Picasa 相片投影播放、iGoogle 小工具) 嵌入任何網頁,並上載檔案附件。
管理權限設定,將協作平台保持為私用或依個人喜好開放他人編輯及檢視。
使用 Google 搜尋技術,搜尋「Google 協作平台」的內容。
儲存空間
刪除協作平台
[協作平台設定] -> [其他內容] -> [刪除此協作平台]
請注意,只有擁有者才可以刪除協作平台,一旦刪除後任何人都無法復原。 只有在十分把握要刪除協作平台時,才選擇此選項。
頁面設定
「Google 協作平台」是一種線上應用程式,透過「Google 協作平台」,使用者可以很快地將各種資訊彙整一處並輕鬆共用 (包括影片、日曆、簡報、附件和文字),以便與小型團隊、整個組織或世上所有人一同檢視或編輯。主要功能:
儲存空間
並未限制可以在協作平台中建立的網頁數目。 使用者最多可以在協作平台中儲存 100MB。 如果要查看自己的協作平台還剩多少儲存空間,請前往 [協作平台設定] -> [其他內容]。
如果使用 Google 應用服務,則儲存空間配額是在網域層級進行維護。 每個網域都有 10GB 的儲存空間。專業版使用者會根據所購買的使用者數目而收到較多的儲存空間。
刪除協作平台
[協作平台設定] -> [其他內容] -> [刪除此協作平台]
請注意,只有擁有者才可以刪除協作平台,一旦刪除後任何人都無法復原。 只有在十分把握要刪除協作平台時,才選擇此選項。
頁面設定
[更多動作] 下拉式選單中的 [頁面設定] 功能可讓使用者重新命名網頁,以及改變下列帳戶功能:
- 顯示子網頁的連結
- 允許附件
- 允許意見
- 在側欄的 [導覽] 中顯示 [頁面設定]
- 變更網頁網址
- 顯示網頁標題
1.系統會移除 JavaScript、iframe、樣式標記等自訂程式碼,以免讓網站入侵者有機可趁。
2.附件大小限制:目前附加檔案及上載圖片的限制為 10 MB。 每個網域的大小總限制為 10 GB。專業版和教育版網域除了初始配額,每一位使用者還可以享有額外的 500 MB。
3.協作平台尚未提供所有附件的合併檢視,所以無法看到所有上傳的附件。
4.搜尋結果中,不包含嵌入物件。
5.當更新網頁、提出意見或附加檔案時,都會送出通知給所有的訂閱者。
訂閱:
文章 (Atom)