物流配送系统

实现一个物流配送系统的货物分配以及运输路线的数据结构实验。从一个始发站向周围用卡车运送货物,是运送路线尽量达到最优,运送的成本(卡车数量尽量少)尽量达到最小,利用计算机完成相应计算并给出相应的送货方案。将路径问题看成一个旅行商问题,用贪心策略先求出路径,然后继续用贪心策略装货物并用车配送。

#include <iostream>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int oo=1e9;
vector<int>tu[100];
vector<int>ww[100];
int tnum;///物品种类数目
struct thing
{
    char name[30];
    int l,w,h;
    void set(char p[],int ll,int ww,int hh)
    {
        strcpy(name,p);
        l=ll;
        w=ww;
        h=hh;
    }
} wp[100]; ///物品
struct hhh
{
    char name[30];
    int n;
    void set(char x[],int nn)
    {
        strcpy(name,x);
        n=nn;
    }
};///所需物品名称及数量
struct xixi
{
    int num;
    hhh a[100];
    xixi()
    {
        num=0;
    }
} xq[100]; ///各地需求的物品数目
int dd[100][100];///任意两点距离
char name[100][30];///起点名字,各地名字
struct hh
{
    char name[30];
    int n;///数目
    int des;///目的地
    void set(char x[],int nn,int dest)
    {
        strcpy(name,x);
        n=nn;
        des=dest;
    }
};

void floyd(int n)
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                dd[i][j]=min(dd[i][k]+dd[k][j],dd[i][j]);
}

void spfa(int s,int e,int n,int flag)///最短路记录路径
{
    int dist1[100];
    int pre[100]; ///前驱
    memset(pre,-1,sizeof(pre));
    queue<int>q;
    for(int i=0; i<=n; i++)
        dist1[i]=oo;
    bool vis[100]= {0};
    q.push(e);
    dist1[e]=0;
    while(!q.empty())
    {
        int h=q.front();
        q.pop();
        vis[h]=0;
        for(int i=0,l=tu[h].size(); i<l; i++)
        {
            int v=tu[h][i];
            int w=ww[h][i];
            if (dist1[v]>dist1[h]+w)
            {
                pre[v]=h;
                dist1[v]=dist1[h]+w;
                if (!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    int x=s;
    cout<<name[x];
    while(pre[x]!=-1)
    {
        x=pre[x];
        cout<<"--->"<<name[x];
    }
    if(flag)
        cout<<"回家"<<endl<<endl;
    else cout<<"卸";
}

void ssort(int &a,int &b,int &c)
{
    if(a>b)
        swap(a,b);
    if(b>c)
        swap(b,c);
    if(a>b)
        swap(a,b);
}

int findd(char x[])
{
    for(int i=1; i<=tnum; i++)
        if(!strcmp(x,wp[i].name))
            return i;
    return 0;
}

void solve(int n)
{
    int num=1;
    for(int i=1; i<=n; i++)
    {
        for(int j=0; j<xq[i].num; j++)
        {
            int tt=findd(xq[i].a[j].name);
            //cout<<i<<' '<<xq[i].a[j].name<<endl;
            int a1=wp[tt].h,a2=wp[tt].w,a3=wp[tt].l;
            int b1=wp[0].h,b2=wp[0].w,b3=wp[0].l;
            int x=(b1/a1)*(b2/a2)*(b3/a3),tem=0;
            //cout<<xq[i].a[j].name<<"   tt="<<tt<<endl;
            //cout<<"a1="<<a1<<"   a2="<<a2<<"   a3="<<a3<<endl;
            //cout<<"b1="<<b1<<"   b2="<<b2<<"   b3="<<b3<<endl;
            if(x)
                tem=xq[i].a[j].n/x;
            while(tem--)
            {
                cout<<"车"<<num++<<" 装"<<x<<"个去"<<name[i]<<"的"<<xq[i].a[j].name<<endl;
                cout<<"路径为:"<<endl;
                spfa(0,i,n,0);cout<<xq[i].a[j].name<<"  ";
                spfa(i,0,n,1);
            }
            if(x)
                xq[i].a[j].n%=x;
        }
    }
    floyd(n);
    bool vis[100]= {0};
    int nn=n;
    for(int i=1; i<=n; i++)
    {
        int flag=1;
        for(int j=0; j<xq[i].num; j++)
            if(xq[i].a[j].n)
            {
                flag=0;
                break;
            }
        if(flag)
            vis[i]=1,nn--;
    }
    int now=0,s=0;
    vector<int>tx;
    while(s++<nn)
    {
        int min0=oo,k=0;
        for(int i=1; i<=n; i++)
            if(!vis[i])
            {
                if(min0>dd[now][i])
                    min0=dd[now][i],k=i;
            }
        //cout<<now<<' '<<k<<endl;
        tx.push_back(k);
        vis[k]=1;
        now=k;
    }
    int l=tx.size(),i=0,bj=0,v=wp[0].h*wp[0].l*wp[0].w,sum[1000]= {0}; ///sum[i][0]记录车i总共装的货物,sum[i][j]记录车装的第j种货物的数量
    //for(int i=0;i<l;i++)
    //cout<<tx[i]<<' '<<endl;cout<<endl;
    vector<hh>che[1000];
    //cout<<"l="<<l<<endl;
    //int xxx=0;&&xxx++<=10
    //cout<<v<<endl<<endl;
    while(i<l)
    {
        //cout<<i<<"="<<tx[i]<<":"<<bj<<endl;
        int j=0;
        while(j<xq[tx[i]].num)
        {
            //cout<<j<<endl;
            if(xq[tx[i]].a[j].n<=0)
            {
                j++;
                continue;
            }
            int f=findd(xq[tx[i]].a[j].name),tv=wp[f].h*wp[f].l*wp[f].w;
            //cout<<tv<<endl;
            int t0=v-sum[bj],t1=t0/tv;
            if(t1>=1)
            {
                int min0=min(t1,xq[tx[i]].a[j].n);
                sum[bj]+=tv*min0;
                hh tt;
                tt.set(xq[tx[i]].a[j].name,min0,tx[i]);
                //cout<<xq[tx[i]].a[j].name<<' '<<t1<<":"<<xq[tx[i]].a[j].n<<' '<<tx[i]<<endl;
                che[bj].push_back(tt);
                if(xq[tx[i]].a[j].n<=t1)
                    j++;
                else
                    xq[tx[i]].a[j].n-=min0;
                // cout<<xq[tx[i]].a[j].name<<' '<<t1<<":"<<xq[tx[i]].a[j].n<<' '<<tx[i]<<endl<<endl;;
            }
            else
                bj++;
        }
        i++;
    }
    //cout<<bj<<endl;
    for(int i=0; i<=bj; i++)
    {
        //cout<<sum[i][0]<<":"<<endl;
        int l=che[i].size();
        /*for(int j=0; j<l; j++)
        cout<<che[i][j]<<' ';
        cout<<endl;
        for(int j=1; j<=l; j++)
            cout<<sum[i][j]<<' ';
        cout<<endl;
        */
        if(!l)break;
        cout<<"车"<<num++<<" 装";
        for(int j=0; j<l; j++)
            cout<<che[i][j].n<<"个去"<<name[che[i][j].des]<<"的"<<che[i][j].name<<"  ";
        cout<<endl<<"路径为:"<<endl;
        for(int j=0; j<l; j++)
        {
            if(j==0)
                spfa(0,che[i][j].des,n,0),cout<<che[i][j].name<<"  ";
            else
                spfa(che[i][j-1].des,che[i][j].des,n,0),cout<<che[i][j].name<<"  ";
        }
        spfa(che[i][l-1].des,0,n,1);
    }
}
bool cmp(thing a,thing b)
{
    return a.l*a.h*a.w<b.l*b.h*b.w;
}
int main()
{
    int n;
    cout<<"请输入目的地的数量"<<endl;
    cin>>n;
    cout<<"请输入起点名称"<<endl;
    cin>>name[0];///起点名称
    cout<<"请输入"<<n<<"个目的地的名称"<<endl;
    for(int i=1; i<=n; i++)
        cin>>name[i];///各点名称
    for(int i=0; i<=n; i++)
        for(int j=0; j<=n; j++)
            dd[i][j]=i==j?0:oo;
    cout<<"请输入两地之间的路径(输入两相同地点结束输入):"<<endl<<"示例输入:"<<name[0]<<' '<<name[1]<<" 12表示"<<name[0]<<"与"<<name[1]<<"距离为12"<<endl;
    while(1)
    {
        char t1[100],t2[100];
        int dis,tt1=0,tt2=0;
        cin>>t1>>t2>>dis;///各点之间距离
        if(!strcmp(t1,t2))break;
        if(strcmp(t1,name[0]))
            for(int i=1; i<=n; i++)
                if(!strcmp(name[i],t1))
                {
                    tt1=i;
                    break;
                }
        if(strcmp(t2,name[0]))
            for(int i=1; i<=n; i++)
                if(!strcmp(name[i],t2))
                {
                    tt2=i;
                    break;
                }
        tu[tt1].push_back(tt2);
        tu[tt2].push_back(tt1);
        ww[tt1].push_back(dis);
        ww[tt2].push_back(dis);
        dd[tt1][tt2]=dd[tt2][tt1]=dis;
    }
    cout<<"请输入所有需求的物品名称及对应的长宽高:(输入0 0 0 0结束输入)"<<endl;
    tnum=0;///物品种类数目
    while(1)
    {
        char tem[30];
        int l,w,h;
        cin>>tem>>l>>w>>h;
        if(!strcmp(tem,"0")&&!l&&!w&&!h)
            break;
        ssort(h,w,l);
        wp[++tnum].set(tem,l,w,h);
    }
    sort(wp+1,wp+tnum+1,cmp);
    for(int i=1; i<=n; i++)
    {
        cout<<"请输入"<<name[i]<<"需求的种类数目:"<<endl;
        cin>>xq[i].num;
        for(int j=0; j<xq[i].num; j++)
        {
            cout<<"请输入第"<<j+1<<"种物品的名称以及需求量(示例:pig 15)"<<endl;
            char tem[30];
            cin>>tem;
            int nnn;
            cin>>nnn;
            xq[i].a[j].set(tem,nnn);
        }
        cout<<endl;
    }
    int l,h,w;
    cout<<"请输入卡车的长,宽,高:"<<endl;
    cin>>l>>h>>w;///卡车容量
    ssort(h,w,l);
    char tem[30]= {"car"};
    wp[0].set(tem,l,w,h);
    cout<<endl;
    solve(n);
    return 0;
}

测试数据:

7

0

1

2

3

4

5

6

7

0 1 2

0 6 7

1 4 3

2 5 8

1 2 2

2 3 1

3 4 1

5 4 4

5 6 5

6 7 1

1 7 3

0 0 0

cup 1 4 6

cat 4 7 2

bag 7 3 1

flag 6 3 1

dog 4 4 2

pig 5 8 9

0 0 0 0

3

cup 4

dog 9

pig 10

2

dog 5

flag 3

3

bag 3

cup 2

flag 1

1

dog 1

2

cat 4

bag 2

1

pig 1

1

flag 1

3 9 18

时间: 2024-10-13 11:21:00

物流配送系统的相关文章

asp.net294物流配送系统

转载于我帮你毕业设计  QQ 97095639 需要详细资料和演示的可以去 www.hongtaibysj.com 查看 一.技术实现: 开发语言: asp.net, 框架: mvc ,模式:B/S 数据库 : sqlserver , 开发工具: vs sqlserver . 论文字数:1万左右. 二.功能实现: 物流管理系统是一个典型的数据库管理系统,系统由基本信息设置.订单管理.快件管理.库存管理.系统管理等模块组成,规划系统功能模块如下:     基本信息设置模块 该模块主要负责完成部门资

BOS项目 第11天(activiti工作流第三天,流程实例管理、项目中的用户和角色同步到activiti的用户和组表、设计物流配送流程、启动物流配送流程、组任务操作(查询、拾取)、个人任务操作(查询、办理))

BOS项目笔记 第11天 今天内容安排: 1.流程实例管理(查询.查看运行状态) 2.将bos系统中的用户和角色同步到activiti的用户和组表 3.设计物流配送流程 4.启动物流配送流程 5.组任务操作(查询.拾取) 6.个人任务操作(查询.办理) 1. 流程实例管理 1.1 查询流程实例列表 第一步:创建一个流程实例管理Action,提供list方法,查询流程实例列表数据 第二步:配置struts.xml 第三步:提供processinstance.jsp页面,展示列表数据 <s:iter

框架 day58 BOS项目练习(基于activiti物流配送流程,启动,查询,办理,项目知识点复习)

BOS项目笔记第12天 内容: 1.设计物流配送流程 2.启动物流配送流程 3.查询组任务.拾取组任务 4.查询个人任务.办理个人任务 1.    设计物流配送流程     物流配送流程 基于组任务进行任务分配.使用排他网关,分支选择使用流程变量实现 Activiti图形界面中: Process的Id值 对应流程定义表中的key值,可以用于启动最新版本的流程实例 任务节点中: General的 Id值对应任务表中的Task_def_key既 taskDefinitionKey值,用于定义项目中

使用Facade模式更新库存、确认订单、采取打折、确认支付、完成支付、物流配送

Facade模式对外提供了统一的接口,而隐藏了内部细节.在网上购物的场景中,当点击提交订单按钮,与此订单相关的库存.订单确认.折扣.确认支付.完成支付.物流配送等都要做相应的动作.本篇尝试使用Facade模式,把这些类似工作者单元的动作隐藏到一类中,只要点击提交订单,余下的事情一步到位: □ 关于库存 namespace ConsoleApplication1.Interfaces { public interface IInventory { void Update(int productId

NYOJ1367 物流配送

题目描述: 物流配送是物流活动中一种非单一的业务形式,它与物品流动.资金流动紧密结合.备货是配送的准备工作或基础工作,备货工作包括筹集货源.订货或购货.集货.进货及有关的质量检查.结算.交接等.配送的优势之一,就是可以集中用户的需求进行一定规模的备货.备货是决定配送成败的初期工作,如果备货成本太高,会大大降低配送的效益.配送中的储存有储备及暂存两种形态.配送储备是按一定时期的配送经营要求,形成的对配送的资源保证.这种类型的储备数量较大,储备结构也较完善,视货源及到货情况,可以有计划地确定周转储备

【开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_开篇目录_升鲜宝_15382353715

杭州生鲜配送系统_升鲜宝_SaaS全链路开源生鲜供应链管理系统_开篇目录_升鲜宝设计者余东升_15382353715 目录功能架构篇[开源版] 首先整套Saas系统包括 生鲜供应链管理运营平台后台(平台管理商家后台)[表示形成为:Web与APP.小程序] 生鲜供应链管理系统商家后台(商家管理后台)[表示形成为:Web与APP.小程序] 生鲜供应链管理系统供应商协同系统后台(供应商系统)[表示形成为:Web与APP.小程序] 生鲜供应链管理系统客户协同系统后台(客户订货系统)[表示形成为:Web与

MongoDB助力快速搭建物流订单系统

简介 快递物流系统里最常见的一种业务类型就是订单的查询和记录.订单的特点是随着递送过程,订单数据需要随时更新路径.数据结构上需要可以灵活应对,这点非常符合Document模型,并且MongoDB支持GIS功能,非常适用于MongoDB来支撑物流业务.并且MongoDB具备Sharding能力,而物流行业里订单比较独立,夸订单的操作很少,而对单订单来说,更新追加的操作会较多,比如再物流中转处理上.所以物流业务模型上与MongoDB非常的匹配.以下讲解一个虚拟的DEMO,可供参考,用到的特性: Mo

物流配送进程快递100查询接口

本插件使得您的网站可以从快递100接口获取相关配送公司的订单的具体进程,并在顾客登录网站时,查看订单详细信息时予以显示. 演示前台: http://coc020.chinaopencart.com 用户名: [email protected] 密码: demo 使用以上信息登录网站前台,查看订单信息,会看到相关快递100接口传送回来的快递进程.

物流配送管理系统(ssm,mysql)

项目演示视频观看地址:https://www.toutiao.com/i6811872614676431371/ 下载地址: 51document.cn 可以实现数据的图形展示.报表展示.报表的导出.打印. 1.仓储数据分析: 将2018年12月1日青岛仓出库量与 1. 仓储主题 仓库分为冷冻仓和冷藏仓,仓库地点至少三个,一个地点有多个冷冻仓和冷藏仓.时间为日.月.季度.年.商品为具体的生鲜产品.仓库设置仓库维度.时间维度.商品维度对数据进行查看. 实现数据的同比分析和环比分析. 除上图外,至少