Guest User

Untitled

a guest
Jan 20th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.66 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace ConsoleApp6
  6. {
  7. class Program
  8. {
  9.  
  10. /*
  11.  
  12. 程序由规划器(Main),分配器(DoTest)和数据结构组成。
  13. 规划器目前是直接手写的常量,是自己试出来的,具体规律尚未发现,需要改成程序自动计算的,
  14.  
  15.  
  16. 我有N个master和N个worker
  17.  
  18. worker有两种状态,可用和不可用(worker.isWorking)
  19.  
  20. master可以被指定到worker上,并且设置优先级(通过EffectToInfo的worker和priority)
  21.  
  22. 一个master会被指定到多个worker(通过master.effectList)
  23.  
  24. 然后分配器会根据master对worker的优先级,以及worker是否可用来把master分配给worker(具体实现参考DoTest)
  25.  
  26. 目标:给出任意masterCount,workerCount的情况下,计算出master对应的每个worker的优先级
  27. 并且能使用这套优先级,在任意一个或多个worker离线的情况下,master都能被dotest平均分配到每一个worker上
  28.  
  29. 需要注意:
  30. 1.规划器并不知道Worker是否离线,只知道master和worker的数量(也就是worker.isWorking不能被你的算法访问)
  31. 2.平均分配是指可以整除的情况下,比如说8个master分配到2个worker,就是4,4,如果不能被整除,比如说8个master分配到3个worker,3,3,2是可以接受的,但是比如说1,0,3、2,2,0、3,4,1就肯定错了
  32. 3.实现平均分配的唯一办法就是设置优先级,也就是通过算法自动调用master[xxx].effectList.Add(new EffectToInfo(xxxx, workers[xxxx]));,其他地方不应修改
  33. 4.优先级每个Master对每个worker的优先级,只能设置一次,不能在中途重新设置优先级(比如说在worker.isWorking改变后重新计算优先级都是不可以的),我已经提供了一个在master =8,worker=3的情况下的正确例子。
  34.  
  35.  
  36. */
  37.  
  38.  
  39. //数据结构
  40. public class EffectToInfo
  41. {
  42. public int priority = 0;
  43. public Worker Worker;
  44.  
  45. public EffectToInfo(int priority, Worker worker)
  46. {
  47. this.priority = priority;
  48. this.Worker = worker;
  49. }
  50. }
  51. static int masterCount = 0;
  52. static int workerCount = 0;
  53.  
  54. static List<Master> master = new List<Master>();
  55. static List<Worker> workers = new List<Worker>();
  56.  
  57. public class Master
  58. {
  59. public int name;
  60. public List<EffectToInfo> effectList = new List<EffectToInfo>();
  61. public Worker currentWorker;
  62.  
  63. public Master(int index)
  64. {
  65. name = index;
  66. }
  67. }
  68. public class Worker
  69. {
  70. public int name;
  71. public bool isWorking = true;
  72.  
  73. public Worker(int index)
  74. {
  75. name = index;
  76. }
  77. }
  78.  
  79. static void TestDisableWorker(int Index)
  80. {
  81. workers[Index].isWorking = false;
  82. }
  83. static void TestEnableWorker(int Index)
  84. {
  85. workers[Index].isWorking = true;
  86. }
  87.  
  88. static void OnlineAllWorker()
  89. {
  90. foreach (var worker in workers)
  91. {
  92. worker.isWorking = true;
  93. }
  94. }
  95.  
  96.  
  97. static void TestScript()
  98. {
  99. //主测试逻辑
  100. Console.WriteLine("masterCount:" + masterCount + " workerCount:" + workerCount);
  101.  
  102. int OkTest = 0;
  103. int FailedTest = 0;
  104.  
  105.  
  106. var workerStatusTarget = "";
  107.  
  108. for (int i = 0; i < workerCount; i++)
  109. {
  110. workerStatusTarget += "1";
  111. }
  112.  
  113. int StatusCount = Convert.ToInt32(workerStatusTarget, 2) + 1;
  114. for (int i = 1; i < StatusCount; i++)
  115. {
  116. OnlineAllWorker();
  117. var currentStateString =Convert.ToString(i, 2);
  118.  
  119. int zeroToFill = workerCount - currentStateString.Length;
  120. for (int j = 0; j < zeroToFill; j++)
  121. {
  122. currentStateString = "0" + currentStateString;
  123. }
  124.  
  125.  
  126. int CurrentLocation = currentStateString.Length - 1;
  127. foreach (var singleStateChar in currentStateString.ToCharArray().Reverse())
  128. {
  129. if (singleStateChar == '0')
  130. {
  131. TestDisableWorker(CurrentLocation);
  132. }
  133. else
  134. {
  135. TestEnableWorker(CurrentLocation);
  136. }
  137.  
  138. CurrentLocation--;
  139. }
  140.  
  141. if (DoTest())
  142. OkTest++;
  143. else
  144. {
  145. FailedTest++;
  146. }
  147. }
  148.  
  149.  
  150. //for (int i = 0; i <= workerCount; i++)
  151. //{
  152.  
  153. // int workerToDisable = workerCount - i;
  154. // if (workerToDisable != workerCount)
  155. // {
  156.  
  157. // if (DoTest())
  158. // OkTest++;
  159. // else
  160. // {
  161. // FailedTest++;
  162. // }
  163. // TestDisableWorker(workerToDisable);
  164. // }
  165. //}
  166. Console.WriteLine("测试结果: 成功:" + OkTest +" 失败:" + FailedTest);
  167. }
  168.  
  169.  
  170.  
  171. static bool DoTest()
  172. {
  173. //测试代码,不应修改
  174.  
  175. int maxCount = 0;
  176. int minCount = 9999;
  177. int totalCount = 0;
  178. Console.WriteLine("");
  179. Console.WriteLine("---------测试----------");
  180.  
  181.  
  182. master.ForEach((master) =>
  183. {
  184. var workersByPri = master.effectList.Where(effect=>effect.Worker.isWorking).OrderByDescending((effect) => effect.priority).ToList();
  185.  
  186. master.currentWorker = workersByPri.FirstOrDefault()?.Worker;
  187. });
  188.  
  189. Console.WriteLine("分配情况:");
  190. workers.ForEach((worker) =>
  191. {
  192.  
  193. if (worker.isWorking)
  194. {
  195. var workermasters = master.Where((master) => master?.currentWorker?.name == worker.name);
  196. Console.WriteLine("");
  197.  
  198. Console.WriteLine("Worker:" + worker.name + ":master数量:" + workermasters.Count() );
  199. totalCount += workermasters.Count();
  200.  
  201. maxCount = Math.Max(workermasters.Count(), maxCount);
  202. minCount = Math.Min(workermasters.Count(), minCount);
  203.  
  204.  
  205. foreach (var workermaster in workermasters)
  206. {
  207. Console.Write(workermaster.name + ",");
  208. }
  209.  
  210. Console.WriteLine("");
  211.  
  212. }
  213.  
  214.  
  215.  
  216. });
  217. if (maxCount - minCount <= 1)
  218. {
  219. if (totalCount == masterCount)
  220. {
  221. Console.WriteLine("测试通过");
  222. return true;
  223. }
  224.  
  225. }
  226.  
  227. Console.WriteLine("测试失败");
  228. return false;
  229.  
  230. }
  231.  
  232. static void MakeData(int masterCount, int workerCount)
  233. {
  234. master.Clear();
  235. for (int i = 0; i < masterCount; i++)
  236. {
  237. master.Add(new Master(i));
  238. }
  239.  
  240.  
  241. workers.Clear();
  242. for (int i = 0; i < workerCount; i++)
  243. {
  244. workers.Add(new Worker(i));
  245. }
  246.  
  247. }
  248.  
  249. static void Main(string[] args)
  250. {
  251. //在这里实现逻辑
  252.  
  253.  
  254.  
  255. masterCount = 8;
  256. workerCount = 3;
  257. MakeData(masterCount, workerCount);
  258.  
  259.  
  260. //这套常量已经测试通过,可以在master=8,worker=3的情况下离线任何一个或多个worker,master都能被平均分配给剩下的worker
  261.  
  262. master[0].effectList.Add(new EffectToInfo(1000, workers[0]));
  263. master[0].effectList.Add(new EffectToInfo(999, workers[1]));
  264. master[0].effectList.Add(new EffectToInfo(998, workers[2]));
  265.  
  266. master[1].effectList.Add(new EffectToInfo(999, workers[0]));
  267. master[1].effectList.Add(new EffectToInfo(1000, workers[1]));
  268. master[1].effectList.Add(new EffectToInfo(998, workers[2]));
  269.  
  270. master[2].effectList.Add(new EffectToInfo(998, workers[0]));
  271. master[2].effectList.Add(new EffectToInfo(999, workers[1]));
  272. master[2].effectList.Add(new EffectToInfo(1000, workers[2]));
  273.  
  274. master[3].effectList.Add(new EffectToInfo(1000, workers[0]));
  275. master[3].effectList.Add(new EffectToInfo(999, workers[1]));
  276. master[3].effectList.Add(new EffectToInfo(998, workers[2]));
  277.  
  278. master[4].effectList.Add(new EffectToInfo(998, workers[0]));
  279. master[4].effectList.Add(new EffectToInfo(1000, workers[1]));
  280. master[4].effectList.Add(new EffectToInfo(999, workers[2]));
  281.  
  282. master[5].effectList.Add(new EffectToInfo(998, workers[0]));
  283. master[5].effectList.Add(new EffectToInfo(999, workers[1]));
  284. master[5].effectList.Add(new EffectToInfo(1000, workers[2]));
  285.  
  286. master[6].effectList.Add(new EffectToInfo(1000, workers[0]));
  287. master[6].effectList.Add(new EffectToInfo(998, workers[1]));
  288. master[6].effectList.Add(new EffectToInfo(999, workers[2]));
  289.  
  290. master[7].effectList.Add(new EffectToInfo(999, workers[0]));
  291. master[7].effectList.Add(new EffectToInfo(998, workers[1]));
  292. master[7].effectList.Add(new EffectToInfo(1000, workers[2]));
  293.  
  294.  
  295. TestScript();
  296. Console.ReadKey();
  297. }
  298. }
  299. }
Add Comment
Please, Sign In to add comment