java 实现 指派_TAP任务指派问题的汇编实现
近六周的課程設(shè)計,編了一個四百行的匯編程序,編的過程很不順利,遇到種種意想不到的困難,但最終能夠?qū)崿F(xiàn),可謂欣喜若狂,這期間學(xué)到了好多好多,遇到問題怎么精下心來解決,同時對匯編的理解也更加深刻了。所謂TAP任務(wù)指派問題,簡單來說我實現(xiàn)的是有六個人,有六項任務(wù),沒個人做每一項任務(wù)的所消耗的時間代價不同,有一個六階參考矩陣代價表,然后將六個員工編號為123456,固定不變,接下來隨機產(chǎn)生幾種任務(wù)的排序方案,假設(shè)任務(wù)命名為ABCDEF,可能隨機產(chǎn)生一種方案為EDCABF,這意思就是第一個人做E任務(wù),第二個人做D任務(wù)依次下去,最后計算每一種方案的總代價,然后計算每一種方案的帶價總和,然和輸出最優(yōu)(代價值最小)的那一種方案。
運行結(jié)果圖:
附源碼:
DATAS SEGMENT
str1 db 'reference array:','$'
str2 db 'feasible plans:','$'
str3 db 'How many plans do you want:(1-6) ','$'
str4 db 'The optimal plan:','$'
str5 db 'The order of the employees:',0dh,0ah,'123456','$'
str6 db 'The value of these several kinds of schemes:','$'
str7 db 'The cost of this plan is:','$'
array db 5,6,9,7,4,6,8,3,5,4,6,7,6,2,4,7,8,9,9,7,6,8,4,5,7,4,3,6,8,9,5,7,8,9,6,4
peo db 1,2,3,4,5,6
StrEnter?db 0dh,0ah,'$'? ;回車換行
n dw 1?? ;用于顯示數(shù)組為矩陣計數(shù)
temp db 2
sii dw ?
q db 0??? ;用在計算代價值的子函數(shù)中
save db 0 ;用于保存al的值
best db 0? ;保存最優(yōu)代價值
chushu db 6?? ;用于顯示數(shù)組為矩陣作為除數(shù)
count dw 0? ;產(chǎn)生隨機串計數(shù)用的
buf db 96 dup(?)? ;最多保存八種方案
buff db 36 dup(?)? ;提取buf中有用的數(shù)字
yy? db 8 dup(?)?? ;保存六種方案的代價值
OUTp db 0h???? ;作為為調(diào)用顯示函數(shù)保存的臨時變量
countr db 0??? ;作為臨時的和值保存
num db 1??? ;記錄最小的數(shù)是第幾個
DATAS ENDS
STACKS SEGMENT
;此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此處輸入代碼段代碼
;顯示“參考數(shù)組:”
lea dx,str1
mov ah,9
int 21h
;顯示回車換行
call CRLF??????? ;調(diào)用子程序
;**********************顯示參考矩陣********************************************
push si
lea si,array
mov cx,36?? ;cx是loop的參考值
j1:
mov dl,[si]
add dl,30h
mov ah,2??? ;調(diào)用2號中斷,顯示單個值
int 21h
mov ax,n
div chushu
cmp ah,0
jnz tz
call CRLF
tz:
inc n
inc si
loop j1
pop si
call CRLF;調(diào)用一次回車換行
;*****************顯示員工排列的順序******************************************
lea dx,str5
mov ah,9
int 21h
call CRLF
;*****************顯示“你要選擇多少種方案:(1-8)”*************************
;----顯示提示語---------------------------------------------------------------
lea dx,str3
mov ah,9
int 21h
call CRLF
;----輸入選擇-----------------------------------------------------------------
j2:?mov ah,7
int 21h
cmp al,'6'
ja j2
cmp al,'1'
jb j2
mov dl,al
mov ah,2
int 21h
mov save,al?? ;因為下面si:步驟會更改al的值
call CRLF
;*****************顯示“feasible plans:”**************************************
s1: lea dx,str2
mov ah,9
int 21h
call CRLF
;************************產(chǎn)生隨機方案********************************************
mov al,save
sub al,30h? ;減去30h變成數(shù)字
mov ah,0
lea di,buf? ;取buf首地址
mov cx,ax
C0:
call Random
loop C0
lea dx,buf
mov ah,9
int 21h
call CRLF
;****************顯示“這幾種解決方案的代價值:”*******************************
lea dx,str6
mov ah,9
int 21h
;********************計算每一種解決方案的值***************************************
call CALCU?????? ;可能將save的值改變了
call CRLF
;*****************顯示“最優(yōu)的那個方案以及其代價值”****************************
call CRLF
lea dx,str4
mov ah,9
int 21h
;******************計算得到最優(yōu)的那個方案**************************************
call CRLF
;lea dx,Str7?? ;顯示這最小方案的代價
;mov ah,9
;int 21h
lea si,yy
call CALBEST
;*******************************************************************************
call over? ;調(diào)用結(jié)束程序
;*******************************************************************************
;######################調(diào)用的子程序#############################################
;****回車換行*******************************************************************
CRLF PROC NEAR
lea dx,StrEnter
mov ah,9
int 21h
RET
CRLF ENDP
;****結(jié)束程序*******************************************************************
OVER PROC NEAR
MOV AH,4CH
INT 21H
RET
OVER ENDP
;******產(chǎn)生隨機方案******************************************************************
;入口為 di,將di后的六位填充六個隨機數(shù)
Random proc near
push cx
push si
mov sii,di
mov cx,6
L3:
push cx
L0:
xor ax,ax
out 43h,al
in al,40h
cmp al,1
jb L0
cmp al,6
ja L0
or al,40h
mov si,sii
mov [di],al
mov ax,di
cmp ax,si
jz L2
sub ax,si
mov cx,ax
L1:
mov ah,[si]
cmp ah,[di]
jz L0
inc si
loop L1
L2:
pop cx
inc di
loop L3
mov [di],0dh
inc di
mov [di],0ah
inc di
mov [di],'$'
pop si
pop cx
ret
Random endp
;****計算代價值*****************************************************************
;入口:peo db 6?????? buf db 96??? array(參考數(shù)組) db?? save db (保存幾個方案)
;出口:res dw 8(保存所有方案的代價值)
CALCU PROC NEAR?????? ;g97
push si
push di??? ;<<
push bp
call CRLF
call CONVERTBUFTOBUFF? ;將buf中的有用數(shù)據(jù)存到buff中
lea si,yy?? ;保存六種方案的代價值
mov q,0??? ;大循環(huán)的判斷條件??? db
f0:;將指針指向緩沖區(qū)的頭部
lea di,buff
mov ah,0????? ;控制到buff中的第幾個方案的頭地址
mov al,q
mul chushu??? ;乘以6
add di,ax???? ;fla標記是將si和di指向兩個頭指針
mov ax,0
mov ch,0?? ;小循環(huán)的判斷條件
fl:
inc ax
push ax???? ;>>
dec ax
mul chushu???? ;(x-1)*6+y?????? (chushu=6)
mov bl,[di]
mov bh,0
add ax,bx?? ;計算要參考代價表的第幾個值存在ax中
lea bp,array??? ;參考代價表
dec ax?????? ;自減一下,因為沒從0開始
add bp,ax
mov dl,[bp]??? ;取參考表的值到dl
mov dh,0
add countr,dl?? ;和值不斷增加
inc di
pop ax
inc ch
cmp ch,chushu?? ;判斷是否循環(huán)了六次
JNE fl
mov dl,countr? ;把一種方案的六次的值放到dl中然后賦給
mov [si],dl??? ;將計算的結(jié)果壓到y(tǒng)y
mov dl,[si]
mov OUTp,dl
call OUTPut
inc si;*;
mov countr,0?? ;和重新清0,重新計算下一個方案的結(jié)果值
;mov dl,[si]
;mov OUTp,dl;<
;call OUTPut???? ;輸出顯示
inc q
mov al,q
cmp al,save??? ;比較大循環(huán)和save的值 看看是否結(jié)束
JNE f0
pop bp
pop di
pop si
RET
CALCU ENDP
;***計算最小的那個代價值*******************************************************
;入口 res dw 8
;出口 best dw
CALBEST PROC NEAR
push si
mov bl,1????? ;記錄最小的這個代價值是yy中的第幾個
mov cl,save????? ;控制循環(huán)幾次
dec cl
mov ch,0
;mov dx,cx?? ;驗證save是否正確
;add dx,30h
;mov ah,2
;int 21h
;;;;;;;;;;驗證壓入YY的值是否正確;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov dl,[si]
mov best,dl
cmp cx,0 ;如果save等于0,則不要比較直接跳轉(zhuǎn)結(jié)束
jz q3
inc si
q1:
mov dl,[si]
;add dx,30h
;mov ah,2
;int 21h
inc bl??? ;記錄是數(shù)組中的第幾個,以便輸出那個方案
cmp dl,best
jnb q2???? ;大于或等于則跳轉(zhuǎn)到q2
mov best,dl
mov num,bl
q2:
inc si??? ;si加一是字節(jié),如果保存的是dw類型的就要加2
loop q1
;此時已經(jīng)計算好了dl和最小的值,接下來時顯示
q3:
mov dl,num?? ;第幾個方案最小
add dl,30h
mov ah,2
int 21h
call CRLF
;依次輸出這六個方案
;mov dl,num
;add dl,30h
;mov ah,2
;int 21h
mov dl,num
push di
lea di,buff
mov dh,0
dec dl
mov al,dl
mov ah,0
mul chushu
add di,ax
;顯示最優(yōu)方案的六個字母
mov cx,6
q10:
mov dl,[di]
add dl,40h
mov ah,2
int 21h
inc di
loop q10
pop di
call CRLF
;顯示這最小方案的代價的提示語
lea dx,Str7
mov ah,9
int 21h
mov dl,best?? ;顯示最小方案的代價值
mov OUTp,dl
call OUTPut
pop si
RET
CALBEST ENDP
;*****將buf中的值去掉回車換行存到buff***********************************************************
CONVERTBUFTOBUFF PROC NEAR
push si
sub save,30h
mov al,save
mov ah,0
mov bl,6
mul bl????? ;控制多少次循環(huán)
mov cx,ax
mov bx,0
lea si,buf
lea di,buff
q4: mov dl,[si]
sub dl,40h
mov [di],dl
inc si
inc di
inc bx
cmp bx,6
JNE q5
add si,2
mov bx,0
q5:?loop q4
pop si
RET
CONVERTBUFTOBUFF ENDP
;******將一個字節(jié)型的OUTp輸出顯示**********************************************
OUTPut proc?????? ;字節(jié)型的OUTp兩位數(shù)的和
push si
lea si,temp
mov al,OUTp
mov cx,1
mov bl,10
CX1:
cmp al,10
jb? CX2??? ;小于跳轉(zhuǎn)
sub ah,ah? ;清0
div bl
mov [si],ah? ;余數(shù)賦給
inc si
inc cx
sub ah,ah?? ;余數(shù)部分清0
jmp CX1
CX2:
mov [si],al? ;商賦給
CX3:
mov dl,[si]? ;商顯示
add dl,30h
mov?ah,2
int?21h
dec si????? ;自減1,然后顯示余數(shù)
loop CX3;?? ;循環(huán)兩次 將商和余數(shù)顯示出來
mov dl,' '
int 21h
pop si
RET
OUTput endp
;******************************************************************************
CODES ENDS
END START
總結(jié)
以上是生活随笔為你收集整理的java 实现 指派_TAP任务指派问题的汇编实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10如何开启桌面速览功能 win1
- 下一篇: idea如何导入java工程_Eclip