mirror of
https://github.com/L-yang-yang/cugenopt.git
synced 2026-04-25 12:16:21 +02:00
164 lines
5.4 KiB
Text
164 lines
5.4 KiB
Text
/**
|
||
* E5: 通用性验证 — 12 种问题类型
|
||
*
|
||
* 目的:证明同一套框架能解 12 种不同编码/约束的问题
|
||
* 实例:TSP5, Knapsack6, Assign4, Schedule3x4, CVRP10, LoadBal8,
|
||
* GraphColor10, BinPack8, QAP5, VRPTW8, JSP3x3_Int, JSP3x3_Perm
|
||
* 配置:default (gen=2000)
|
||
* 输出:CSV
|
||
*
|
||
* 用法:./gpu [all]
|
||
*/
|
||
#include "bench_common.cuh"
|
||
|
||
int main(int argc, char** argv) {
|
||
bench_init();
|
||
bench_csv_header();
|
||
|
||
const int GEN = 2000;
|
||
const char* cfg_name = "default_g2k";
|
||
|
||
// 1. TSP5
|
||
{
|
||
float dist[25] = {0,3,6,5,7, 3,0,3,4,5, 6,3,0,5,4, 5,4,5,0,3, 7,5,4,3,0};
|
||
auto p = TSPProblem::create(dist, 5);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("TSP5", cfg_name, p, c, 18.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 2. Knapsack6
|
||
{
|
||
float w[6] = {2,3,5,7,4,6}, v[6] = {6,5,8,14,7,10};
|
||
auto p = KnapsackProblem::create(w, v, 6, 15.0f);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("Knapsack6", cfg_name, p, c, -30.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 3. Assignment4
|
||
{
|
||
float cost[16] = {9,2,7,8, 6,4,3,7, 5,8,1,8, 7,6,9,4};
|
||
auto p = AssignmentProblem::create(cost, 4);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("Assign4", cfg_name, p, c, 13.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 4. Schedule3x4
|
||
{
|
||
float cost[12] = {5,3,8,4, 6,2,7,5, 4,6,3,7};
|
||
auto p = ScheduleProblem::create(cost, 3, 4, 2);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("Schedule3x4", cfg_name, p, c, 0.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 5. CVRP10
|
||
{
|
||
const int N = 10, NN = N + 1;
|
||
float coords[NN][2] = {
|
||
{50,50},{60,50},{70,50},{80,50},{50,60},{50,70},{50,80},{40,50},{30,50},{50,40},{50,30}
|
||
};
|
||
float demands[N] = {5,4,6,5,4,6,5,4,5,6};
|
||
float dist[NN * NN];
|
||
for (int i = 0; i < NN; i++)
|
||
for (int j = 0; j < NN; j++) {
|
||
float dx = coords[i][0] - coords[j][0];
|
||
float dy = coords[i][1] - coords[j][1];
|
||
dist[i * NN + j] = roundf(sqrtf(dx * dx + dy * dy));
|
||
}
|
||
auto p = VRPProblem::create(dist, demands, N, 15.0f, 4, 4);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("CVRP10", cfg_name, p, c, 200.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 6. LoadBalance8
|
||
{
|
||
float pt[8] = {5,3,8,4,6,2,7,5};
|
||
auto p = LoadBalanceProblem::create(pt, 8, 3);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("LoadBal8", cfg_name, p, c, 14.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 7. GraphColor10 (Petersen)
|
||
{
|
||
const int N = 10;
|
||
int adj[N * N] = {};
|
||
auto edge = [&](int a, int b) { adj[a*N+b] = 1; adj[b*N+a] = 1; };
|
||
edge(0,1); edge(1,2); edge(2,3); edge(3,4); edge(4,0);
|
||
edge(5,7); edge(7,9); edge(9,6); edge(6,8); edge(8,5);
|
||
edge(0,5); edge(1,6); edge(2,7); edge(3,8); edge(4,9);
|
||
auto p = GraphColorProblem::create(adj, N, 3);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("GraphColor10", cfg_name, p, c, 0.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 8. BinPacking8
|
||
{
|
||
float w[8] = {7,5,3,4,6,2,8,1};
|
||
auto p = BinPackingProblem::create(w, 8, 6, 10.0f);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("BinPack8", cfg_name, p, c, 4.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 9. QAP5
|
||
{
|
||
float flow[25] = {0,5,2,4,1, 5,0,3,0,2, 2,3,0,0,0, 4,0,0,0,5, 1,2,0,5,0};
|
||
float dist[25] = {0,1,2,3,4, 1,0,1,2,3, 2,1,0,1,2, 3,2,1,0,1, 4,3,2,1,0};
|
||
auto p = QAPProblem::create(flow, dist, 5);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("QAP5", cfg_name, p, c, 58.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 10. VRPTW8
|
||
{
|
||
const int N = 8, NN = N + 1;
|
||
float coords[NN][2] = {
|
||
{50,50},{60,50},{70,50},{50,60},{50,70},{40,50},{30,50},{50,40},{50,30}
|
||
};
|
||
float demands[N] = {3,5,4,6,3,5,4,5};
|
||
float dist[NN * NN];
|
||
for (int i = 0; i < NN; i++)
|
||
for (int j = 0; j < NN; j++) {
|
||
float dx = coords[i][0] - coords[j][0];
|
||
float dy = coords[i][1] - coords[j][1];
|
||
dist[i * NN + j] = roundf(sqrtf(dx * dx + dy * dy));
|
||
}
|
||
float earliest[NN] = {0, 0,10, 0,20, 0,30, 0,10};
|
||
float latest[NN] = {200,50,60,50,80,50,90,50,70};
|
||
float service[NN] = {0, 5,5,5,5,5,5,5,5};
|
||
auto p = VRPTWProblem::create(dist, demands, earliest, latest, service, N, 15.0f, 3, 3);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("VRPTW8", cfg_name, p, c, 0.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 11a. JSP3x3 (Integer)
|
||
{
|
||
int machine[9] = {0,1,2, 1,0,2, 2,1,0};
|
||
float duration[9] = {3,2,4, 2,3,3, 4,3,1};
|
||
auto p = JSPProblem::create(machine, duration, 3, 3, 3, 30);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("JSP3x3_Int", cfg_name, p, c, 12.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
// 11b. JSP3x3 (Perm multiset)
|
||
{
|
||
int machine[9] = {0,1,2, 1,0,2, 2,1,0};
|
||
float duration[9] = {3,2,4, 2,3,3, 4,3,1};
|
||
auto p = JSPPermProblem::create(machine, duration, 3, 3, 3);
|
||
SolverConfig c = make_default_config(GEN);
|
||
bench_run("JSP3x3_Perm", cfg_name, p, c, 12.0f);
|
||
p.destroy();
|
||
}
|
||
|
||
fprintf(stderr, "\n[e5] Generality completed.\n");
|
||
return 0;
|
||
}
|