您与一家公司合作交付货物,该公司每天使用 收费路。沿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周,如果有人告诉我如何优化代码并查看此示例,我将不胜感激!)