带有限期和效益的单位时间的作业排序贪心算法

D=(2,3,1,3,4,5,2);P(15,12,11,10,8,5,4);

首先将作业按p1≥p2 ≥ … ≥ pn排序, 将作业1存入解数组J中, 然后按照如下步骤逐一处理作业2到作业n;假设已处理完了i-1个作业, 其中有k个作业可构成可行解,已存入J(1),J(2)…J(k)中, 且D(J(1))<=D(J(2)) <=…<=D(J(k))
§现在处理作业i, 判断Jυ{i}是否可行, 就是看是否能为其中作业都找到适当插入位置r, 使作业i插入后有D(J(r))≥r; 1≤r≤k+1.  过程如下:

将D(J(k)), D(J(k-1)),…依次与D(i)比较,若D(J(l))>D(i)且D(J(l))≠l,l≤k,则作业J(l)可以向后延迟一个单位时间来处理,作业i可以在J(l)之前处理。

 1 package greedy;
 2 
 3 public class JS {
 4     int n=7;
 5     int [] D={0,2,3,1,3,4,5,2};//下标从1开始
 6     float[] P={0,15,12,11,10,8,5,4};//先对P进行非增排序
 7     int[] J=new int[n+1]; 
 8     int k;
 9     JS(){
10         k=js(D,J,n,k);
11         System.out.println("可调度作业数目:"+k);
12         double sum=0;
13         System.out.print("作业调度次序:"); 
14         for(int i=1;i<=k;i++){
15             System.out.print("->"+J[i]);
16             sum+=P[J[i]];
17         }
18         System.out.println();
19         System.out.println("总收益Sum="+sum);
20     }
21     public int js(int[] D,int[] J,int n,int k){
22         int i,r;
23         k=1;
24         J[1]=1;//把第一个作业加入
25         for(i=2;i<n;i++){
26             r=k;
27             while(D[J[r]]>D[i]&&D[J[r]]!=r){
28                 r--;
29             }
30             if(D[J[r]]<=D[i]&&D[i]>r){
31                 for(int l=k;l>r;l--){
32                     J[l+1]=J[l];
33                 }
34                 J[r+1]=i;
35                 k++;
36             }
37         }
38         return k;
39     }
40     public static void main(String[] args) {
41         // TODO Auto-generated method stub
42         new JS();
43     }
44 
45 }
View Code

测试结果:

转载于:https://www.cnblogs.com/yuanzhenliu/p/5133168.html

### 带有时限约束的作业调度算法 JF 带有时限约束的作业调度算法JF(Job First),是一种用于处理具有时限要求的任务集的有效策略。该算法主要关注于优先执行那些最接近其截止时间的工作,从而尽可能多地完成任务并减少错过期限的情况。 #### 算法原理 在JF算法中,所有待处理的任务按照它们各自的绝对截止日期进行排序[^1]。每当有新的工作加入队列时,会重新评估当前等待中的每一个工作的剩余时间紧急程度,并相应调整顺序以确保最早到期者被最先考虑。这种机制有助于提高系统的响应速度服务质量。 对于具体实现而言,在每次选择下一个要运行的任务之前都会遍历整个列表来查找距离现在最近的一个未过期请求作为目标对象加以处理[^2]。 ```python from typing import List, Tuple import heapq def job_first_scheduler(jobs: List[Tuple[int, int]]) -> List[int]: """ 使用 Job First (JF) 调度器安排带有最后期限的任务. 参数: jobs (List[Tuple]): [(job_id, deadline), ...], 其中 job_id 是整数表示唯一标识符, deadline 表示相对起始时刻的时间戳 返回值: scheduled_jobs (List): 已经按 JF 排序后的任务 ID 列表 """ # 将输入转换成最小堆以便快速获取最早的截止日程 min_heap = [] for job_id, deadline in jobs: heapq.heappush(min_heap, (deadline, job_id)) result = [] while min_heap: _, current_job = heapq.heappop(min_heap) result.append(current_job) return result if __name__ == "__main__": sample_data = [ ("Task A", 3), ("Task B", 8), ("Task C", 5), ("Task D", 7), ("Task E", 9)] ordered_tasks = job_first_scheduler(sample_data) print(f"Scheduled order of tasks based on their deadlines is {ordered_tasks}") ``` 此代码片段展示了如何通过Python编程语言实现简单的基于JF原则的任务规划程序。这里采用了`heapq`模块提供的二叉堆数据结构来进行高效地管理检索即将到达限期的任务实例[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值