回溯类——零件加工_最优加工顺序

using System;
using System.Collections.Generic;

namespace 零件加工_最优加工顺序
{
    //零件 T1、T2分别表示在两台加工机器上需要的时间
    class Node
    {
        public int T1 { get; set; }
        public int T2 { get; set; }

        public Node(int t1, int t2)
        {
            T1 = t1;
            T2 = t2;
        }
    }

    class Program
    {
        public static int Count = 6;            //需要加工的零件数量
        public static List<Node> Nodes = new List<Node>();    //零件集合
        public static int TBest = 999999;                 //最优加工的时间
        public static int TOne = 0;                 //机器一加工的时间
        public static int TTwo = 0;                 //机器二加工的时间
        public static int[] X = new int[Count];      //加工顺序
        public static int[] BestX = new int[Count];     //最优加工顺序
        static void Main(string[] args)
        {
            for (int i = 0; i < Count; i++)
                X[i] = i;
            Nodes.Add(new Node(5, 7));
            Nodes.Add(new Node(1, 2));
            Nodes.Add(new Node(8, 2));
            Nodes.Add(new Node(5, 4));
            Nodes.Add(new Node(3, 7));
            Nodes.Add(new Node(4, 4));

            BackTrack(0);

            Console.Write("最优加工顺序为:");
            foreach(var v in BestX)
                Console.Write((v+1)+"   ");

            Console.WriteLine();
            Console.WriteLine("最优加工时间为:"+TBest);

            Console.ReadKey();
        }

        static void BackTrack(int t)
        {
            if (t >= Count)       //表示已经得到一个解
            {
                for (int i = 0; i < Count; i++)
                    BestX[i] = X[i];
                TBest = TTwo;
                return;
            }
            else
            {
                for (int i = t; i < Count; i++)    
                {
                    TOne += Nodes[X[i]].T1;
                    int temp = TTwo;
                    TTwo = Math.Max(TOne, TTwo) + Nodes[X[i]].T2;
                    if (TTwo < TBest)
                    {
                        int flag = X[t];
                        X[t] = X[i];
                        X[i] = flag;

                        BackTrack(t + 1);

                        flag = X[t];
                        X[t] = X[i];
                        X[i] = flag;
                    }
                    TOne -= Nodes[X[i]].T1;
                    TTwo = temp;
                }
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值