2020年5月

29533-ifocuwl0k1.png

16986-8o7ggek7fda.png

该程序为客户的一个毕业设计,客户采用Winform作为毕业设计程序语言,网上没有类似的C#算法,大多都是matlab;

因客户迫切急于答辩,文中算法代码采用了序列化和反序列化,没有对其进行过多的优化,在专用线较多的时候,计算时长略微延长

(经测试,在专用线在10条的情况下,计算时间大概在10秒左右,专用线在4条的情况下,计算速度为毫秒级别;因为计算过程中,数据量是成阶乘级别上升)

核心算法如下:

public partial class FrmBestTakeSendOrder : Form
{
    /// <summary>
    /// 计算资料表,
    /// </summary>
    List<TimeTableEntity> timeTableEntityList = new List<TimeTableEntity>()
    {
        //new TimeTableEntity(){Num = 1, TakeTime = 20,WorkTime = 60 },
    };

    /// <summary>
    /// 计算
    /// </summary>
    public void Calculate()
    {

        // 最大时间
        var numMax = timeTableEntityList.OrderByDescending(t => t.WorkTime).First().Num;
        // 创建送车顺序集合
        List<SequenceEntity> SequenceEntityList = timeTableEntityList.Select(t =>
        {
            return new SequenceEntity()
            {
                Number = t.Num,
            };
        }).ToList();
        // 只保留最大排列
        List<SequenceEntity[]> lst_Permutation = PermutationAndCombination<SequenceEntity>.GetPermutation(SequenceEntityList.ToArray(), SequenceEntityList.Count()).Where(t => t[0].Number == numMax).ToList();
        // 通过排列获取方案集合
        var planEntityList = lst_Permutation.Select((t, index) =>
        {
            return new PlanEntity()
            {
                Num = index,
                SendCarSequence = t.ToList()
            };
        }).ToList();

        // 
        foreach (var item in planEntityList)
        {
            item.SendCarSequence = GetSendCar(item.SendCarSequence);
            item.TakeCarSequence = GetRecCar(item.SendCarSequence);
            item.TakeCarLoadTimeMax = item.TakeCarSequence.Select(t => t.LackTime).Max();
        }

        // 方案升序输出
        // GoodPlanOrder(planEntityList);

        // 最优方案输出
        GoodPlan(planEntityList);
    }

    /// <summary>
    /// 最优方案输出
    /// </summary>
    /// <param name="planEntityList"></param>
    private void GoodPlan(List<PlanEntity> planEntityList)
    {
        var goodTime = (from p in planEntityList
                        orderby p.TakeCarLoadTimeMax
                        group p by p.TakeCarLoadTimeMax into n
                        select n.Key).First();

        var goodPlan = (from p in planEntityList
                        where p.TakeCarLoadTimeMax == goodTime
                        select p).ToList();
        foreach (var item in goodPlan)
        {
            var sendCarNum = string.Join(",", item.SendCarSequence.Select(t => t.Number).ToArray());
            var takeCarNum = string.Join(",", item.TakeCarSequence.Select(t => t.Number).ToArray());

            // Console.Write($"送车顺序:{sendCarNum} 取车顺序:{takeCarNum}  T等:{item.TakeCarLoadTimeMax}分钟 \n\n");
            var tLoadTime = item.TakeCarLoadTimeMax < 0 ? 0 : item.TakeCarLoadTimeMax;

            richTextBox1.AppendText($"送车顺序:{sendCarNum} 取车顺序:{takeCarNum}  T等:{tLoadTime}分钟 \n\n");
        }
    }

    /// <summary>
    /// 方案升序输出
    /// </summary>
    /// <param name="planEntityList"></param>
    /// <returns></returns>
    private List<PlanEntity> GoodPlanOrder(List<PlanEntity> planEntityList)
    {
        var goodPlan = planEntityList.OrderBy(t => t.TakeCarLoadTimeMax).ToList();

        foreach (var item in goodPlan)
        {
            var sendCarNum = string.Join(",", item.SendCarSequence.Select(t => t.Number).ToArray());
            var takeCarNum = string.Join(",", item.TakeCarSequence.Select(t => t.Number).ToArray());

            Console.Write($"送车顺序:{sendCarNum} 取车顺序:{takeCarNum}  T等:{item.TakeCarLoadTimeMax}分钟 \n\n");
        }

        return goodPlan;
    }

    /// <summary>
    /// 计算送车顺序的创造的时间与时间差值
    /// </summary>
    /// <param name="sendCarList"></param>
    /// <returns></returns>
    public List<SequenceEntity> GetSendCar(List<SequenceEntity> sendCarList)
    {
        var retSendCarList = sendCarList.Clone().ToList();
        for (int i = 0; i < retSendCarList.Count(); i++)
        {
            var sendCar = retSendCarList[i];
            for (int j = i; j < retSendCarList.Count(); j++)
            {
                sendCar.TotalTime += timeTableEntityList.Where(t => t.Num == retSendCarList[j].Number).First().TakeTime;
            }
            sendCar.LackTime = timeTableEntityList.Where(t => t.Num == sendCar.Number).First().WorkTime - sendCar.TotalTime;
        }
        return retSendCarList;
    }

    /// <summary>
    /// 获取取车顺序集合
    /// </summary>
    /// <param name="sendCar">【送车循序】集合获取</param>
    /// <returns></returns>
    private List<SequenceEntity> GetRecCar(List<SequenceEntity> sendCar)
    {
        var retRecCarList = sendCar.OrderBy(t => t.LackTime).ToList();

        for (int i = 0; i < retRecCarList.Count(); i++)
        {
            var retRecCar = retRecCarList[i];

            if (i == 0)
            {
                int lackTimePoor = sendCar.Where(t => t.Number == retRecCar.Number).First().LackTime;
                retRecCar.TotalTime = 0;
                retRecCar.LackTime = lackTimePoor - 0;
            }
            else
            {
                int totalTimePoor = 0;
                for (int j = i; j > 0; j--)
                {
                    var carID = retRecCarList[j - 1].Number;
                    totalTimePoor += timeTableEntityList.Where(t => t.Num == carID).First().TakeTime;
                }
                int lackTimePoor = sendCar.Where(t => t.Number == retRecCar.Number).First().LackTime;

                retRecCar.TotalTime = totalTimePoor;
                retRecCar.LackTime = lackTimePoor - totalTimePoor;
            }
        }

        return retRecCarList;
    }
}



博主代接毕业设计等各种程序软件开发,论文代写,欢迎骚扰
QQ:1063823095

参考:
http://www.doc88.com/p-8681271008948.html
https://www.icourse163.org/learn/SWJTU-1206451818?tid=1452035457#/learn/content?type=detail&id=1220714539&cid=1230369305
https://blog.csdn.net/jtys2016/article/details/90147138

1.abstract 修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

(1)抽象类具有以下特性:

1) 抽象类不能实例化。
2) 抽象类可以包含抽象方法和抽象访问器。
3) 不能用 sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。
4) 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
5) 在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。

- 阅读剩余部分 -

public class HeartBeatMessageHandle : IMessageHandle
{
    public static Action<string> testChangeDelegate;

    // 该方法为接收消息后自动执行的方法,与FrmMain处于不同的线程中
    public void process(string message)
    {
        testChangeDelegate?.Invoke(message);
    }
}


public partial class FrmMain : Form
{
    public FrmMain()
    {
        HeartBeatMessageHandle.testChangeDelegate += testChangeDelegateFun;
    }

    void testChangeDelegateFun(string val)
    {
        // 创建一个委托,由控件所在的线程来执行该委托,避免跨线程访问控件
        Action<string> actionDelegate = (args) =>
        {
            // 在这里面执行想要的动作,控件操作等,调用具体的方法即可
            //  (args);
        };
        // 执行委托
        this.Invoke(actionDelegate, val);
    }
}