一種高效計(jì)劃制定程序的使用及計(jì)算方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及應(yīng)用程序,具體地說(shuō)是一種高效計(jì)劃制定程序的使用與計(jì)算方法。
【背景技術(shù)】
[0002]目前,已有一些計(jì)劃制作(即對(duì)多個(gè)工作或?qū)W習(xí)的計(jì)劃安排)的電腦軟件或者手機(jī)應(yīng)用程序,但是,它們的主要功能是錄入使用者的工作或?qū)W習(xí)計(jì)劃,然后讓使用者進(jìn)行安排。大致的形式有兩種:1.記事本型,記錄使用者輸入的計(jì)劃,完成后使用者可以將其勾除;2.鬧鐘型,與安裝終端的時(shí)間關(guān)聯(lián),根據(jù)時(shí)間使用鬧鐘提醒使用者執(zhí)行計(jì)劃。而這些計(jì)劃制作軟件,只能起到記錄和提醒的作用,并不能幫助使用者做出最為高效的安排選擇。
【發(fā)明內(nèi)容】
[0003]本發(fā)明所要解決的技術(shù)問(wèn)題是:為彌補(bǔ)現(xiàn)有技術(shù)的缺陷與不足,開發(fā)一款軟件,并利用其獨(dú)特的任務(wù)計(jì)算方法,幫助用戶制定一個(gè)最為高效的計(jì)劃——在有限的時(shí)間內(nèi)實(shí)現(xiàn)完成任務(wù)總價(jià)值最大化,用戶使用時(shí),只要輸入計(jì)劃的內(nèi)容,再加入關(guān)于計(jì)劃的時(shí)間和價(jià)值評(píng)估就可以得到最為合理的計(jì)劃安排,同時(shí)還可以起到記錄的作用。
[0004]本發(fā)明解決其技術(shù)問(wèn)題所采用的技術(shù)方案是:
一種高效計(jì)劃制定程序的使用及計(jì)算方法,其所采取的使用步驟及計(jì)算方法如下:
A、選擇語(yǔ)言:程序用戶輸入語(yǔ)言選擇,支持漢語(yǔ)和英語(yǔ)兩種語(yǔ)言,大大地?cái)U(kuò)大了用戶面;
B、輸入:輸入程序所需要的信息:用戶的計(jì)劃工作時(shí)長(zhǎng)、任務(wù)數(shù)量以及每一個(gè)任務(wù)的名稱、任務(wù)的時(shí)間和任務(wù)的重要性打分;程序使用整實(shí)型變量存儲(chǔ)工作時(shí)長(zhǎng)、任務(wù)數(shù)量、每一個(gè)任務(wù)的時(shí)間和任務(wù)的重要性打分,使用一個(gè)字符型二維數(shù)組,存儲(chǔ)每一個(gè)任務(wù)名的字符串。程序在Windows DOS環(huán)境下運(yùn)行,輸入存儲(chǔ)十分快捷,可以在百萬(wàn)分之一秒內(nèi)完成記錄,操作流暢;
C、運(yùn)算:根據(jù)輸入的數(shù)據(jù),計(jì)算在計(jì)劃時(shí)間內(nèi)所能完成的重要性的最大值,其具體實(shí)現(xiàn)的核心算法是動(dòng)態(tài)規(guī)劃的01背包算法,在算法內(nèi),把用戶所擁有的時(shí)間作為背包,把工作任務(wù)作為要放入背包的物品,每個(gè)物品的價(jià)值則是每個(gè)任務(wù)的重要性,核心代碼使用的是一維滾動(dòng)數(shù)組進(jìn)行動(dòng)態(tài)規(guī)劃運(yùn)算。節(jié)省了程序運(yùn)行空間,即使運(yùn)算量再大也不會(huì)影響電腦的運(yùn)行,對(duì)電腦的性能要求也很低。運(yùn)算十分快捷,可以在I秒之內(nèi)得出結(jié)果。具體的實(shí)現(xiàn)手段是,以一維數(shù)組(dp[241],因?yàn)樽畲髸r(shí)間長(zhǎng)度為240分鐘)的下標(biāo)作為時(shí)間,數(shù)組里的每一個(gè)值在計(jì)算結(jié)束后存儲(chǔ)的就是使用對(duì)應(yīng)下標(biāo)時(shí)間能夠達(dá)到的最大重要性值。當(dāng)一組數(shù)據(jù)錄入時(shí),得到當(dāng)前任務(wù)的時(shí)間(tuse)和重要性(imp),此時(shí)遍歷一次數(shù)組,當(dāng)dp[i]<dp[1-tuse] +imp (i是遍歷數(shù)組時(shí)用到的變量,指當(dāng)前時(shí)間)時(shí),說(shuō)明如果執(zhí)行當(dāng)前任務(wù),則工作時(shí)間i得到的重要性最大,為dp [1-tuse](當(dāng)前時(shí)間減去完成當(dāng)前任務(wù)的時(shí)間時(shí)能得到的最大重要性)與imp (當(dāng)前任務(wù)的重要性)之和,因?yàn)閐p[1-tuSe]的值一定是最大的,所以得到dp[i]的值也一定是最大的,所以此時(shí)則可以把dp[1-tuse]+imp的值賦給dp[i];反之則繼續(xù)循環(huán)直到遍歷完整個(gè)數(shù)組則繼續(xù)錄入下一組數(shù)據(jù);
D、記錄:使用二維標(biāo)記數(shù)組,在運(yùn)算過(guò)程中記錄每個(gè)計(jì)劃的任務(wù)列表,并不斷更新,如果有多個(gè)計(jì)劃符合最佳結(jié)果時(shí)輸出的是最后的一組。具體的實(shí)施方法是,當(dāng)dp[i]<dp[1-tuse] +imp時(shí),則需要更新當(dāng)前時(shí)間i達(dá)到最大重要性值所要執(zhí)行的任務(wù)列表。源代碼中使用一個(gè)名為name[101][101]的字符型二維數(shù)組記錄每一次任務(wù)名的輸入,因?yàn)榭側(cè)蝿?wù)數(shù)不超過(guò)100,而每個(gè)任務(wù)的名字長(zhǎng)度不長(zhǎng)于100,兩個(gè)下標(biāo)的含義為name [任務(wù)數(shù)][任務(wù)名]。并使用一個(gè)名為use[241] [101]的整實(shí)型二維數(shù)組標(biāo)記對(duì)應(yīng)時(shí)間若需達(dá)到最大重要性是否需要使用某個(gè)任務(wù),兩個(gè)下標(biāo)的含義為use[時(shí)間][任務(wù)數(shù)],假若在時(shí)間i需要使用到任務(wù)j,則進(jìn)行賦值use [i] [j]=l,use數(shù)組的初始值全為零,使用I表示使用任務(wù),O表示不用任務(wù)。當(dāng)?shù)趈個(gè)任務(wù)符合條件,需要把dp [1-tuse]+imp (imp為當(dāng)前第j個(gè)任務(wù)的重要性)的值賦給dp[i]時(shí),使用“memset (use, O, sizeof (use[i])); ”的語(yǔ)句來(lái)重置use [i]這個(gè)時(shí)間所有任務(wù)的情況,再把use [1-tuse]的每一個(gè)值賦給use [i],最后把use[i] [j]標(biāo)記為I,組成新的任務(wù)列表;
E、輸出:首先輸出根據(jù)計(jì)算得出的在計(jì)劃時(shí)間內(nèi)可以達(dá)到的最大價(jià)值,然后根據(jù)最大價(jià)值對(duì)應(yīng)的狀態(tài),調(diào)取標(biāo)記數(shù)組中記錄的狀態(tài),把字符串?dāng)?shù)組里的對(duì)應(yīng)了被標(biāo)記了的任務(wù)名輸出,組成最佳計(jì)劃清單。具體的實(shí)現(xiàn)方式是,遍歷數(shù)組dp [1..time](從I到計(jì)劃時(shí)間),用整實(shí)型變量max記錄能夠達(dá)到的最大重要性值,并使用變量j記錄達(dá)到max時(shí)對(duì)應(yīng)的所用時(shí)間。先輸出最大重要性值max,然后開始遍歷標(biāo)記數(shù)組use [j],如果use[j][i]的值為1,則說(shuō)明達(dá)到最大重要性值時(shí)要執(zhí)行第i個(gè)任務(wù),則輸出字符串name [i],輸出完后就組成了任務(wù)清單;
F、繼續(xù):整個(gè)程序在一個(gè)循環(huán)里,如果用戶對(duì)自己的計(jì)劃不滿意,或者想要做出什么改變,可以選擇繼續(xù)制作計(jì)劃,也可以輸入對(duì)應(yīng)內(nèi)容,則會(huì)跳出循環(huán),直接退出程序。
[0005]本發(fā)明的優(yōu)點(diǎn)在于:經(jīng)本程序計(jì)算出來(lái)的計(jì)劃一定是最優(yōu)解,而且計(jì)算過(guò)程真正可以說(shuō)是快如閃電。可能在任務(wù)量比較小的時(shí)候一般人可以直接判斷出最優(yōu)計(jì)劃,然而當(dāng)任務(wù)量增大時(shí)尤其是時(shí)間有限的情況下,本程序的優(yōu)勢(shì)則顯露無(wú)疑。它可以讓人減少鋳躇的時(shí)間,而最聞效地利用時(shí)間。
[0006]
【具體實(shí)施方式】
下面結(jié)合實(shí)例對(duì)本發(fā)明做進(jìn)一步的描述。
[0007]—種高效計(jì)劃制定程序的使用及計(jì)算方法,其所采取的使用步驟及計(jì)算方法如下:
A、選擇語(yǔ)言:程序用戶輸入語(yǔ)言選擇,支持漢語(yǔ)和英語(yǔ)兩種語(yǔ)言,大大地?cái)U(kuò)大了用戶面;
B、輸入:輸入程序所需要的信息:用戶的計(jì)劃工作時(shí)長(zhǎng)、任務(wù)數(shù)量以及每一個(gè)任務(wù)的名稱、任務(wù)的時(shí)間和任務(wù)的重要性打分;程序使用整實(shí)型變量存儲(chǔ)工作時(shí)長(zhǎng)、任務(wù)數(shù)量、每一個(gè)任務(wù)的時(shí)間和任務(wù)的重要性打分,使用一個(gè)字符型二維數(shù)組,存儲(chǔ)每一個(gè)任務(wù)名的字符串。程序在Windows DOS環(huán)境下運(yùn)行,輸入存儲(chǔ)十分快捷,可以在百萬(wàn)分之一秒內(nèi)完成記錄,操作流暢;
C、運(yùn)算:根據(jù)輸入的數(shù)據(jù),計(jì)算在計(jì)劃時(shí)間內(nèi)所能完成的重要性的最大值,其具體實(shí)現(xiàn)的核心算法是動(dòng)態(tài)規(guī)劃的01背包算法,在算法內(nèi),把用戶所擁有的時(shí)間作為背包,把工作任務(wù)作為要放入背包的物品,每個(gè)物品的價(jià)值則是每個(gè)任務(wù)的重要性,核心代碼使用的是一維滾動(dòng)數(shù)組進(jìn)行動(dòng)態(tài)規(guī)劃運(yùn)算。節(jié)省了程序運(yùn)行空間,即使運(yùn)算量再大也不會(huì)影響電腦的運(yùn)行,對(duì)電腦的性能要求也很低。運(yùn)算十分快捷,可以在I秒之內(nèi)得出結(jié)果。具體的實(shí)現(xiàn)手段是,以一維數(shù)組(dp[241],因?yàn)樽畲髸r(shí)間長(zhǎng)度為240分鐘)的下標(biāo)作為時(shí)間,數(shù)組里的每一個(gè)值在計(jì)算結(jié)束后存儲(chǔ)的就是使用對(duì)應(yīng)下標(biāo)時(shí)間能夠達(dá)到的最大重要性值。當(dāng)一組數(shù)據(jù)錄入時(shí),得到當(dāng)前任務(wù)的時(shí)間(tuse)和重要性(imp),此時(shí)遍歷一次數(shù)組,當(dāng)dp[i]<dp[1-tuse] +imp (i是遍歷數(shù)組時(shí)用到的變量,指當(dāng)前時(shí)間)