一般呼叫:CALL O1235 (等同FANUC的M98 P1235)
模态呼叫: MODIN O1235 (等同FANUC的G66 P1235)
程序动作完成后需用G100或MODOUT取消模态循环
sets:plane/1..10/:x,fine,earliest,lastest,target
link(plane,plane):wait,y
endsets
data:
!最早到达时间
earliest=129 195 89 96 110 120 124 126 135 160
!最晚到达时间
lastest=559 744 510 521 555 576 577 573 591 657
!目标时间
target=155 258 98 106 123 135 138 140 150 180
!罚金
fine=10 10 30 30 30 30 30 30 30 30
!相邻降落之间的间隔时间矩阵
wait=0 3 15 15 15 15 15 15 15 15 !1
3 0 15 15 15 15 15 15 15 15 !2
15 15 0 8 8 8 8 8 8 8 !3
15 15 8 0 8 8 8 8 8 8 !4
15 15 8 8 0 8 8 8 8 8 !5
15 15 8 8 8 0 8 8 8 8 !6
15 15 8 8 8 8 0 8 8 8 !7
15 15 8 8 8 8 8 0 8 8 !8
15 15 8 8 8 8 8 8 0 8 !9
15 15 8 8 8 8 8 8 8 0!10
enddata
min=@sum( plane:fine(i)*@abs( x(i)-target(i) ) )
@for(plane(i):@bnd(earliest(i),x(i),lastest(i)))!最早降落时间和最迟降落时间限制
@for(plane(i):@for(plane(j) | i#ne#j:y(i,j)=@if(x(i) #le# x(j),1,0)))!飞机i比飞机j早降落,y(i,j)=1,否则为0
@for(link(i,j) | i#ne#j:(y(i,j)+y(j,i))=1)
@for(plane(i):@for(plane(j) | i#ne#j:x(i)+wait(i,j)<=x(j)))
@for(plane:@gin(x))
@for(link:@bin(y))
这个代码大概可以表示,但是还是有错误,期待高手修改一下。
public class PrivilegeProcess {public static void main(String[] args) {
MyQueue myqueue = new MyQueue()//声明队列
PCB[] pcb = {new PCB(001,8,1),new PCB(002,7,9),new PCB(003,3,8),new PCB(004,1,7),new PCB(005,7,4)}
PCB para = new PCB()
for(int i=0i<pcb.lengthi++){//初始化后首先执行一次排序,这里使用的是选择排序,优先级高的先入队
for(int j=ij<pcb.lengthj++){
if(pcb[i].privilege <pcb[j].privilege){
para = pcb[i]
pcb[i] = pcb[j]
pcb[j] = para
}
}
}
System.out.println("初次入队后各进程的顺序:")
for(int i=0i<pcb.lengthi++){
System.out.println("初次入队后 # processname : " + pcb[i].name + " totaltime : " + pcb[i].totaltime + " privilege :" + pcb[i].privilege)
}
System.out.println()
myqueue.start(pcb)
}
}
class MyQueue {
int index = 0
PCB[] pc = new PCB[5]
PCB[] pc1 = new PCB[4]
PCB temp = new PCB()
public void enQueue(PCB process){//入队算法
if(index==5){
System.out.println("out of bounds !")
return
}
pc[index] = process
index++
}
public PCB deQueue(){//出队算法
if(index==0)
return null
for(int i=0i<pc1.lengthi++){
pc1[i] = pc[i+1]
}
index--
temp = pc[0]
for(int i=0i<pc1.lengthi++){
pc[i] = pc1[i]
}
return temp
}
public void start(PCB[] pc){//显示进程表算法
while(pc[0].isNotFinish==true||pc[1].isNotFinish==true||pc[2].isNotFinish==true||pc[3].isNotFinish==true||pc[4].isNotFinish==true){
//*注意:||运算符,所有表达式都为false结果才为false,否则为true
for(int i=0i<pc.lengthi++){
pc[i].run(this)
}
System.out.println()
for(int i=0i<pc.lengthi++){//所有进程每执行完一次时间片长度的运行就重新按优先级排列一次
for(int j=ij<pc.lengthj++){
if(pc[i].privilege <pc[j].privilege){
temp = pc[i]
pc[i] = pc[j]
pc[j] = temp
}
}
}
}
}
}
class PCB {//声明进程类
int name,totaltime,runtime,privilege
boolean isNotFinish
public PCB(){
}
public PCB(int name, int totaltime, int privilege){
this.name = name//进程名
this.totaltime = totaltime//总时间
this.privilege = privilege//优先级别
this.runtime = 2//时间片,这里设值为2
this.isNotFinish = true//是否执行完毕
System.out.println("初始值: processname : " + name + " totaltime : " + totaltime + " privilege :" + privilege )
System.out.println()
}
public void run (MyQueue mq){//进程的基于时间片的执行算法
if(totaltime>1){
totaltime-=runtime//在总时间大于1的时候,总时间=总时间-时间片
privilege--
System.out.println(" processname : " + name + " remaintime : " + totaltime + " privilege :" + privilege )
}else if(totaltime==1){
totaltime--//在总时间为1时,执行时间为1
privilege--
System.out.println(" processname : " + name + " remaintime : " + totaltime + " privilege :" + privilege )
}else{
isNotFinish = false//总时间为0,将isNotFinish标记置为false
}
if(isNotFinish==true){
mq.deQueue()
mq.enQueue(this)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)