赞803 2022-07-06 16:48 采纳率: 33.3%
浏览 54
已结题

请问为什么结果全为0,逻辑有问题吗?怎么改?

#include<stdio.h>
#include
#include<string.h>
#define MAX 20
using namespace std;
struct NodeType //队列结点类型
{int no; //结点编号
int x[MAX];
int y[MAX];
int i; //步骤编号
int f1; //已经分配M1的执行时间
int f2; //已经分配M2的执行时间
int lb; //下界
bool operator<(const NodeType &s) const //重载<关系函数
{return lb>s.lb; //1b越小越优先出队
}
};
void bound(NodeType &e) //求结点e的限界值
{ int n,b[20];int sum=0;
for (int i=1;i<=n;i++) //扫描所有
if (e.y[i]==0) sum+=b[i];
//仅累计e.x中还没有分配的的b时间
e.lb=e.f1+sum;}
//问题表示
int INF;
int n=4;
int a[MAX]={0,5,12,4,8}; //M1上的执行时间,不用下标0的元素
int b[MAX]={0,6,2,14,7};
//求解结果表示
int bestf=INF; //存放最优调度时间
int bestx[MAX] ; //存放当前最佳调度
int total=1; //结点个数累计
int bfs() //求解流水调度问题
{ NodeType e,e1;
priority_queue qu; //定义优先队列
memset(e.x,0,sizeof(e.x)); //初始化根结点的x
memset(e.y,0,sizeof(e.y)); //初始化根结点的y
e.i=0; //根结点
e.f1=0;
e.f2=0;
bound(e);
e.no=total++;
qu.push(e); //根结点进队列
while (!qu.empty())
{ e=qu.top();qu.pop();//出队结点e
if (e.i==n) //达到叶子结点
{if (e.f2<bestf) //比较求最优解
{ bestf=e.f2;
for (int j1=1;j1<=n;j1++)
bestx[j1]=e.x[j1];
}
}
e1.i=e.i+1; //扩展分配下一个步骤的,对应结点e1
for (int j=1;j<=n;j++) //考虑所有的n个
{int i1;
if (e.y[j]==1) continue; //i是否已分配,若已分配,跳过
for (int i1=1;i1<=n;i1++) //复制e.x得到e1.x
e1.x[i1]=e.x[i1];
for(int i2=1;i2<=n;i2++) //复制e.y得到e1.y
e1.y[i2]=e.y[i2];
e1.x[e1.i]=j; //为第1步分配j
e1.y[j]=1; //表示j已经分配
e1.f1=e.f1+a[j]; //求f1=f1+a[j]
e1.f2=max(e.f2,e1.f1)+b[j];//求f[i+1]=max(f2[i],f1)+b[j]
bound(e1);
if (e1.f2<=bestf)
{ e1.no=total++; //结点编号增加1
qu.push(e1);
}
}
}
}
int main()
{ bfs();
printf("最优方案:\n");
for (int k=1;k<=n;k++)
printf(" 第%d步执行%d\n",k,bestx[k]);
printf(" 总时间=%d\n",bestf);
}

img

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-07-07 09:14
    关注
    
    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #define MAX 5 //20
    using namespace std;
    struct NodeType //队列结点类型
    {
        int no; //结点编号
        int x[MAX];
        int y[MAX];
        int i; //步骤编号
        int f1; //已经分配M1的执行时间
        int f2; //已经分配M2的执行时间
        int lb; //下界
        bool operator<(const NodeType &s) const //重载<关系函数
        {
            return lb>s.lb; //1b越小越优先出队
        }
    };
    void bound(NodeType &e) //求结点e的限界值
    {
        int n=4,b[20];int sum=0;
        for (int i=1;i<=n;i++) //扫描所有
            if (e.y[i]==0) sum+=b[i];
        //仅累计e.x中还没有分配的的b时间
        e.lb=e.f1+sum;
    }
    //问题表示
    int INF=10000;
    int n=4;
    int a[MAX]={0,5,12,4,8}; //M1上的执行时间,不用下标0的元素
    int b[MAX]={0,6,2,14,7};
    //求解结果表示
    int bestf=INF; //存放最优调度时间
    int bestx[MAX] ; //存放当前最佳调度
    int total=1; //结点个数累计
    void bfs() //求解流水调度问题
    {
        NodeType e,e1;
        priority_queue<NodeType> qu; //定义优先队列
        for (int i=0;i<MAX;i++) {
            e.x[i]=0;
            e.y[i]=0;
        }
        e.i=0; //根结点
        e.f1=0;
        e.f2=0;
        bound(e);
        e.no=total++;
        qu.push(e); //根结点进队列
        while (!qu.empty())
        {
            e=qu.top();qu.pop();//出队结点e
            if (e.i==n) //达到叶子结点
            {
                if (e.f2<bestf) //比较求最优解
                {
                    bestf=e.f2;
                    for (int j1=1;j1<=n;j1++)
                        bestx[j1]=e.x[j1];
                }
            }
            e1.i=e.i+1; //扩展分配下一个步骤的,对应结点e1
            for (int j=1;j<=n;j++) //考虑所有的n个
            {
                //int i1;
                if (e.y[j]==1) continue; //i是否已分配,若已分配,跳过
                for (int i1=1;i1<=n;i1++) //复制e.x得到e1.x
                    e1.x[i1]=e.x[i1];
                for(int i2=1;i2<=n;i2++) //复制e.y得到e1.y
                    e1.y[i2]=e.y[i2];
                e1.x[e1.i]=j; //为第1步分配j
                e1.y[j]=1; //表示j已经分配
                e1.f1=e.f1+a[j]; //求f1=f1+a[j]
                e1.f2=max(e.f2,e1.f1)+b[j];//求f[i+1]=max(f2[i],f1)+b[j]
                bound(e1);
                if (e1.f2<=bestf) {
                    e1.no=total++; //结点编号增加1
                    qu.push(e1);
                }
            }
        }
    }
    int main() {
        bfs();
        printf("最优方案:\n");
        for (int k=1;k<=n;k++)
            printf(" 第%d步执行%d\n",k,bestx[k]);
        printf(" 总时间=%d\n",bestf);
    }
    //最优方案:
    //1步执行3
    //2步执行1
    //3步执行4
    //4步执行2
    // 总时间=33
    //
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月7日
  • 已采纳回答 7月7日
  • 修改了问题 7月6日
  • 创建了问题 7月6日

悬赏问题

  • ¥15 xshell无法连接提示ssh服务器拒绝密码
  • ¥15 AT89C52单片机C语言关于串口通信的位操作
  • ¥20 需要步骤截图(标签-服务器|关键词-map)
  • ¥50 gki vendor hook
  • ¥15 灰狼算法和蚁群算法如何结合
  • ¥15 这是一个利用ESP32自带按键和LED控制的录像代码,编译过程出现问题,请解决并且指出错误,指导如何处理 ,协助完成代码并上传代码
  • ¥20 stm32f103,hal库 hal_usart_receive函数接收不到数据。
  • ¥20 求结果和代码,sas利用OPTEX程序和D-efficiency生成正交集
  • ¥50 adb连接不到手机是怎么回事?
  • ¥20 抓取数据时发生错误: get_mooncake_data() missing 1 required positional argument: 'driver'的问题,怎么改出正确的爬虫代码?