請麻煩高手進來幫看一下SJF with Preemptive 的代碼是哪裡出的問題!!

毋暝熊熊 2008-12-24 09:37:32
#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;
void PSJF(int data[100][4],int n)
{ //data[][] is input array
while( true ) //Bubble sort
{ int t=0;
for ( int i=0;i<n-1;++i )
{ if (data[i][2]>data[i+1][2] )//Arrival Time 前項>後項就交換
{ swap(data[i][3],data[i+1][3]);
swap(data[i][2],data[i+1][2]);
swap(data[i][1],data[i+1][1]);
swap(data[i][0],data[i+1][0]);
++t;
}
}
if ( t==0) break;//若無交換即退出
}
int tt=data[0][2];
int time=data[0][2];//目前時間
int c=0,j=0,m=0,a,b=1;
int ready[100][4];//ready array
int rdata[100][4];//running array

for (int i=0;i<n;i++)
{ tt+=data[i][1]; //last finish time
}

while (time<=tt)
{
while (m<n)
{ if (data[m][2]==time )//將ready process放入 ready array
{ ready[c][3]=data[m][3];
ready[c][2]=data[m][2];
ready[c][1]=data[m][1];
ready[c][0]=data[m][0];
c++;
m++;
}
}
if (c>1)//ready array 內有2個以上的process
{ for (a=0;a<c-1;a++)//比較剩餘Burst Time 較少的放到前面
{ for (int k=a+1;k<c;k++)
{ if (ready[a][1]>ready[k][1] && ready[a][2]==ready[k][2])
{ swap(ready[a][3],ready[k][3]);
swap(ready[a][2],ready[k][2]);
swap(ready[a][1],ready[k][1]);
swap(ready[a][0],ready[k][0]);
}
}
}
}
//將ready array的第一個內容放入running array
rdata[j][0]=ready[0][0]; //process id 放入
rdata[j][2]=ready[0][2]; //process start time 放入
rdata[j][3]=ready[0][3]; //process Priority放入
time=data[b][2]; //目前時間
b++;
rdata[j][1]=time-rdata[j][2];//已執行的Burst Time
ready[0][1]-=rdata[j][1];//剩餘Burst Time

if (rdata[j][0]!=ready[0][0])
{ ready[0][2]=time;//Arrival Time 改變
j++;
}
for (int i=0;i<c-1;i++) //完成schedule 的process 從ready array 移除.
{ if (ready[i][1]==0)
{ ready[i][3]=ready[i+1][3];
ready[i][2]=ready[i+1][2];
ready[i][1]=ready[i+1][1];
ready[i][0]=ready[i+1][0];
}
}
for (int i=0;i<4;i++) ready[c-1][i]=0;
if (ready[0][1]==0 && ready[1][1]==0) break; //ready array沒有process時離開迴圈



}
for (int i=0;i<j;i++)
{ for (int z=0;z<4;z++)
{ cout<<rdata[i][z]<<" ";
}
cout<<endl;
}
}
int main ()
{
int data[100][4],n,m,a=1;
char s;
while (a=1)
{
cout<<"CPU Scheduling:"<<endl;
cout<<"-----------------------------------------------"<<endl;
cout<<"(1)First-Come, First-Served(FCFS)"<<endl;
cout<<"(2)Non-Preemptive Shortest-Job-First(Non-Preemptive SJF)"<<endl;
cout<<"(3)Preemptive Shortest-Job-First(Preemptive SJF)"<<endl;
cout<<"(4)Non-Preemptive Priority"<<endl;
cout<<"(5)Preemptive Priority"<<endl;
cout<<"(6)Round-Robin(RR)"<<endl;
cout<<"-----------------------------------------------"<<endl;
cout<<"Select CPU Scheduling Method Number: ";
cin>>m;
cout<<"Input number of processes: ";
cin>>n;
int tq;
if(m==6)
{ cout<<"Time Quantum: ";
cin>>tq;//Time Quantum
}

for (int i=0;i<n;i++)
{ data[i][0]=i+1;//process id

cout<<"P"<<data[i][0]<<"'s Burst Time: ";
cin>>data[i][1]; //Burst Time
if (m!=6)
{ cout<<"P"<<data[i][0]<<"'s Arrival Time: ";
cin>>data[i][2]; //Arrival Time
}
else data[i][2]=0;
if (m==4||m==5 )
{ cout<<"P"<<data[i][0]<<"'s Priority: ";
cin>>data[i][3]; //Priority
}
else data[i][3]=0;
}

if(m==1) fcfs(data,n);
else if(m==2) NPSJF(data,n);
else if(m==3) PSJF(data,n);
else if(m==4) NPP(data,n);
else if(m==5) PP(data,n);
else if(m==6) RR(data,n,tq);
cout<<endl;
cout<<"Again Schedule? (y/n)";
cin>>s;
if (s=='Y' || s=='y') a=1;
if (s=='N' || s=='n') exit(0);
cout<<endl;
}

system("pause");
return 0;
}

目前Compiler後,完全沒有顯示出結果..
麻煩高手幫看一下是哪邊的問題...感激不盡!!
...全文
137 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
毋暝熊熊 2008-12-24
  • 打赏
  • 举报
回复
void PSJF(int data[100][4],int n)
{ //data[][] is input array
while( true ) //Bubble sort
{ int t=0;
for ( int i=0;i <n-1;++i )
{ if (data[i][2]>data[i+1][2] ) //Arrival Time 前项>后项就交换
{ swap(data[i][3],data[i+1][3]);
swap(data[i][2],data[i+1][2]);
swap(data[i][1],data[i+1][1]);
swap(data[i][0],data[i+1][0]);
++t;
}
if (data[i][2]==data[i+1][2] && data[i][1]>data[i+1][1])//Arrival Time 相同且Burst time 前项比后项大,就交换
{ swap(data[i][3],data[i+1][3]);
swap(data[i][2],data[i+1][2]);
swap(data[i][1],data[i+1][1]);
swap(data[i][0],data[i+1][0]);
++t;
}
}
if ( t==0) break; //若无交换即退出
}
int tt=data[0][2];
int time=data[0][2]; //目前时间
int c=0,j=0,m=0,a,b=1;
int ready[100][4]; //ready array
int rdata[100][4]; //running array

for (int i=0;i <n;i++)
{ tt+=data[i][1]; //last finish time
}

while (time <=tt)
{
while (m <n)
{ if (data[m][2]==time ) //将ready process放入 ready array
{ ready[c][3]=data[m][3];
ready[c][2]=data[m][2];
ready[c][1]=data[m][1];
ready[c][0]=data[m][0];
c++;
m++;
}
}
if (c>1) //ready array 内有2个以上的process
{ for (a=0;a <c-1;a++) //比较剩余Burst Time 较少的放到前面
{ for (int k=a+1;k <c;k++)
{ if (ready[a][1]>ready[k][1] && ready[a][2]==ready[k][2])
{ swap(ready[a][3],ready[k][3]);
swap(ready[a][2],ready[k][2]);
swap(ready[a][1],ready[k][1]);
swap(ready[a][0],ready[k][0]);
}
}
}
}
//将ready array的第一个内容放入running array
rdata[j][0]=ready[0][0]; //process id 放入
rdata[j][2]=ready[0][2]; //process start time 放入
rdata[j][3]=ready[0][3]; //process Priority放入
time=data[b][2]; //目前时间
b++;
rdata[j][1]=time-rdata[j][2]; //已执行的Burst Time
ready[0][1]-=rdata[j][1]; //剩余Burst Time

if (rdata[j][0]!=ready[0][0])
{ ready[0][2]=time; //ready array中process Arrival Time 改变
j++;
}
for (int i=0;i <c-1;i++) //完成schedule 的process 从ready array 移除.
{ if (ready[i][1]==0)
{ ready[i][3]=ready[i+1][3];
ready[i][2]=ready[i+1][2];
ready[i][1]=ready[i+1][1];
ready[i][0]=ready[i+1][0];
}
}
for (int i=0;i <4;i++) ready[c-1][i]=0;
if (ready[0][1]==0 && ready[1][1]==0) break; //ready array没有process时离开循环



}
for (int i=0;i <j;i++)
{ for (int z=0;z <4;z++)
{ cout<<rdata[i][z] < <" ";
}
cout<<endl;
}
}
思路:
1.先依Arrival Time排序process (By Bubble sort)
2.若Arrival Time相同则依Burst time小的放前面,若都相同则process id小的放前面
3.排好后,将目前时间设为第一个process的Arrival Time --(time)
4.计算最后的完成时间 --(tt)
5.开始模拟schedule
6.当目前时间为某个/些process的Arrival Time放入ready array
7.若ready array中有2个以上的process时,Burst time小的移到最前面
8.将ready array中第一个process放人running array-内容包括其process id /Arrival Time/Priority,Burst time另做处理.
9.将目前时间(time)增加为input array中的下一个process的Arrival Time
10.放入running array中process 的Burst time (处理过的)
11.调整ready array中该process的剩余Burst time,不为0就修改Arrival Time
12.若process剩余Burst time为0就从ready array 中移除,回到步骤6


毋暝熊熊 2008-12-24
  • 打赏
  • 举报
回复
如何把代码发得漂亮一点= =?
没有很常上论坛真的不知如何美化CODE = =a..囧rz


我帖子上的程序已经是PSJF而需要的内容
其它5个副程序不需要另外贴吧= =!
FCFS
Non-Preemptive SJF
Non-Preemptive Priority
Preemptive Priority
Round-Robin

我现在有问题的是PSJF的部分
要改应该只需改PSJF这个副程序的内容而已吧..!

目前是只需要rdata[][] 这个running array 的内容是正确的OK了..

麻烦高手指点一下..问题所在!!..
感激不尽!!

matrixdwy 2008-12-24
  • 打赏
  • 举报
回复
希望LZ能把代码发得漂亮点
xiaoyisnail 2008-12-24
  • 打赏
  • 举报
回复
代码没帖全吧
毋暝熊熊 2008-12-24
  • 打赏
  • 举报
回复
PS CODE中
cout<<XXX; '<<'中實際上是沒有空格的..只是帖子發出來就變成那樣= =
内容概要:本文针对考虑算力负荷时空迁移特性的多微电网与共享储能系统的协同优化调度问题展开研究,并提供了完整的Matlab代码实现。研究构建了融合算力负荷动态迁移特征的数学优化模型,通过引入共享储能机制,实现多微电网间的能量互济与资源协同,有效提升系统对分布式能源波动性和负荷不确定性的适应能力。文中采用先进的优化算法求解该调度模型,重点解决了算力任务在时空维度上的灵活调配与电力供需平衡之间的耦合关系,旨在提高综合能源系统的运行经济性、可靠性与灵活性。所提的方法为未来能源互联网背景下电-算协同管理提供了理论支持与技术路径。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的科研人员、高校研究生,尤其适用于从事微电网运行、共享储能配置、综合能源系统优化以及电-算融合等领域研究的专业技术人员。; 使用场景及目标:①开展多微电网与共享储能系统的协同调度策略设计与仿真验证;②支撑高比例可再生能源接入下的新型电力系统优化运行研究;③为考虑算力迁移的数据中心与电网协同调度提供建模与算法参考;④作为高水平学术论文撰写或学位课题研究的技术支撑与代码复现平台。; 阅读建议:建议读者结合Matlab代码与相关学术文献深入研读,重点关注目标函数构建、约束条件设定及求解器调用逻辑,可在现有模型基础上拓展多时间尺度优化、不确定性建模(如鲁棒优化、随机规划)或加入实际工程约束进行二次开发与深化研究。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧