• C++下基于竞拍算法解决无人机任务分配问题


    【算法】拍卖算法(最优分配问题)--启发式算法_wuxiaoxiao2021的博客-CSDN博客

    竞拍算法(Auction Algorithm)原理及工作过程分析_拍卖算法_一方灯火的博客-CSDN博客

    一、原理

    二、代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #define NLINKS 65536
    9. using namespace std;
    10. void CreatRandomEdge(char* filePath, int n1, int n2);
    11. typedef struct {
    12. unsigned u;//first node
    13. unsigned v;//second node
    14. unsigned w;//weight of the edge
    15. } edge;
    16. typedef struct {
    17. //edge list
    18. unsigned n1;//number of nodes
    19. unsigned n2;//number of nodes
    20. unsigned e;//number of edges
    21. edge *edges;//list of edges
    22. bool b;//b=1 iff n1>n2
    23. //graph
    24. unsigned *cd;//cumulative degree: (start with 0) length=dim+1
    25. unsigned *adj;//list of neighbors
    26. unsigned *w;//weight of the edges
    27. } bipgraph;
    28. void freebg(bipgraph *g) {
    29. free(g->edges);
    30. free(g->cd);
    31. free(g->adj);
    32. free(g->w);
    33. free(g);
    34. }
    35. //compute the maximum of two unsigned
    36. inline unsigned max2u(unsigned a, unsigned b) {
    37. return (a > b) ? a : b;
    38. }
    39. //reading the edgelist of bipartit weighted graph from file
    40. //从文件中读取二维加权图的边表
    41. bipgraph* readedgelist(char* edgelist) {
    42. unsigned e1 = NLINKS;
    43. bipgraph *g = (bipgraph*)malloc(sizeof(bipgraph));
    44. FILE *file;
    45. g->n1 = 0;
    46. g->n2 = 0;
    47. g->e = 0;
    48. file = fopen(edgelist, "r");
    49. g->edges = (edge*)malloc(e1 * sizeof(edge));
    50. //e1 += NLINKS;
    51. //g->edges = (edge*)realloc(g->edges, e1 * sizeof(edge));
    52. while (fscanf(file, "%u %u %u\n", &(g->edges[g->e].u), &(g->edges[g->e].v), &(g->edges[g->e].w)) == 3) {
    53. g->n1 = max2u(g->n1, g->edges[g->e].u);
    54. g->n2 = max2u(g->n2, g->edges[g->e].v);
    55. if (g->e++ == e1) {
    56. e1 += NLINKS;
    57. g->edges = (edge*)realloc(g->edges, e1 * sizeof(edge));
    58. }
    59. }
    60. fclose(file);
    61. g->n1++;
    62. g->n2++;
    63. g->edges = (edge*)realloc(g->edges, g->e * sizeof(edge));
    64. return g;
    65. }
    66. //Building a special sparse graph structure
    67. //构建一个特殊的稀疏图结构
    68. void mkbg(bipgraph *g)
    69. {
    70. unsigned int i, u;
    71. unsigned int *d;
    72. if (g->n1 <= g->n2)
    73. {
    74. g->b = 0;
    75. d = (unsigned int*)calloc(g->n1, sizeof(unsigned));
    76. g->cd = (unsigned int*)malloc((g->n1 + 1) * sizeof(unsigned));
    77. g->adj = (unsigned int*)malloc((g->e) * sizeof(unsigned));
    78. g->w = (unsigned int*)malloc((g->e) * sizeof(unsigned));
    79. for (i = 0; i < g->e; i++) {
    80. d[g->edges[i].u]++;
    81. }
    82. g->cd[0] = 0;
    83. for (i = 1; i < g->n1 + 1; i++) {
    84. g->cd[i] = g->cd[i - 1] + d[i - 1];
    85. d[i - 1] = 0;
    86. }
    87. for (i = 0; i < g->e; i++) {
    88. u = g->edges[i].u;
    89. g->adj[g->cd[u] + d[u]] = g->edges[i].v;
    90. g->w[g->cd[u] + d[u]++] = g->edges[i].w;
    91. }
    92. }
    93. else
    94. {
    95. g->b = 1;
    96. d = (unsigned int*)calloc(g->n2, sizeof(unsigned));
    97. g->cd = (unsigned int*)malloc((g->n2 + 1) * sizeof(unsigned));
    98. g->adj = (unsigned int*)malloc((g->e) * sizeof(unsigned));
    99. g->w = (unsigned int*)malloc((g->e) * sizeof(unsigned));
    100. //计算n2中每个节点有多少边
    101. for (i = 0; i < g->e; i++) {
    102. d[g->edges[i].v]++;
    103. }
    104. g->cd[0] = 0;
    105. for (i = 1; i < g->n2 + 1; i++) {
    106. g->cd[i] = g->cd[i - 1] + d[i - 1];
    107. d[i - 1] = 0;
    108. }
    109. for (i = 0; i < g->e; i++) {
    110. u = g->edges[i].v;
    111. g->adj[g->cd[u] + d[u]] = g->edges[i].u;
    112. g->w[g->cd[u] + d[u]++] = g->edges[i].w;
    113. }
    114. i = g->n1;
    115. g->n1 = g->n2;
    116. g->n2 = i;
    117. }
    118. free(d);
    119. free(g->edges);
    120. }
    121. //bidding towards convergence
    122. unsigned bidding(bipgraph *g, double eps)
    123. {
    124. unsigned u, v, w, i, j, k, res;
    125. double *p = (double*)calloc(g->n2, sizeof(double));//p[i]=price of object i
    126. unsigned *a = (unsigned int*)malloc(g->n2 * sizeof(unsigned));//a[target]=-1 if not assigned = source if assigned
    127. unsigned *aw = (unsigned int*)malloc(g->n2 * sizeof(unsigned));//aw[target]=? if not assigned = weigth of edge source-target if assigned
    128. for (v = 0; v < g->n2; v++) {
    129. a[v] = -1;
    130. }
    131. //set data structure
    132. unsigned n_set = g->n1;//
    133. unsigned *l_set = (unsigned int*)malloc(g->n1 * sizeof(unsigned));//
    134. //bool *t_set=malloc(g->n1*sizeof(bool));//
    135. for (u = 0; u < n_set; u++) {
    136. l_set[u] = u;
    137. //t_set[u]=1;
    138. }
    139. //double eps=0.1;//1./((double)(g->n1)+1.);///
    140. double max, max2;
    141. unsigned wmax;
    142. res = 0;
    143. while (n_set > 0)
    144. {
    145. u = l_set[n_set - 1];
    146. //printf("n_set, u, w = %u, %u, %u\n",n_set,u,res);
    147. //找权重最大的一个u(火力点)
    148. max = 0;
    149. for (i = g->cd[u]; i < g->cd[u + 1]; i++) {
    150. v = g->adj[i];
    151. w = g->w[i];
    152. //printf("w=%u\n",w);
    153. if ((double)w - p[v] > max) {
    154. max = (double)w - p[v];
    155. wmax = w;
    156. k = v;
    157. }
    158. }
    159. //printf("max=%f\n",max);
    160. if (max == 0) {
    161. n_set--;
    162. continue;
    163. }
    164. //找次大的一个u(火力点)
    165. max2 = 0;
    166. for (i = g->cd[u]; i < g->cd[u + 1]; i++) {
    167. v = g->adj[i];
    168. if (v != k) {
    169. w = g->w[i];
    170. if ((double)w - p[v] > max2) {
    171. max2 = (double)w - p[v];
    172. }
    173. }
    174. }
    175. //printf("max2=%f\n",max2);
    176. p[k] += max - max2 + eps;
    177. //printf("k=%u\n",k);
    178. //printf("p[k]=%f\n",p[k]);
    179. if (a[k] != -1) {
    180. l_set[n_set - 1] = a[k];
    181. res -= aw[k];
    182. }
    183. else {
    184. n_set--;
    185. }
    186. a[k] = u;
    187. aw[k] = wmax;
    188. res += wmax;
    189. }
    190. g->edges = (edge*)malloc(g->n1 * sizeof(edge));
    191. j = 0;
    192. for (i = 0; i < g->n2; i++) {
    193. if (a[i] != -1) {
    194. g->edges[j].u = a[i];
    195. g->edges[j].v = i;
    196. g->edges[j++].w = aw[i];
    197. }
    198. }
    199. g->edges = (edge*)realloc(g->edges, j * sizeof(edge));
    200. g->e = j;
    201. return res;
    202. }
    203. void printres(bipgraph *g, char *output) {
    204. unsigned i;
    205. edge ed;
    206. FILE* file = fopen(output, "w");
    207. if (g->b) {
    208. for (i = 0; i < g->e; i++) {
    209. ed = g->edges[i];
    210. fprintf(file, "%u %u %u\n", ed.v, ed.u, ed.w);
    211. }
    212. }
    213. else {
    214. for (i = 0; i < g->e; i++) {
    215. ed = g->edges[i];
    216. fprintf(file, "%u %u %u\n", ed.u, ed.v, ed.w);//输出:人序号 任务序号 代价
    217. }
    218. }
    219. fclose(file);
    220. }
    221. int main(void)
    222. {
    223. bipgraph* g;
    224. unsigned w;
    225. time_t t0, t1, t2;
    226. char* argv[4];
    227. argv[1] = "testEdgesList.txt";
    228. argv[2] = "testRes.txt";
    229. //随机生成n x n个矩阵对,保存在testEdgesList.txt中
    230. CreatRandomEdge("testEdgesList.txt", 60, 60);//6 6
    231. double eps = 0.01;
    232. printf("Reading edgelist from file %s\n", argv[1]);
    233. //将矩阵读入矩阵图结构g中
    234. g = readedgelist(argv[1]);
    235. printf("Number of left nodes: %u\n", g->n1);
    236. printf("Number of right nodes: %u\n", g->n2);
    237. printf("Number of edges: %u\n", g->e);
    238. printf("Building datastructure\n");
    239. mkbg(g);
    240. printf("计算最优分配\n");
    241. //投标
    242. w = bidding(g, eps);
    243. printf("最优分配值 = %u\n", w);
    244. printf("Writting the results in file %s\n", argv[2]);
    245. printres(g, argv[2]);
    246. freebg(g);
    247. return 0;
    248. }
    249. void CreatRandomEdge(char* filePath, int n1, int n2)
    250. {
    251. ofstream fout;
    252. fout.open(filePath);
    253. int edgesNum = n1 * n2;//36
    254. int pI = n1 - 1;//人索引
    255. for (int i = 0; i < n1; i++)
    256. {
    257. for (int j = 0; j < n2; j++)//物品索引
    258. {
    259. fout << pI << " " << j << " " << (rand() % edgesNum) << "\n"; //随机生成0~35的随机数
    260. }
    261. pI--;
    262. }
    263. fout.close();
    264. }

  • 相关阅读:
    SRM供应商关系管理是什么?SRM供应商关系管理系统包含哪方面的内容?
    你不知道的 java 对象序列化的秘密
    10、网关详细设计文档
    上来就对标 20k Star 的开源项目,是自不量力还是后起之秀?
    完整安装datax-web教程
    从0开始python学习-22.selenium 常见键盘的操作
    图灵奖得主、《龙书》作者最新力作:抽象、算法与编译器
    苹果研究人员提出了一种新颖的AI算法来优化字节级表示以自动语音识别(ASR),并将其与UTF-8表示进行比较
    【web-解析目标】(1.2.4)解析应用程序:解析受攻击面
    瑞士奢侈手表制造商百年灵现在接受比特币
  • 原文地址:https://blog.csdn.net/ljjjjjjjjjjj/article/details/132957652