From e4caeea7f195b18cff29cc97271ba8751f7018db Mon Sep 17 00:00:00 2001 From: 0xd82e010eaaa8e294ee3872d052279692e0ef5d37 Date: Thu, 17 Oct 2024 04:35:45 +0000 Subject: [PATCH 1/2] "Player 0xd82e010eaaa8e294ee3872d052279692e0ef5d37 submitted 'classic_quadkp' for challenge knapsack" --- .../classic_quadkp/benchmarker_outbound.rs | 167 ++++++++++++++++++ .../src/knapsack/classic_quadkp/commercial.rs | 167 ++++++++++++++++++ .../src/knapsack/classic_quadkp/inbound.rs | 167 ++++++++++++++++++ .../classic_quadkp/innovator_outbound.rs | 167 ++++++++++++++++++ .../src/knapsack/classic_quadkp/mod.rs | 4 + .../src/knapsack/classic_quadkp/open_data.rs | 167 ++++++++++++++++++ tig-algorithms/src/knapsack/mod.rs | 3 +- 7 files changed, 841 insertions(+), 1 deletion(-) create mode 100644 tig-algorithms/src/knapsack/classic_quadkp/benchmarker_outbound.rs create mode 100644 tig-algorithms/src/knapsack/classic_quadkp/commercial.rs create mode 100644 tig-algorithms/src/knapsack/classic_quadkp/inbound.rs create mode 100644 tig-algorithms/src/knapsack/classic_quadkp/innovator_outbound.rs create mode 100644 tig-algorithms/src/knapsack/classic_quadkp/mod.rs create mode 100644 tig-algorithms/src/knapsack/classic_quadkp/open_data.rs diff --git a/tig-algorithms/src/knapsack/classic_quadkp/benchmarker_outbound.rs b/tig-algorithms/src/knapsack/classic_quadkp/benchmarker_outbound.rs new file mode 100644 index 00000000..4f65befd --- /dev/null +++ b/tig-algorithms/src/knapsack/classic_quadkp/benchmarker_outbound.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 syebastian + +Licensed under the TIG Benchmarker Outbound Game License v1.0 (the "License"); you +may not use this file except in compliance with the License. You may obtain a copy +of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +use anyhow::Result; +use tig_challenges::knapsack::{Challenge, Solution}; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let mut edge_costs: Vec<(usize, f32)> = (0..vertex_count) + .map(|flow_index| { + let total_flow = challenge.values[flow_index] as i32 + + challenge.interaction_values[flow_index].iter().sum::(); + let cost = total_flow as f32 / challenge.weights[flow_index] as f32; + (flow_index, cost) + }) + .collect(); + + edge_costs.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut coloring = Vec::with_capacity(vertex_count); + let mut uncolored = Vec::with_capacity(vertex_count); + let mut current_entropy = 0; + let mut current_temperature = 0; + + for &(flow_index, _) in &edge_costs { + if current_entropy + challenge.weights[flow_index] <= challenge.max_weight { + current_entropy += challenge.weights[flow_index]; + current_temperature += challenge.values[flow_index] as i32; + + for &colored in &coloring { + current_temperature += challenge.interaction_values[flow_index][colored]; + } + coloring.push(flow_index); + } else { + uncolored.push(flow_index); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for flow_index in 0..vertex_count { + mutation_rates[flow_index] = challenge.values[flow_index] as i32; + for &colored in &coloring { + mutation_rates[flow_index] += challenge.interaction_values[flow_index][colored]; + } + } + + let max_generations = 100; + let mut cooling_schedule = vec![0; vertex_count]; + + for _ in 0..max_generations { + let mut best_mutation = 0; + let mut best_crossover = None; + + for uncolored_index in 0..uncolored.len() { + let mutant = uncolored[uncolored_index]; + if cooling_schedule[mutant] > 0 { + continue; + } + + unsafe { + let mutant_fitness = *mutation_rates.get_unchecked(mutant); + let min_entropy_reduction = *challenge.weights.get_unchecked(mutant) as i32 - (challenge.max_weight as i32 - current_entropy as i32); + + if mutant_fitness < 0 { + continue; + } + + for colored_index in 0..coloring.len() { + let gene_to_remove = *coloring.get_unchecked(colored_index); + if *cooling_schedule.get_unchecked(gene_to_remove) > 0 { + continue; + } + + if min_entropy_reduction > 0 { + let removed_entropy = *challenge.weights.get_unchecked(gene_to_remove) as i32; + if removed_entropy < min_entropy_reduction { + continue; + } + } + + let fitness_change = mutant_fitness - *mutation_rates.get_unchecked(gene_to_remove) + - *challenge.interaction_values.get_unchecked(mutant).get_unchecked(gene_to_remove); + + if fitness_change > best_mutation { + best_mutation = fitness_change; + best_crossover = Some((uncolored_index, colored_index)); + } + } + } + } + + if let Some((uncolored_index, colored_index)) = best_crossover { + let gene_to_add = uncolored[uncolored_index]; + let gene_to_remove = coloring[colored_index]; + + coloring.swap_remove(colored_index); + uncolored.swap_remove(uncolored_index); + coloring.push(gene_to_add); + uncolored.push(gene_to_remove); + + current_temperature += best_mutation; + current_entropy = current_entropy + challenge.weights[gene_to_add] - challenge.weights[gene_to_remove]; + + unsafe { + for flow_index in 0..vertex_count { + *mutation_rates.get_unchecked_mut(flow_index) += + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_add) - + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_remove); + } + } + + cooling_schedule[gene_to_add] = 3; + cooling_schedule[gene_to_remove] = 3; + } else { + break; + } + + if current_temperature as u32 >= challenge.min_value { + return Ok(Some(Solution { items: coloring })); + } + + for cooling_rate in cooling_schedule.iter_mut() { + *cooling_rate = if *cooling_rate > 0 { *cooling_rate - 1 } else { 0 }; + } + } + + if current_temperature as u32 >= challenge.min_value { + Ok(Some(Solution { items: coloring })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; \ No newline at end of file diff --git a/tig-algorithms/src/knapsack/classic_quadkp/commercial.rs b/tig-algorithms/src/knapsack/classic_quadkp/commercial.rs new file mode 100644 index 00000000..c8ff1e38 --- /dev/null +++ b/tig-algorithms/src/knapsack/classic_quadkp/commercial.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 syebastian + +Licensed under the TIG Commercial License v1.0 (the "License"); you +may not use this file except in compliance with the License. You may obtain a copy +of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +use anyhow::Result; +use tig_challenges::knapsack::{Challenge, Solution}; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let mut edge_costs: Vec<(usize, f32)> = (0..vertex_count) + .map(|flow_index| { + let total_flow = challenge.values[flow_index] as i32 + + challenge.interaction_values[flow_index].iter().sum::(); + let cost = total_flow as f32 / challenge.weights[flow_index] as f32; + (flow_index, cost) + }) + .collect(); + + edge_costs.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut coloring = Vec::with_capacity(vertex_count); + let mut uncolored = Vec::with_capacity(vertex_count); + let mut current_entropy = 0; + let mut current_temperature = 0; + + for &(flow_index, _) in &edge_costs { + if current_entropy + challenge.weights[flow_index] <= challenge.max_weight { + current_entropy += challenge.weights[flow_index]; + current_temperature += challenge.values[flow_index] as i32; + + for &colored in &coloring { + current_temperature += challenge.interaction_values[flow_index][colored]; + } + coloring.push(flow_index); + } else { + uncolored.push(flow_index); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for flow_index in 0..vertex_count { + mutation_rates[flow_index] = challenge.values[flow_index] as i32; + for &colored in &coloring { + mutation_rates[flow_index] += challenge.interaction_values[flow_index][colored]; + } + } + + let max_generations = 100; + let mut cooling_schedule = vec![0; vertex_count]; + + for _ in 0..max_generations { + let mut best_mutation = 0; + let mut best_crossover = None; + + for uncolored_index in 0..uncolored.len() { + let mutant = uncolored[uncolored_index]; + if cooling_schedule[mutant] > 0 { + continue; + } + + unsafe { + let mutant_fitness = *mutation_rates.get_unchecked(mutant); + let min_entropy_reduction = *challenge.weights.get_unchecked(mutant) as i32 - (challenge.max_weight as i32 - current_entropy as i32); + + if mutant_fitness < 0 { + continue; + } + + for colored_index in 0..coloring.len() { + let gene_to_remove = *coloring.get_unchecked(colored_index); + if *cooling_schedule.get_unchecked(gene_to_remove) > 0 { + continue; + } + + if min_entropy_reduction > 0 { + let removed_entropy = *challenge.weights.get_unchecked(gene_to_remove) as i32; + if removed_entropy < min_entropy_reduction { + continue; + } + } + + let fitness_change = mutant_fitness - *mutation_rates.get_unchecked(gene_to_remove) + - *challenge.interaction_values.get_unchecked(mutant).get_unchecked(gene_to_remove); + + if fitness_change > best_mutation { + best_mutation = fitness_change; + best_crossover = Some((uncolored_index, colored_index)); + } + } + } + } + + if let Some((uncolored_index, colored_index)) = best_crossover { + let gene_to_add = uncolored[uncolored_index]; + let gene_to_remove = coloring[colored_index]; + + coloring.swap_remove(colored_index); + uncolored.swap_remove(uncolored_index); + coloring.push(gene_to_add); + uncolored.push(gene_to_remove); + + current_temperature += best_mutation; + current_entropy = current_entropy + challenge.weights[gene_to_add] - challenge.weights[gene_to_remove]; + + unsafe { + for flow_index in 0..vertex_count { + *mutation_rates.get_unchecked_mut(flow_index) += + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_add) - + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_remove); + } + } + + cooling_schedule[gene_to_add] = 3; + cooling_schedule[gene_to_remove] = 3; + } else { + break; + } + + if current_temperature as u32 >= challenge.min_value { + return Ok(Some(Solution { items: coloring })); + } + + for cooling_rate in cooling_schedule.iter_mut() { + *cooling_rate = if *cooling_rate > 0 { *cooling_rate - 1 } else { 0 }; + } + } + + if current_temperature as u32 >= challenge.min_value { + Ok(Some(Solution { items: coloring })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; \ No newline at end of file diff --git a/tig-algorithms/src/knapsack/classic_quadkp/inbound.rs b/tig-algorithms/src/knapsack/classic_quadkp/inbound.rs new file mode 100644 index 00000000..314acfb2 --- /dev/null +++ b/tig-algorithms/src/knapsack/classic_quadkp/inbound.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 syebastian + +Licensed under the TIG Inbound Game License v1.0 or (at your option) any later +version (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +use anyhow::Result; +use tig_challenges::knapsack::{Challenge, Solution}; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let mut edge_costs: Vec<(usize, f32)> = (0..vertex_count) + .map(|flow_index| { + let total_flow = challenge.values[flow_index] as i32 + + challenge.interaction_values[flow_index].iter().sum::(); + let cost = total_flow as f32 / challenge.weights[flow_index] as f32; + (flow_index, cost) + }) + .collect(); + + edge_costs.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut coloring = Vec::with_capacity(vertex_count); + let mut uncolored = Vec::with_capacity(vertex_count); + let mut current_entropy = 0; + let mut current_temperature = 0; + + for &(flow_index, _) in &edge_costs { + if current_entropy + challenge.weights[flow_index] <= challenge.max_weight { + current_entropy += challenge.weights[flow_index]; + current_temperature += challenge.values[flow_index] as i32; + + for &colored in &coloring { + current_temperature += challenge.interaction_values[flow_index][colored]; + } + coloring.push(flow_index); + } else { + uncolored.push(flow_index); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for flow_index in 0..vertex_count { + mutation_rates[flow_index] = challenge.values[flow_index] as i32; + for &colored in &coloring { + mutation_rates[flow_index] += challenge.interaction_values[flow_index][colored]; + } + } + + let max_generations = 100; + let mut cooling_schedule = vec![0; vertex_count]; + + for _ in 0..max_generations { + let mut best_mutation = 0; + let mut best_crossover = None; + + for uncolored_index in 0..uncolored.len() { + let mutant = uncolored[uncolored_index]; + if cooling_schedule[mutant] > 0 { + continue; + } + + unsafe { + let mutant_fitness = *mutation_rates.get_unchecked(mutant); + let min_entropy_reduction = *challenge.weights.get_unchecked(mutant) as i32 - (challenge.max_weight as i32 - current_entropy as i32); + + if mutant_fitness < 0 { + continue; + } + + for colored_index in 0..coloring.len() { + let gene_to_remove = *coloring.get_unchecked(colored_index); + if *cooling_schedule.get_unchecked(gene_to_remove) > 0 { + continue; + } + + if min_entropy_reduction > 0 { + let removed_entropy = *challenge.weights.get_unchecked(gene_to_remove) as i32; + if removed_entropy < min_entropy_reduction { + continue; + } + } + + let fitness_change = mutant_fitness - *mutation_rates.get_unchecked(gene_to_remove) + - *challenge.interaction_values.get_unchecked(mutant).get_unchecked(gene_to_remove); + + if fitness_change > best_mutation { + best_mutation = fitness_change; + best_crossover = Some((uncolored_index, colored_index)); + } + } + } + } + + if let Some((uncolored_index, colored_index)) = best_crossover { + let gene_to_add = uncolored[uncolored_index]; + let gene_to_remove = coloring[colored_index]; + + coloring.swap_remove(colored_index); + uncolored.swap_remove(uncolored_index); + coloring.push(gene_to_add); + uncolored.push(gene_to_remove); + + current_temperature += best_mutation; + current_entropy = current_entropy + challenge.weights[gene_to_add] - challenge.weights[gene_to_remove]; + + unsafe { + for flow_index in 0..vertex_count { + *mutation_rates.get_unchecked_mut(flow_index) += + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_add) - + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_remove); + } + } + + cooling_schedule[gene_to_add] = 3; + cooling_schedule[gene_to_remove] = 3; + } else { + break; + } + + if current_temperature as u32 >= challenge.min_value { + return Ok(Some(Solution { items: coloring })); + } + + for cooling_rate in cooling_schedule.iter_mut() { + *cooling_rate = if *cooling_rate > 0 { *cooling_rate - 1 } else { 0 }; + } + } + + if current_temperature as u32 >= challenge.min_value { + Ok(Some(Solution { items: coloring })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; \ No newline at end of file diff --git a/tig-algorithms/src/knapsack/classic_quadkp/innovator_outbound.rs b/tig-algorithms/src/knapsack/classic_quadkp/innovator_outbound.rs new file mode 100644 index 00000000..3c9de50f --- /dev/null +++ b/tig-algorithms/src/knapsack/classic_quadkp/innovator_outbound.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 syebastian + +Licensed under the TIG Innovator Outbound Game License v1.0 (the "License"); you +may not use this file except in compliance with the License. You may obtain a copy +of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +use anyhow::Result; +use tig_challenges::knapsack::{Challenge, Solution}; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let mut edge_costs: Vec<(usize, f32)> = (0..vertex_count) + .map(|flow_index| { + let total_flow = challenge.values[flow_index] as i32 + + challenge.interaction_values[flow_index].iter().sum::(); + let cost = total_flow as f32 / challenge.weights[flow_index] as f32; + (flow_index, cost) + }) + .collect(); + + edge_costs.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut coloring = Vec::with_capacity(vertex_count); + let mut uncolored = Vec::with_capacity(vertex_count); + let mut current_entropy = 0; + let mut current_temperature = 0; + + for &(flow_index, _) in &edge_costs { + if current_entropy + challenge.weights[flow_index] <= challenge.max_weight { + current_entropy += challenge.weights[flow_index]; + current_temperature += challenge.values[flow_index] as i32; + + for &colored in &coloring { + current_temperature += challenge.interaction_values[flow_index][colored]; + } + coloring.push(flow_index); + } else { + uncolored.push(flow_index); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for flow_index in 0..vertex_count { + mutation_rates[flow_index] = challenge.values[flow_index] as i32; + for &colored in &coloring { + mutation_rates[flow_index] += challenge.interaction_values[flow_index][colored]; + } + } + + let max_generations = 100; + let mut cooling_schedule = vec![0; vertex_count]; + + for _ in 0..max_generations { + let mut best_mutation = 0; + let mut best_crossover = None; + + for uncolored_index in 0..uncolored.len() { + let mutant = uncolored[uncolored_index]; + if cooling_schedule[mutant] > 0 { + continue; + } + + unsafe { + let mutant_fitness = *mutation_rates.get_unchecked(mutant); + let min_entropy_reduction = *challenge.weights.get_unchecked(mutant) as i32 - (challenge.max_weight as i32 - current_entropy as i32); + + if mutant_fitness < 0 { + continue; + } + + for colored_index in 0..coloring.len() { + let gene_to_remove = *coloring.get_unchecked(colored_index); + if *cooling_schedule.get_unchecked(gene_to_remove) > 0 { + continue; + } + + if min_entropy_reduction > 0 { + let removed_entropy = *challenge.weights.get_unchecked(gene_to_remove) as i32; + if removed_entropy < min_entropy_reduction { + continue; + } + } + + let fitness_change = mutant_fitness - *mutation_rates.get_unchecked(gene_to_remove) + - *challenge.interaction_values.get_unchecked(mutant).get_unchecked(gene_to_remove); + + if fitness_change > best_mutation { + best_mutation = fitness_change; + best_crossover = Some((uncolored_index, colored_index)); + } + } + } + } + + if let Some((uncolored_index, colored_index)) = best_crossover { + let gene_to_add = uncolored[uncolored_index]; + let gene_to_remove = coloring[colored_index]; + + coloring.swap_remove(colored_index); + uncolored.swap_remove(uncolored_index); + coloring.push(gene_to_add); + uncolored.push(gene_to_remove); + + current_temperature += best_mutation; + current_entropy = current_entropy + challenge.weights[gene_to_add] - challenge.weights[gene_to_remove]; + + unsafe { + for flow_index in 0..vertex_count { + *mutation_rates.get_unchecked_mut(flow_index) += + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_add) - + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_remove); + } + } + + cooling_schedule[gene_to_add] = 3; + cooling_schedule[gene_to_remove] = 3; + } else { + break; + } + + if current_temperature as u32 >= challenge.min_value { + return Ok(Some(Solution { items: coloring })); + } + + for cooling_rate in cooling_schedule.iter_mut() { + *cooling_rate = if *cooling_rate > 0 { *cooling_rate - 1 } else { 0 }; + } + } + + if current_temperature as u32 >= challenge.min_value { + Ok(Some(Solution { items: coloring })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; \ No newline at end of file diff --git a/tig-algorithms/src/knapsack/classic_quadkp/mod.rs b/tig-algorithms/src/knapsack/classic_quadkp/mod.rs new file mode 100644 index 00000000..fcec9672 --- /dev/null +++ b/tig-algorithms/src/knapsack/classic_quadkp/mod.rs @@ -0,0 +1,4 @@ +mod benchmarker_outbound; +pub use benchmarker_outbound::solve_challenge; +#[cfg(feature = "cuda")] +pub use benchmarker_outbound::{cuda_solve_challenge, KERNEL}; \ No newline at end of file diff --git a/tig-algorithms/src/knapsack/classic_quadkp/open_data.rs b/tig-algorithms/src/knapsack/classic_quadkp/open_data.rs new file mode 100644 index 00000000..5c7bc344 --- /dev/null +++ b/tig-algorithms/src/knapsack/classic_quadkp/open_data.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 syebastian + +Licensed under the TIG Open Data License v1.0 or (at your option) any later version +(the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +use anyhow::Result; +use tig_challenges::knapsack::{Challenge, Solution}; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let mut edge_costs: Vec<(usize, f32)> = (0..vertex_count) + .map(|flow_index| { + let total_flow = challenge.values[flow_index] as i32 + + challenge.interaction_values[flow_index].iter().sum::(); + let cost = total_flow as f32 / challenge.weights[flow_index] as f32; + (flow_index, cost) + }) + .collect(); + + edge_costs.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut coloring = Vec::with_capacity(vertex_count); + let mut uncolored = Vec::with_capacity(vertex_count); + let mut current_entropy = 0; + let mut current_temperature = 0; + + for &(flow_index, _) in &edge_costs { + if current_entropy + challenge.weights[flow_index] <= challenge.max_weight { + current_entropy += challenge.weights[flow_index]; + current_temperature += challenge.values[flow_index] as i32; + + for &colored in &coloring { + current_temperature += challenge.interaction_values[flow_index][colored]; + } + coloring.push(flow_index); + } else { + uncolored.push(flow_index); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for flow_index in 0..vertex_count { + mutation_rates[flow_index] = challenge.values[flow_index] as i32; + for &colored in &coloring { + mutation_rates[flow_index] += challenge.interaction_values[flow_index][colored]; + } + } + + let max_generations = 100; + let mut cooling_schedule = vec![0; vertex_count]; + + for _ in 0..max_generations { + let mut best_mutation = 0; + let mut best_crossover = None; + + for uncolored_index in 0..uncolored.len() { + let mutant = uncolored[uncolored_index]; + if cooling_schedule[mutant] > 0 { + continue; + } + + unsafe { + let mutant_fitness = *mutation_rates.get_unchecked(mutant); + let min_entropy_reduction = *challenge.weights.get_unchecked(mutant) as i32 - (challenge.max_weight as i32 - current_entropy as i32); + + if mutant_fitness < 0 { + continue; + } + + for colored_index in 0..coloring.len() { + let gene_to_remove = *coloring.get_unchecked(colored_index); + if *cooling_schedule.get_unchecked(gene_to_remove) > 0 { + continue; + } + + if min_entropy_reduction > 0 { + let removed_entropy = *challenge.weights.get_unchecked(gene_to_remove) as i32; + if removed_entropy < min_entropy_reduction { + continue; + } + } + + let fitness_change = mutant_fitness - *mutation_rates.get_unchecked(gene_to_remove) + - *challenge.interaction_values.get_unchecked(mutant).get_unchecked(gene_to_remove); + + if fitness_change > best_mutation { + best_mutation = fitness_change; + best_crossover = Some((uncolored_index, colored_index)); + } + } + } + } + + if let Some((uncolored_index, colored_index)) = best_crossover { + let gene_to_add = uncolored[uncolored_index]; + let gene_to_remove = coloring[colored_index]; + + coloring.swap_remove(colored_index); + uncolored.swap_remove(uncolored_index); + coloring.push(gene_to_add); + uncolored.push(gene_to_remove); + + current_temperature += best_mutation; + current_entropy = current_entropy + challenge.weights[gene_to_add] - challenge.weights[gene_to_remove]; + + unsafe { + for flow_index in 0..vertex_count { + *mutation_rates.get_unchecked_mut(flow_index) += + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_add) - + challenge.interaction_values.get_unchecked(flow_index).get_unchecked(gene_to_remove); + } + } + + cooling_schedule[gene_to_add] = 3; + cooling_schedule[gene_to_remove] = 3; + } else { + break; + } + + if current_temperature as u32 >= challenge.min_value { + return Ok(Some(Solution { items: coloring })); + } + + for cooling_rate in cooling_schedule.iter_mut() { + *cooling_rate = if *cooling_rate > 0 { *cooling_rate - 1 } else { 0 }; + } + } + + if current_temperature as u32 >= challenge.min_value { + Ok(Some(Solution { items: coloring })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; \ No newline at end of file diff --git a/tig-algorithms/src/knapsack/mod.rs b/tig-algorithms/src/knapsack/mod.rs index 33ddf59d..1f8cd19f 100644 --- a/tig-algorithms/src/knapsack/mod.rs +++ b/tig-algorithms/src/knapsack/mod.rs @@ -98,7 +98,8 @@ // c003_a050 -// c003_a051 +pub mod classic_quadkp; +pub use classic_quadkp as c003_a051; // c003_a052 From e376ccbc9448af7e63d6371e16d6d55d1c509b64 Mon Sep 17 00:00:00 2001 From: FiveMovesAhead Date: Thu, 17 Oct 2024 04:37:29 +0000 Subject: [PATCH 2/2] Compiled algorithm classic_quadkp into WASM --- cuda_keyring.deb | Bin 0 -> 4332 bytes .../wasm/knapsack/classic_quadkp.wasm | Bin 0 -> 162976 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 cuda_keyring.deb create mode 100644 tig-algorithms/wasm/knapsack/classic_quadkp.wasm diff --git a/cuda_keyring.deb b/cuda_keyring.deb new file mode 100644 index 0000000000000000000000000000000000000000..559906a9f54e9297d5420d0e143d0ac154a5523a GIT binary patch literal 4332 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ν=u9|JJOLEV6z8K)| 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 SwJE&78r