通过任务示例了解遗传算法的算法

时间:2018-07-21 08:14:32

标签: c# algorithm genetic-algorithm

  

您与一家公司合作交付货物,该公司每天使用   收费路。沿10个付款点付款。的   公司的驾驶员需要通过支付   每点的佣金。困难在于   根据规则,委员会只能支付一个硬币。万一   高于票价,驾驶员不会收到   变化并且担心。相反,如果硬币没有完全   支付车费,则您的公司有债务。同时,   在每一点的票价在末尾绝对是任意的   天,范围从1到10美分(含)之间。它是   还知道几个支付点可以提供相同的票价,并且   通过所有点的旅行总数将始终大于   55戈比。每位驾驶员在旅途开始时获得10分   硬币,每分钱一尊严的硬币,一枚价值两戈比的硬币,一枚   -三个,依此类推,最多十个科比(含)。使用遗传算法,您需要找到一种旅行支付策略,其中   旅程结束时的驾驶员债务将降至最低。算法   将在每天的开始举行,并使用新的,最新的数据   确定支付点的佣金大小以获取新的   司机策略。

     

传入参数:十个从1到10的任意数字的数组,   代表每个项目的佣金大小。号码   在数组中可以重复,并且它们的总和将始终更大   大于55。

     

输出:十个数字的数组,代表硬币的优点   在每个点上按最佳付款顺序排列(因此   所有付款后公司的债务很小)。

因为参与写作,所以我忘记了其中一个条件,这不是找到免费乘车,而是找到最佳选择,因为免费乘车

  

数组中的数字可以重复,它们的总和始终为   大于55。

是不可能的。我认为我走在正确的道路上,但是选择需要更改,例如生成驱动程序。这是我的代码:

namespace ConsoleApplication16
    {
        class Program
        {
            static void Main(string[] args)
            {
        Random rand = new Random();
        bool weNeedContinue = true;          
        int[] propuski1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        int[] bestWay = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        int[] propuski = PropuskiPrice(propuski1);
        int[] car = {0,0,0,0,0,0,0,0,0,0};
        GenerateCar(car,bestWay);
        int[] moneyChange = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };                    
        while(weNeedContinue == true)
        {
            GettingBest(moneyChange, car, propuski, bestWay);
            GenerateCar(car, bestWay);

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("luchshii put " + bestWay[i]);
            }


            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(" car " + car[i]);
                Console.WriteLine(" propusk " + propuski[i]);
            }
            Console.ReadKey();
            ContinueOrNot(bestWay, weNeedContinue);
        }          

    }

    public static int[] PropuskiPrice(int[] a)
    {
        Random rand = new Random();
        int summa = 0;
        for (var i = 0; i < a.Length; i++)
        {
            a[i] = rand.Next(10) + 1;
            summa += a[i];
            if (i == 9 && summa <= 55)
            {
                PropuskiPrice(a);
            }
        }
        return a;
    }

    /////////////////////////////////////////////////////
    ////Создаем водителя/////////////////////////////////
    /////////////////////////////////////////////////////


    public static int[]  GenerateCar(int[] a,int[] c)
    {
        Random rand = new Random();
        for (int i = 0; i < a.Length; i++)
        {
            if(c[i] != 0)
            {
                a[i] = c[i];
                continue;
            }
            int b = rand.Next(1, 11);
            if (!a.Contains(b))
            {
                a[i] = b;
            }
            else
                i--;
            if(i == a.Length - 1 )
            {

            }
        }
        return a;
    }

    ////////////////////////////////////////////////////
    ////INIT////////////////////////////////////////////
    ////////////////////////////////////////////////////

    static void GettingBest(int[] change,int[] car,int[] propuski,int[] bestOne)
    {
        for (int i = 0; i< 10; i++)
            {
                change[i] = car[i] - propuski[i];
                if (change[i] == 0)
                {
                    bestOne[i] = car[i];
                /*Console.WriteLine("Карман" + car[i]);
                Console.WriteLine("Цена" + propuski[i]);
                Console.WriteLine("Лучший путь"+ bestOne[i]);*/
                }
            }
        for (int i = 0; i < 10; i++)
        {
            if (change[i] == -1 || change[i] == 1)
            {
                bestOne[i] = car[i];
                Console.WriteLine(bestOne[i]);
            }
        }
        for (int i = 0; i < 10; i++)
        {
            if (change[i] == -2 || change[i] == 2)
            {
                bestOne[i] = car[i];
                Console.WriteLine(bestOne[i]);
            }
        }
        for (int i = 0; i < 10; i++)
        {
            if (change[i] == -3 || change[i] == 3)
            {
                bestOne[i] = car[i];
                Console.WriteLine(bestOne[i]);
            }
        }
    }

    ///////////////////////////////////////////////////
    ////Prodoljat ili net////////////////////////////// 
    ///////////////////////////////////////////////////


    static void ContinueOrNot(int[] bestWay,bool weNeedContinue)
    {
        for (int i = 0; i < 10; i++)
        {
            if (bestWay[i] != 0)
            {
                weNeedContinue = true;
                //break;
            }
            else
            {
                weNeedContinue = false;
            }
        }
    }

}
    }

PropuskiPrice(int [] a)方法本身是在程序启动时为跳过生成价格。

GenerateCar(int [] a,int [] c)-创建驱动程序,这实际上是我要更改的方法,该方法不符合完全选择的要求,它将只选择或多或少合适的值。

GettingBest(int [] change,int [] car,int [] propuski,int [] bestOne)-也不能满足完全选择的要求,它只选择那些比较合适。

ContinueOrNot(int [] bestWay,bool weNeedContinue)-检查是否连续。

总的来说,我处于死胡同。如果有人对如何使我需要的东西眼花will乱,将不胜感激。

P.S。 (我不要求为我写所有东西,我只要求看一下并告诉根目录中要更改的逻辑,这些逻辑本来就是你需要的)

P.S.s。 (我当然不介意有人特别说过要重拍(=   )

P.S.s.s。 (我恳请您不要评估“代码质量”,我会认真研究2周,如果有人告诉我如何优化代码并查看此示例,我将不胜感激!)

0 个答案:

没有答案