丁豪杰, 唐 迪, 姚 琳, 顧幸生
(1. 上海立信會(huì)計(jì)金融學(xué)院 校長(zhǎng)辦公室, 上海 201209; 2. 華東理工大學(xué) 化工過(guò)程先進(jìn)控制和優(yōu)化技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室, 上海 200237; 3. 云南師范大學(xué)文理學(xué)院, 昆明 650222; 4. 上海第二工業(yè)大學(xué) 工學(xué)部, 上海 201209 )
目前較為流行的啟發(fā)式算法中,有一類基于種群的元啟發(fā)式算法,對(duì)于解決諸如生產(chǎn)調(diào)度等被證明屬于NP-complete或NP-hard問(wèn)題的實(shí)際問(wèn)題已經(jīng)取得了不俗的成果[1]。這類基于種群的元啟發(fā)式算法被稱為群智能算法[2]。
調(diào)度是使用一定的基本規(guī)則在眾多制造業(yè)和服務(wù)業(yè)中進(jìn)行決策的過(guò)程,它研究在給定的時(shí)間周期內(nèi)將稀缺(或有限)的資源分配給待執(zhí)行的任務(wù),目標(biāo)是優(yōu)化一個(gè)或多個(gè)目標(biāo)[3]。以汽車等機(jī)械加工制造企業(yè)的生產(chǎn)為例,企業(yè)的生產(chǎn)調(diào)度任務(wù)就是優(yōu)化資源分配,合理分配生產(chǎn)計(jì)劃任務(wù)[4]。當(dāng)生產(chǎn)加工和整車裝配過(guò)程中出現(xiàn)未預(yù)期事件,如生產(chǎn)設(shè)備故障、某些零部件的加工時(shí)間異常、部件原材料供應(yīng)發(fā)生問(wèn)題導(dǎo)致無(wú)法及時(shí)生產(chǎn)等問(wèn)題,都要及時(shí)予以處理,以保證企業(yè)的生產(chǎn)能正常進(jìn)行[5]。類似的調(diào)度問(wèn)題處理都可以轉(zhuǎn)化成為對(duì)隨機(jī)優(yōu)化問(wèn)題的處理。
運(yùn)用群智能算法借助計(jì)算機(jī)處理此類隨機(jī)優(yōu)化問(wèn)題時(shí),往往采用全局搜索與局部搜索相結(jié)合的方法進(jìn)行,在開(kāi)始階段以全局搜索為主,而在后續(xù)階段則以局部的鄰域搜索為主。群智能算法在搜索過(guò)程中,需要大量的隨機(jī)數(shù)對(duì)算法進(jìn)行支持,故隨機(jī)數(shù)的選取成為一個(gè)不可忽視和回避的問(wèn)題。在全局搜索階段,為不遺漏可能的解,應(yīng)盡可能使與隨機(jī)數(shù)相對(duì)應(yīng)的解充滿整個(gè)解空間,宜選用符合均勻分布的隨機(jī)數(shù);而在后續(xù)有趨勢(shì)解呈現(xiàn)時(shí),則可以選擇符合某種分布的隨機(jī)數(shù)來(lái)加速求解,后者主要靠前者與經(jīng)驗(yàn)及規(guī)則函數(shù)配合完成。由于目前啟發(fā)式算法主要借助于計(jì)算機(jī)來(lái)完成,因此,使用計(jì)算機(jī)來(lái)產(chǎn)生隨機(jī)數(shù)從而完成相應(yīng)的求解是必要的步驟。但由于目前的主流計(jì)算機(jī)設(shè)計(jì)架構(gòu)尚未突破馮·諾依曼體系架構(gòu)[6],真正的隨機(jī)數(shù)是無(wú)法在馮·諾依曼機(jī)上產(chǎn)生和實(shí)現(xiàn)的(參閱下文之基本概念),只能依靠采用以偽隨機(jī)數(shù)算法指導(dǎo)的程序生成偽隨機(jī)數(shù)序列來(lái)進(jìn)行近似逼近。因此,一個(gè)盡量隨機(jī)的偽隨機(jī)數(shù)算法是必要的。這種指導(dǎo)程序生成偽隨機(jī)數(shù)序列算法的隨機(jī)性決定了該算法的性能。正確的評(píng)價(jià)一個(gè)偽隨機(jī)數(shù)生成算法的性能,對(duì)指導(dǎo)實(shí)際求解問(wèn)題的開(kāi)展具有決定意義。
本文以運(yùn)用群智能算法求解生產(chǎn)調(diào)度問(wèn)題為例,對(duì)正確評(píng)價(jià)偽隨機(jī)數(shù)生成算法進(jìn)行深入探討和研究。
隨機(jī)數(shù)是指一組不能被預(yù)測(cè)的數(shù)字或符號(hào)序列,這些數(shù)字和序列是完全偶然產(chǎn)生的[7],即隨機(jī)數(shù)是客觀世界不確定性的理論抽象[8]。隨著概率論及數(shù)理統(tǒng)計(jì)等學(xué)科的發(fā)展,研究人員對(duì)隨機(jī)數(shù)的產(chǎn)生機(jī)理等逐漸明晰。同時(shí),為了研究的深入進(jìn)行,從軟硬件等方面盡可能設(shè)計(jì)了多種計(jì)算機(jī)實(shí)現(xiàn)方法。但是,依據(jù)馮·諾依曼架構(gòu)設(shè)計(jì)的計(jì)算機(jī)在不借助于外部硬件,僅從軟件自身角度,真實(shí)的隨機(jī)數(shù)是無(wú)法實(shí)現(xiàn)的。因?yàn)轳T·諾依曼機(jī)自身的架構(gòu)決定了這種機(jī)型只能做“按存儲(chǔ)指令的順序來(lái)執(zhí)行具體指令”的確定性行為。
馮·諾依曼機(jī)是指使用馮諾依曼體系架構(gòu)的電子數(shù)字計(jì)算機(jī)。早在1945年2月,世界上第一臺(tái)電腦誕生前,馮·諾依曼就提出了在數(shù)字計(jì)算機(jī)內(nèi)部的存儲(chǔ)器中存放程序的概念,正是按照馮·諾依曼的設(shè)計(jì)理念,在美國(guó)的賓夕法尼亞大學(xué)設(shè)計(jì)實(shí)現(xiàn)了第一臺(tái)計(jì)算機(jī)ENIAC[9],用以計(jì)算彈道軌道。這是當(dāng)今主流計(jì)算機(jī)的模板,被稱為馮·諾依曼結(jié)構(gòu)[10],目前,所有在用的成熟計(jì)算機(jī)設(shè)備均采用馮·諾依曼結(jié)構(gòu)設(shè)計(jì)。馮·諾依曼機(jī)主要由邏輯運(yùn)算單元、控制器、存儲(chǔ)單元、輸入輸出設(shè)備和其間相關(guān)總線組成,主要特點(diǎn)是:① 程序經(jīng)編譯后形成固定順序的指令,以二進(jìn)制代碼的形式存放在存儲(chǔ)器中;② 所有的指令都是由操作碼和地址碼組成;③ 指令按照存儲(chǔ)的順序調(diào)入內(nèi)部的堆棧,并進(jìn)行調(diào)用;④ 以邏輯運(yùn)算單元和控制器作為計(jì)算機(jī)處理的中心,并依次執(zhí)行指令。
由上述馮·諾依曼機(jī)設(shè)計(jì)架構(gòu)的特點(diǎn)可以推斷出:其內(nèi)部的每一個(gè)核心在調(diào)用和執(zhí)行指令時(shí)是一種串行機(jī)理,執(zhí)行結(jié)果只依賴于存儲(chǔ)的程序和編譯生成的指令代碼調(diào)用次序。因此,依據(jù)馮·諾依曼機(jī)架構(gòu)設(shè)計(jì)制造的計(jì)算機(jī)只能精確而有序地實(shí)現(xiàn)程序指令,不具備隨機(jī)不確定性,在不引入外部隨機(jī)量的情況下,單純依靠精確而有序地執(zhí)行指令的馮·諾依曼機(jī)自身來(lái)產(chǎn)生真隨機(jī)數(shù),本身就是一個(gè)悖論。因此,只能使用偽隨機(jī)數(shù)來(lái)逼近真實(shí)的隨機(jī)數(shù)。
偽隨機(jī)數(shù)則是指一組特性接近隨機(jī)數(shù)特性的數(shù)的序列,多由偽隨機(jī)數(shù)生成器產(chǎn)生[11]。偽隨機(jī)數(shù)生成器也被稱為確定的隨機(jī)二進(jìn)制數(shù)位生成器,是生成一組偽隨機(jī)數(shù)的算法。由上述定義及相關(guān)研究[12]可知,偽隨機(jī)數(shù)實(shí)際是確定的數(shù)的序列,只是其序列周期的長(zhǎng)度遠(yuǎn)長(zhǎng)于所研究的問(wèn)題集分布序列的長(zhǎng)度。而在基于馮·諾依曼架構(gòu)的計(jì)算機(jī)上,不依靠外部設(shè)備引入隨機(jī)性,只能通過(guò)計(jì)算機(jī)程序產(chǎn)生偽隨機(jī)數(shù)序列,該程序即相當(dāng)于偽隨機(jī)數(shù)生成器。
當(dāng)今,各領(lǐng)域所使用的主流計(jì)算機(jī)均未突破馮·諾依曼機(jī)的設(shè)計(jì)理念。各領(lǐng)域若僅借助于計(jì)算機(jī)進(jìn)行研究,其所需的隨機(jī)數(shù)只能通過(guò)偽隨機(jī)數(shù)生成器程序所生成的偽隨機(jī)數(shù)序列逼近。如何選擇適用于待解問(wèn)題的已有偽隨機(jī)數(shù)生成器程序,或如何改進(jìn)已有的偽隨機(jī)數(shù)生成算法,編制適合于待解問(wèn)題的偽隨機(jī)數(shù)生成程序具有重要意義。正確的選擇或改進(jìn)已有的偽隨機(jī)數(shù)生成算法就必須要對(duì)待研究的偽隨機(jī)數(shù)算法進(jìn)行正確的評(píng)價(jià)。根據(jù)沒(méi)有免費(fèi)午餐定理[13],任何相對(duì)較優(yōu)的算法,不可能對(duì)該領(lǐng)域的所有問(wèn)題均產(chǎn)生同樣顯著的效果;其只會(huì)在某些問(wèn)題上產(chǎn)生較優(yōu)的效果,而在另一些問(wèn)題上則不會(huì)產(chǎn)生顯著效果。因此,問(wèn)題不同,指導(dǎo)程序設(shè)計(jì)的偽隨機(jī)數(shù)算法就可能不同,正確評(píng)價(jià)才能針對(duì)特定問(wèn)題產(chǎn)生有效的隨機(jī)數(shù)。
對(duì)隨機(jī)數(shù)性能的評(píng)價(jià)主要基于對(duì)其測(cè)試的基礎(chǔ)之上?,F(xiàn)有的主要測(cè)試方法是使用美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(National Iustitute of Standards and Technology, NIST)隨機(jī)性測(cè)試方法中的一種或幾種組合,NIST隨機(jī)性測(cè)試方法主要包括:頻數(shù)測(cè)試、塊內(nèi)頻數(shù)測(cè)試、游程測(cè)試、塊內(nèi)最長(zhǎng)連續(xù)“1”測(cè)試、矩陣秩測(cè)試、離散傅里葉變換測(cè)試、非重疊模板匹配測(cè)試、重疊模板匹配測(cè)試、通用統(tǒng)計(jì)測(cè)試、壓縮測(cè)試、線性復(fù)雜度測(cè)試、連續(xù)性測(cè)試、近似熵測(cè)試、部分和測(cè)試、隨機(jī)游走測(cè)試及隨機(jī)游走變量測(cè)試等[14]。
由于傳統(tǒng)偽隨機(jī)數(shù)生成器的測(cè)試方法過(guò)于關(guān)注其數(shù)學(xué)性能,即關(guān)注于評(píng)價(jià)其是否符合某些隨機(jī)分布的特性,而忽略了其工程應(yīng)用方面的實(shí)際需求,使得設(shè)計(jì)的算法過(guò)于復(fù)雜。根據(jù)自身領(lǐng)域經(jīng)驗(yàn),針對(duì)符合均勻隨機(jī)分布的偽隨機(jī)數(shù)生成器的測(cè)試,本文提出了新的測(cè)試方法,并用此測(cè)試方法對(duì)偽隨機(jī)數(shù)的性能進(jìn)行了評(píng)價(jià),從而達(dá)到了對(duì)所測(cè)試的偽隨機(jī)數(shù)算法進(jìn)行正確評(píng)價(jià)的目的。
由于研究的數(shù)字應(yīng)服從均勻分布,其數(shù)值中的各個(gè)權(quán)重位上的數(shù)字均應(yīng)呈現(xiàn)出均勻隨機(jī)特性,即在0~9的10個(gè)數(shù)字中均勻產(chǎn)生。據(jù)此,可以將所需精度的數(shù)字一分為二,作為類似位圖填充的橫、縱坐標(biāo)點(diǎn)來(lái)進(jìn)行考量,即在前半部分和后半部分?jǐn)?shù)字形成的平面坐標(biāo)點(diǎn)所對(duì)應(yīng)的位置進(jìn)行填充。具體實(shí)施時(shí),可以借助二維0-1矩陣來(lái)較為簡(jiǎn)捷地實(shí)現(xiàn)。此時(shí)隨機(jī)數(shù)的前半部分和后半部分?jǐn)?shù)字對(duì)應(yīng)著矩陣具體的行數(shù)和列數(shù)。
以0到1間服從均勻分布的2位有效數(shù)字的偽隨機(jī)數(shù)生成器為例,此時(shí)可以構(gòu)建10×10的初始零矩陣M,如果生成器產(chǎn)生了偽隨機(jī)數(shù)0.34,則對(duì)應(yīng)將M(3,4)置1,此時(shí)可以利用相關(guān)軟件對(duì)此0-1矩陣?yán)L圖,將矩陣值為1的方格進(jìn)行填充,如圖1所示(為突出顯示效果,應(yīng)盡量用深色表示矩陣中較少的顏色)。最終在執(zhí)行若干次類似操作后,M矩陣的相應(yīng)元素將會(huì)被陸續(xù)置1,此時(shí)繪出的填充示例圖可以直觀表示出所產(chǎn)生隨機(jī)數(shù)的分布狀態(tài)。考慮到隨機(jī)數(shù)生成器的數(shù)學(xué)特性,測(cè)試執(zhí)行的次數(shù)應(yīng)與矩陣元素的個(gè)數(shù)相等;否則,從概率角度審視,過(guò)多的執(zhí)行次數(shù)會(huì)使整個(gè)矩陣絕大部分元素置1,一方面無(wú)法考察其隨機(jī)特性,另一方面使相應(yīng)繪出的矩陣填充圖失去其應(yīng)有的直觀性。另外,為了直觀起見(jiàn),選擇測(cè)試有效位數(shù)時(shí),應(yīng)盡可能選擇偶數(shù)位數(shù)的偽隨機(jī)數(shù),以便于對(duì)等拆分,并在拆分之后以前后兩個(gè)數(shù)字作為坐標(biāo)生成相應(yīng)的方陣和繪制相應(yīng)的測(cè)試結(jié)果示例圖。
圖1 示例說(shuō)明
本文選擇了3種偽隨機(jī)數(shù)算法指導(dǎo)下編制的程序,即目前程序設(shè)計(jì)中常用的C語(yǔ)言自帶的rand()隨機(jī)函數(shù),Kiss隨機(jī)函數(shù)和Mersenne隨機(jī)函數(shù)[15]。測(cè)試在SUSE Linux Enterprise 12軟件虛擬機(jī)平臺(tái)上進(jìn)行,使用C語(yǔ)言編程調(diào)用相關(guān)函數(shù)進(jìn)行測(cè)試,并借助Matlab 2015b軟件對(duì)生成的矩陣進(jìn)行填充圖繪制。考慮到位圖較小,為了增強(qiáng)圖像色差效果,便于對(duì)比觀察,繪圖時(shí)省略了網(wǎng)格線,并且用淺色表示矩陣中較多的元素“1”,用深色表示矩陣中相對(duì)較少的元素“0”。執(zhí)行次數(shù)定為10 000次(100×100),對(duì)初始零矩陣的覆蓋率(最終矩陣中1的元素個(gè)數(shù)與矩陣總元素的百分比),及首次達(dá)到60%覆蓋率所執(zhí)行的次數(shù)進(jìn)行了考察,結(jié)果如表1所示。首次達(dá)到60%覆蓋率直觀顯示了算法的分散度或隨機(jī)性。
表1 測(cè)試結(jié)果對(duì)比
*矩陣M為M1、M2與M3運(yùn)算合成,而非程序生成,故“覆蓋率首次達(dá)60%的執(zhí)行次數(shù)”處填“-”。
從表1中可以看出,3種方法各方面數(shù)據(jù)相差并不顯著,但是所示的矩陣填充圖卻直觀給出了3種函數(shù)具體的數(shù)值分布情況。仔細(xì)觀察3張?zhí)畛鋱D,可以發(fā)現(xiàn)3個(gè)偽隨機(jī)函數(shù)生成器所產(chǎn)生的偽隨機(jī)數(shù)分布是有錯(cuò)落的。據(jù)此,對(duì)3張圖進(jìn)行類似位圖的異或邏輯運(yùn)算,即比對(duì)3個(gè)矩陣,凡是對(duì)應(yīng)位置元素相異的則置1,最終生成矩陣M如圖2所示(M=M1?M2?M3),其覆蓋率和對(duì)應(yīng)的矩陣填充圖列于表格的最后一行。也有了產(chǎn)生新偽隨機(jī)數(shù)方法的一種啟示,即依靠機(jī)理不同的偽隨機(jī)數(shù)算法簡(jiǎn)單加權(quán)組合生成新的偽隨機(jī)數(shù)算法。
圖2 M1、M2、M3矩陣重疊為M矩陣
由表1可以看出,最后一行組合后的矩陣填充圖的效果最好,其覆蓋率達(dá)到了95.09%,而單獨(dú)的每一個(gè)偽隨機(jī)函數(shù)生成器所產(chǎn)生的隨機(jī)數(shù)覆蓋率只有63%左右。這主要是合成圖相當(dāng)于每次填充時(shí)進(jìn)行了3次隨機(jī)填充,即執(zhí)行了原迭代次數(shù)的3倍(30 000次)。為統(tǒng)一比較單獨(dú)偽隨機(jī)數(shù)函數(shù)與組合偽隨機(jī)數(shù)函數(shù)的優(yōu)劣,本文以上述3個(gè)偽隨機(jī)函數(shù)為基礎(chǔ),計(jì)算所得數(shù)據(jù)平均值如表2所示。
表2中使用了簡(jiǎn)單的等權(quán)組合各種偽隨機(jī)數(shù)算法。由表2不難看出,對(duì)偽隨機(jī)函數(shù)算法進(jìn)行不同組合,有可能會(huì)指導(dǎo)產(chǎn)生效果更好的偽隨機(jī)數(shù)生成器,如同樣進(jìn)行2次填充,M12偽隨機(jī)數(shù)生成器覆蓋范圍更大。這啟示當(dāng)采用不同的組合加權(quán)系數(shù)時(shí),有機(jī)會(huì)生成效果更適合的偽隨機(jī)數(shù)生成器。
對(duì)比表1和表2可以發(fā)現(xiàn):每種方法的覆蓋率與函數(shù)無(wú)關(guān),只與函數(shù)的個(gè)數(shù)有關(guān),其原因可以用離散性隨機(jī)變量的概率進(jìn)一步證明。論證如下:
表2 函數(shù)組合測(cè)試結(jié)果
說(shuō)明:表中“×2”表示每次填充時(shí)進(jìn)行了2次隨機(jī)填充,“×3”表示每次填充時(shí)進(jìn)行了3次隨機(jī)填充。
上述每次繪點(diǎn)的過(guò)程是完全獨(dú)立的,而點(diǎn)的位置也是隨機(jī)的,因此,該過(guò)程可以看成是符合伯努利二項(xiàng)式分布的。其可以對(duì)應(yīng)為初始零矩陣中的元素被選中置1的事件過(guò)程。
設(shè)隨機(jī)變量X表示:初始零矩陣中的元素被選中置1的事件,則X~B(n,p)。其中,
n=10 000,p=1/10 000
由于此時(shí)n很大,且p很小,故可近似認(rèn)定X服從泊松分布,即X~P(λ)。其中,
λ=np=1
因此,初始零矩陣每次置1的事件概率為
P(X)=P{X=1}+P{X=2}+…+
P{X=10 000}=1-P{X=0}=
1-e-1=63.21%
由此證明可以推知:表1中的初始零矩陣覆蓋率維系在63%附近是合理的;選取“覆蓋率首次達(dá)到60%的執(zhí)行次數(shù)”來(lái)體現(xiàn)函數(shù)的速度也是恰當(dāng)?shù)?;同時(shí)還證明實(shí)驗(yàn)中所選的偽隨機(jī)函數(shù)生成器都具有良好的數(shù)學(xué)特性,是值得信賴的。當(dāng)進(jìn)一步使用兩種隨機(jī)函數(shù)混合運(yùn)算時(shí),并不是簡(jiǎn)單對(duì)兩個(gè)函數(shù)求均值,而是在一次置1的事件過(guò)程中依次使用隨機(jī)函數(shù)對(duì)初始零矩陣置1。
再設(shè)所選用的每一個(gè)偽隨機(jī)函數(shù)具有上述數(shù)學(xué)特性且保持獨(dú)立,函數(shù)個(gè)數(shù)為N。則上述每次被選中置1的概率為:p=N/10 000,相應(yīng)的λ=np=N。由此可得函數(shù)個(gè)數(shù)與覆蓋率的函數(shù)關(guān)系,即覆蓋率CN=1-e-N。表3所示列出了N取1~5時(shí)的理論覆蓋率。
表3 1~5個(gè)函數(shù)時(shí)的覆蓋率
由表3中的理論覆蓋率可以看出,使用獨(dú)立的隨機(jī)函數(shù)越多,覆蓋效果越好。而從實(shí)際執(zhí)行層面看,程序在一次置1事件的執(zhí)行過(guò)程中,實(shí)際又獨(dú)立執(zhí)行了N次置1事件,增加了置1概率,從而增加了最終的初始零矩陣覆蓋率。
根據(jù)上述分析可以看出,既然所選的偽隨機(jī)函數(shù)生成器相互間獨(dú)立,其置1過(guò)程也是獨(dú)立的,多次獨(dú)立使用同一個(gè)偽隨機(jī)函數(shù)生成器來(lái)達(dá)到多個(gè)偽隨機(jī)數(shù)生成器的效果也可作進(jìn)一步的研究。筆者利用3個(gè)函數(shù)中最簡(jiǎn)單的偽隨機(jī)函數(shù)rand(),在程序執(zhí)行一次置1的過(guò)程中,進(jìn)行了N次獨(dú)立隨機(jī)使用,所得數(shù)據(jù)列于表3的最后兩列。由數(shù)據(jù)看,同樣達(dá)到了組合隨機(jī)函數(shù)的效果,隨著使用次數(shù)的增加,覆蓋率逐漸接近于1,且“覆蓋率首次達(dá)到60%時(shí)的執(zhí)行次數(shù)”也顯著降低。因此,這種生成均勻分布偽隨機(jī)數(shù)的方法,對(duì)某些高精度初始化的應(yīng)用提供了有益的嘗試方向。
圖3所示為e的負(fù)指數(shù)曲線。從圖3可以看出,當(dāng)實(shí)驗(yàn)次數(shù)N>5時(shí),參數(shù)效果提升已不明顯;而從運(yùn)算開(kāi)銷考慮,選取N=3已足夠滿足日常對(duì)均勻分布偽隨機(jī)數(shù)的精度需求。
圖3 e的負(fù)指數(shù)曲線
通過(guò)本文的討論,可以看出使用偽隨機(jī)數(shù)生成器逼近真實(shí)的隨機(jī)數(shù)是目前各類研究中較為可行的一種方法。而使用本文中的評(píng)價(jià)方法,對(duì)所構(gòu)建的偽隨機(jī)數(shù)生成算法進(jìn)行評(píng)價(jià),可以有效地指導(dǎo)實(shí)際應(yīng)用,并應(yīng)用到各種群智能算法中,如粒子群算法[16]等。同時(shí)針對(duì)特定問(wèn)題,也可以對(duì)已有的偽隨機(jī)數(shù)算法進(jìn)行簡(jiǎn)單的組合改進(jìn),進(jìn)行評(píng)價(jià)和改進(jìn)指導(dǎo),以更好的解決問(wèn)題。