From bc67421e67ff20630065b1f89c7bbaf1b0f1df47 Mon Sep 17 00:00:00 2001 From: FiveMovesAhead Date: Thu, 16 Jan 2025 21:21:41 +0000 Subject: [PATCH] Compiled knapsack/quadkp_improved_opt --- tig-algorithms/src/knapsack/mod.rs | 3 +- .../benchmarker_outbound.rs | 266 +++++++++++++++++ .../quadkp_improved_opt/commercial.rs | 266 +++++++++++++++++ .../knapsack/quadkp_improved_opt/inbound.rs | 270 ++++++++++++++++++ .../quadkp_improved_opt/innovator_outbound.rs | 270 ++++++++++++++++++ .../src/knapsack/quadkp_improved_opt/mod.rs | 4 + .../knapsack/quadkp_improved_opt/open_data.rs | 266 +++++++++++++++++ .../wasm/knapsack/quadkp_improved_opt.wasm | Bin 0 -> 166446 bytes 8 files changed, 1344 insertions(+), 1 deletion(-) create mode 100644 tig-algorithms/src/knapsack/quadkp_improved_opt/benchmarker_outbound.rs create mode 100644 tig-algorithms/src/knapsack/quadkp_improved_opt/commercial.rs create mode 100644 tig-algorithms/src/knapsack/quadkp_improved_opt/inbound.rs create mode 100644 tig-algorithms/src/knapsack/quadkp_improved_opt/innovator_outbound.rs create mode 100644 tig-algorithms/src/knapsack/quadkp_improved_opt/mod.rs create mode 100644 tig-algorithms/src/knapsack/quadkp_improved_opt/open_data.rs create mode 100644 tig-algorithms/wasm/knapsack/quadkp_improved_opt.wasm diff --git a/tig-algorithms/src/knapsack/mod.rs b/tig-algorithms/src/knapsack/mod.rs index 33ddf59d..34ebc68f 100644 --- a/tig-algorithms/src/knapsack/mod.rs +++ b/tig-algorithms/src/knapsack/mod.rs @@ -132,7 +132,8 @@ // c003_a067 -// c003_a068 +pub mod quadkp_improved_opt; +pub use quadkp_improved_opt as c003_a068; // c003_a069 diff --git a/tig-algorithms/src/knapsack/quadkp_improved_opt/benchmarker_outbound.rs b/tig-algorithms/src/knapsack/quadkp_improved_opt/benchmarker_outbound.rs new file mode 100644 index 00000000..332ba15f --- /dev/null +++ b/tig-algorithms/src/knapsack/quadkp_improved_opt/benchmarker_outbound.rs @@ -0,0 +1,266 @@ +/*! +Copyright 2025 VNX + +Licensed under the TIG Benchmarker Outbound Game License v2.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 rand::{rngs::StdRng, Rng, SeedableRng}; +use tig_challenges::knapsack::{Challenge, Solution}; + + +fn add_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let gain = values[i] + interaction_gains[i]; + selected_bits[i] = true; + *total_value += gain; + *total_weight += weights[i]; + // Mise à jour des interactions + for j in 0..interaction_gains.len() { + interaction_gains[j] += challenge.interaction_values[i][j]; + } +} + + +fn remove_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let removal_loss = values[i] + interaction_gains[i]; + selected_bits[i] = false; + *total_value -= removal_loss; + *total_weight -= weights[i]; + for j in 0..interaction_gains.len() { + interaction_gains[j] -= challenge.interaction_values[i][j]; + } +} + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let values: Vec = challenge.values.iter().map(|&v| v as i32).collect(); + let weights: Vec = challenge.weights.clone(); // ou .to_vec() + + let mut item_scores: Vec<(usize, f32)> = (0..vertex_count) + .map(|i| { + let interaction_sum: i32 = challenge.interaction_values[i].iter().sum(); + let secondary_score = values[i] as f32 / (weights[i].max(1)) as f32; + let combined_score = (values[i] as f32 * 0.75 + + interaction_sum as f32 * 0.15 + + secondary_score * 0.1) + / (weights[i] as f32).max(1.0); + (i, combined_score) + }) + .collect(); + + item_scores.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut selected_bits = vec![false; vertex_count]; + let mut interaction_gains = vec![0; vertex_count]; + + let mut total_value: i32 = 0; + let mut total_weight: u32 = 0; + + let mut selected_list = Vec::with_capacity(vertex_count); + let mut unselected_list = Vec::with_capacity(vertex_count); + + for &(i, _) in &item_scores { + if total_weight + weights[i] <= challenge.max_weight { + add_item( + i, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(i); + } else { + unselected_list.push(i); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + let max_generations = (vertex_count ) / 2; + let mut cooling_schedule = vec![0; vertex_count]; + let rng = StdRng::seed_from_u64(challenge.seed[0] as u64); + + for _generation in 0..max_generations { + let mut best_gain = 0; + let mut best_swap = None; + + for (u_index, &mutant) in unselected_list.iter().enumerate() { + if cooling_schedule[mutant] > 0 { + continue; + } + let mutant_fitness = mutation_rates[mutant]; + + let extra_weight = (weights[mutant] as i32) + - (challenge.max_weight as i32 - total_weight as i32); + + if mutant_fitness < 0 { + continue; + } + + for (c_index, &sel) in selected_list.iter().enumerate() { + if cooling_schedule[sel] > 0 { + continue; + } + if extra_weight > 0 && (weights[sel] as i32) < extra_weight { + continue; + } + + let interaction_penalty = + (challenge.interaction_values[mutant][sel] as f32 * 0.3) as i32; + let fitness_gain = mutant_fitness - mutation_rates[sel] - interaction_penalty; + + if fitness_gain > best_gain { + best_gain = fitness_gain; + best_swap = Some((u_index, c_index)); + } + } + } + + if let Some((u_index, c_index)) = best_swap { + let added_item = unselected_list[u_index]; + let removed_item = selected_list[c_index]; + + remove_item( + removed_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + add_item( + added_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + + selected_list.swap_remove(c_index); + unselected_list.swap_remove(u_index); + selected_list.push(added_item); + unselected_list.push(removed_item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_weight > challenge.max_weight { + continue; + } + + cooling_schedule[added_item] = 3; + cooling_schedule[removed_item] = 3; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + + for c in cooling_schedule.iter_mut() { + *c = if *c > 0 { *c - 1 } else { 0 }; + } + + if total_value as u32 > (challenge.min_value * 9 / 10) { + let high_potential_items: Vec = unselected_list + .iter() + .copied() + .filter(|&i| values[i] > (challenge.min_value as i32 / 4)) + .collect(); + + for &item in high_potential_items.iter().take(2) { + if total_weight + weights[item] <= challenge.max_weight { + unselected_list.retain(|&x| x != item); + + add_item( + item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + } + } + } + } + + if total_value as u32 >= challenge.min_value && total_weight <= challenge.max_weight { + let final_items: Vec = selected_list.clone(); + Ok(Some(Solution { items: final_items })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + pub const KERNEL: Option = None; + + 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/quadkp_improved_opt/commercial.rs b/tig-algorithms/src/knapsack/quadkp_improved_opt/commercial.rs new file mode 100644 index 00000000..5cdb7efc --- /dev/null +++ b/tig-algorithms/src/knapsack/quadkp_improved_opt/commercial.rs @@ -0,0 +1,266 @@ +/*! +Copyright 2025 VNX + +Licensed under the TIG Commercial License v2.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 rand::{rngs::StdRng, Rng, SeedableRng}; +use tig_challenges::knapsack::{Challenge, Solution}; + + +fn add_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let gain = values[i] + interaction_gains[i]; + selected_bits[i] = true; + *total_value += gain; + *total_weight += weights[i]; + // Mise à jour des interactions + for j in 0..interaction_gains.len() { + interaction_gains[j] += challenge.interaction_values[i][j]; + } +} + + +fn remove_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let removal_loss = values[i] + interaction_gains[i]; + selected_bits[i] = false; + *total_value -= removal_loss; + *total_weight -= weights[i]; + for j in 0..interaction_gains.len() { + interaction_gains[j] -= challenge.interaction_values[i][j]; + } +} + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let values: Vec = challenge.values.iter().map(|&v| v as i32).collect(); + let weights: Vec = challenge.weights.clone(); // ou .to_vec() + + let mut item_scores: Vec<(usize, f32)> = (0..vertex_count) + .map(|i| { + let interaction_sum: i32 = challenge.interaction_values[i].iter().sum(); + let secondary_score = values[i] as f32 / (weights[i].max(1)) as f32; + let combined_score = (values[i] as f32 * 0.75 + + interaction_sum as f32 * 0.15 + + secondary_score * 0.1) + / (weights[i] as f32).max(1.0); + (i, combined_score) + }) + .collect(); + + item_scores.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut selected_bits = vec![false; vertex_count]; + let mut interaction_gains = vec![0; vertex_count]; + + let mut total_value: i32 = 0; + let mut total_weight: u32 = 0; + + let mut selected_list = Vec::with_capacity(vertex_count); + let mut unselected_list = Vec::with_capacity(vertex_count); + + for &(i, _) in &item_scores { + if total_weight + weights[i] <= challenge.max_weight { + add_item( + i, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(i); + } else { + unselected_list.push(i); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + let max_generations = (vertex_count ) / 2; + let mut cooling_schedule = vec![0; vertex_count]; + let rng = StdRng::seed_from_u64(challenge.seed[0] as u64); + + for _generation in 0..max_generations { + let mut best_gain = 0; + let mut best_swap = None; + + for (u_index, &mutant) in unselected_list.iter().enumerate() { + if cooling_schedule[mutant] > 0 { + continue; + } + let mutant_fitness = mutation_rates[mutant]; + + let extra_weight = (weights[mutant] as i32) + - (challenge.max_weight as i32 - total_weight as i32); + + if mutant_fitness < 0 { + continue; + } + + for (c_index, &sel) in selected_list.iter().enumerate() { + if cooling_schedule[sel] > 0 { + continue; + } + if extra_weight > 0 && (weights[sel] as i32) < extra_weight { + continue; + } + + let interaction_penalty = + (challenge.interaction_values[mutant][sel] as f32 * 0.3) as i32; + let fitness_gain = mutant_fitness - mutation_rates[sel] - interaction_penalty; + + if fitness_gain > best_gain { + best_gain = fitness_gain; + best_swap = Some((u_index, c_index)); + } + } + } + + if let Some((u_index, c_index)) = best_swap { + let added_item = unselected_list[u_index]; + let removed_item = selected_list[c_index]; + + remove_item( + removed_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + add_item( + added_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + + selected_list.swap_remove(c_index); + unselected_list.swap_remove(u_index); + selected_list.push(added_item); + unselected_list.push(removed_item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_weight > challenge.max_weight { + continue; + } + + cooling_schedule[added_item] = 3; + cooling_schedule[removed_item] = 3; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + + for c in cooling_schedule.iter_mut() { + *c = if *c > 0 { *c - 1 } else { 0 }; + } + + if total_value as u32 > (challenge.min_value * 9 / 10) { + let high_potential_items: Vec = unselected_list + .iter() + .copied() + .filter(|&i| values[i] > (challenge.min_value as i32 / 4)) + .collect(); + + for &item in high_potential_items.iter().take(2) { + if total_weight + weights[item] <= challenge.max_weight { + unselected_list.retain(|&x| x != item); + + add_item( + item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + } + } + } + } + + if total_value as u32 >= challenge.min_value && total_weight <= challenge.max_weight { + let final_items: Vec = selected_list.clone(); + Ok(Some(Solution { items: final_items })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + pub const KERNEL: Option = None; + + 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/quadkp_improved_opt/inbound.rs b/tig-algorithms/src/knapsack/quadkp_improved_opt/inbound.rs new file mode 100644 index 00000000..2e911fe7 --- /dev/null +++ b/tig-algorithms/src/knapsack/quadkp_improved_opt/inbound.rs @@ -0,0 +1,270 @@ +/*! +Copyright 2025 VNX + +Identity of Submitter VNX + +UAI null + +Licensed under the TIG Inbound Game License v2.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 rand::{rngs::StdRng, Rng, SeedableRng}; +use tig_challenges::knapsack::{Challenge, Solution}; + + +fn add_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let gain = values[i] + interaction_gains[i]; + selected_bits[i] = true; + *total_value += gain; + *total_weight += weights[i]; + // Mise à jour des interactions + for j in 0..interaction_gains.len() { + interaction_gains[j] += challenge.interaction_values[i][j]; + } +} + + +fn remove_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let removal_loss = values[i] + interaction_gains[i]; + selected_bits[i] = false; + *total_value -= removal_loss; + *total_weight -= weights[i]; + for j in 0..interaction_gains.len() { + interaction_gains[j] -= challenge.interaction_values[i][j]; + } +} + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let values: Vec = challenge.values.iter().map(|&v| v as i32).collect(); + let weights: Vec = challenge.weights.clone(); // ou .to_vec() + + let mut item_scores: Vec<(usize, f32)> = (0..vertex_count) + .map(|i| { + let interaction_sum: i32 = challenge.interaction_values[i].iter().sum(); + let secondary_score = values[i] as f32 / (weights[i].max(1)) as f32; + let combined_score = (values[i] as f32 * 0.75 + + interaction_sum as f32 * 0.15 + + secondary_score * 0.1) + / (weights[i] as f32).max(1.0); + (i, combined_score) + }) + .collect(); + + item_scores.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut selected_bits = vec![false; vertex_count]; + let mut interaction_gains = vec![0; vertex_count]; + + let mut total_value: i32 = 0; + let mut total_weight: u32 = 0; + + let mut selected_list = Vec::with_capacity(vertex_count); + let mut unselected_list = Vec::with_capacity(vertex_count); + + for &(i, _) in &item_scores { + if total_weight + weights[i] <= challenge.max_weight { + add_item( + i, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(i); + } else { + unselected_list.push(i); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + let max_generations = (vertex_count ) / 2; + let mut cooling_schedule = vec![0; vertex_count]; + let rng = StdRng::seed_from_u64(challenge.seed[0] as u64); + + for _generation in 0..max_generations { + let mut best_gain = 0; + let mut best_swap = None; + + for (u_index, &mutant) in unselected_list.iter().enumerate() { + if cooling_schedule[mutant] > 0 { + continue; + } + let mutant_fitness = mutation_rates[mutant]; + + let extra_weight = (weights[mutant] as i32) + - (challenge.max_weight as i32 - total_weight as i32); + + if mutant_fitness < 0 { + continue; + } + + for (c_index, &sel) in selected_list.iter().enumerate() { + if cooling_schedule[sel] > 0 { + continue; + } + if extra_weight > 0 && (weights[sel] as i32) < extra_weight { + continue; + } + + let interaction_penalty = + (challenge.interaction_values[mutant][sel] as f32 * 0.3) as i32; + let fitness_gain = mutant_fitness - mutation_rates[sel] - interaction_penalty; + + if fitness_gain > best_gain { + best_gain = fitness_gain; + best_swap = Some((u_index, c_index)); + } + } + } + + if let Some((u_index, c_index)) = best_swap { + let added_item = unselected_list[u_index]; + let removed_item = selected_list[c_index]; + + remove_item( + removed_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + add_item( + added_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + + selected_list.swap_remove(c_index); + unselected_list.swap_remove(u_index); + selected_list.push(added_item); + unselected_list.push(removed_item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_weight > challenge.max_weight { + continue; + } + + cooling_schedule[added_item] = 3; + cooling_schedule[removed_item] = 3; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + + for c in cooling_schedule.iter_mut() { + *c = if *c > 0 { *c - 1 } else { 0 }; + } + + if total_value as u32 > (challenge.min_value * 9 / 10) { + let high_potential_items: Vec = unselected_list + .iter() + .copied() + .filter(|&i| values[i] > (challenge.min_value as i32 / 4)) + .collect(); + + for &item in high_potential_items.iter().take(2) { + if total_weight + weights[item] <= challenge.max_weight { + unselected_list.retain(|&x| x != item); + + add_item( + item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + } + } + } + } + + if total_value as u32 >= challenge.min_value && total_weight <= challenge.max_weight { + let final_items: Vec = selected_list.clone(); + Ok(Some(Solution { items: final_items })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + pub const KERNEL: Option = None; + + 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/quadkp_improved_opt/innovator_outbound.rs b/tig-algorithms/src/knapsack/quadkp_improved_opt/innovator_outbound.rs new file mode 100644 index 00000000..a818daa7 --- /dev/null +++ b/tig-algorithms/src/knapsack/quadkp_improved_opt/innovator_outbound.rs @@ -0,0 +1,270 @@ +/*! +Copyright 2025 VNX + +Identity of Submitter VNX + +UAI null + +Licensed under the TIG Innovator Outbound Game License v2.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 rand::{rngs::StdRng, Rng, SeedableRng}; +use tig_challenges::knapsack::{Challenge, Solution}; + + +fn add_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let gain = values[i] + interaction_gains[i]; + selected_bits[i] = true; + *total_value += gain; + *total_weight += weights[i]; + // Mise à jour des interactions + for j in 0..interaction_gains.len() { + interaction_gains[j] += challenge.interaction_values[i][j]; + } +} + + +fn remove_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let removal_loss = values[i] + interaction_gains[i]; + selected_bits[i] = false; + *total_value -= removal_loss; + *total_weight -= weights[i]; + for j in 0..interaction_gains.len() { + interaction_gains[j] -= challenge.interaction_values[i][j]; + } +} + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let values: Vec = challenge.values.iter().map(|&v| v as i32).collect(); + let weights: Vec = challenge.weights.clone(); // ou .to_vec() + + let mut item_scores: Vec<(usize, f32)> = (0..vertex_count) + .map(|i| { + let interaction_sum: i32 = challenge.interaction_values[i].iter().sum(); + let secondary_score = values[i] as f32 / (weights[i].max(1)) as f32; + let combined_score = (values[i] as f32 * 0.75 + + interaction_sum as f32 * 0.15 + + secondary_score * 0.1) + / (weights[i] as f32).max(1.0); + (i, combined_score) + }) + .collect(); + + item_scores.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut selected_bits = vec![false; vertex_count]; + let mut interaction_gains = vec![0; vertex_count]; + + let mut total_value: i32 = 0; + let mut total_weight: u32 = 0; + + let mut selected_list = Vec::with_capacity(vertex_count); + let mut unselected_list = Vec::with_capacity(vertex_count); + + for &(i, _) in &item_scores { + if total_weight + weights[i] <= challenge.max_weight { + add_item( + i, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(i); + } else { + unselected_list.push(i); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + let max_generations = (vertex_count ) / 2; + let mut cooling_schedule = vec![0; vertex_count]; + let rng = StdRng::seed_from_u64(challenge.seed[0] as u64); + + for _generation in 0..max_generations { + let mut best_gain = 0; + let mut best_swap = None; + + for (u_index, &mutant) in unselected_list.iter().enumerate() { + if cooling_schedule[mutant] > 0 { + continue; + } + let mutant_fitness = mutation_rates[mutant]; + + let extra_weight = (weights[mutant] as i32) + - (challenge.max_weight as i32 - total_weight as i32); + + if mutant_fitness < 0 { + continue; + } + + for (c_index, &sel) in selected_list.iter().enumerate() { + if cooling_schedule[sel] > 0 { + continue; + } + if extra_weight > 0 && (weights[sel] as i32) < extra_weight { + continue; + } + + let interaction_penalty = + (challenge.interaction_values[mutant][sel] as f32 * 0.3) as i32; + let fitness_gain = mutant_fitness - mutation_rates[sel] - interaction_penalty; + + if fitness_gain > best_gain { + best_gain = fitness_gain; + best_swap = Some((u_index, c_index)); + } + } + } + + if let Some((u_index, c_index)) = best_swap { + let added_item = unselected_list[u_index]; + let removed_item = selected_list[c_index]; + + remove_item( + removed_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + add_item( + added_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + + selected_list.swap_remove(c_index); + unselected_list.swap_remove(u_index); + selected_list.push(added_item); + unselected_list.push(removed_item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_weight > challenge.max_weight { + continue; + } + + cooling_schedule[added_item] = 3; + cooling_schedule[removed_item] = 3; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + + for c in cooling_schedule.iter_mut() { + *c = if *c > 0 { *c - 1 } else { 0 }; + } + + if total_value as u32 > (challenge.min_value * 9 / 10) { + let high_potential_items: Vec = unselected_list + .iter() + .copied() + .filter(|&i| values[i] > (challenge.min_value as i32 / 4)) + .collect(); + + for &item in high_potential_items.iter().take(2) { + if total_weight + weights[item] <= challenge.max_weight { + unselected_list.retain(|&x| x != item); + + add_item( + item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + } + } + } + } + + if total_value as u32 >= challenge.min_value && total_weight <= challenge.max_weight { + let final_items: Vec = selected_list.clone(); + Ok(Some(Solution { items: final_items })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + pub const KERNEL: Option = None; + + 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/quadkp_improved_opt/mod.rs b/tig-algorithms/src/knapsack/quadkp_improved_opt/mod.rs new file mode 100644 index 00000000..fcec9672 --- /dev/null +++ b/tig-algorithms/src/knapsack/quadkp_improved_opt/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/quadkp_improved_opt/open_data.rs b/tig-algorithms/src/knapsack/quadkp_improved_opt/open_data.rs new file mode 100644 index 00000000..8e3174a1 --- /dev/null +++ b/tig-algorithms/src/knapsack/quadkp_improved_opt/open_data.rs @@ -0,0 +1,266 @@ +/*! +Copyright 2025 VNX + +Licensed under the TIG Open Data License v2.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 rand::{rngs::StdRng, Rng, SeedableRng}; +use tig_challenges::knapsack::{Challenge, Solution}; + + +fn add_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let gain = values[i] + interaction_gains[i]; + selected_bits[i] = true; + *total_value += gain; + *total_weight += weights[i]; + // Mise à jour des interactions + for j in 0..interaction_gains.len() { + interaction_gains[j] += challenge.interaction_values[i][j]; + } +} + + +fn remove_item( + i: usize, + selected_bits: &mut [bool], + total_value: &mut i32, + total_weight: &mut u32, + interaction_gains: &mut [i32], + challenge: &Challenge, + values: &[i32], + weights: &[u32], +) { + let removal_loss = values[i] + interaction_gains[i]; + selected_bits[i] = false; + *total_value -= removal_loss; + *total_weight -= weights[i]; + for j in 0..interaction_gains.len() { + interaction_gains[j] -= challenge.interaction_values[i][j]; + } +} + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let vertex_count = challenge.weights.len(); + + let values: Vec = challenge.values.iter().map(|&v| v as i32).collect(); + let weights: Vec = challenge.weights.clone(); // ou .to_vec() + + let mut item_scores: Vec<(usize, f32)> = (0..vertex_count) + .map(|i| { + let interaction_sum: i32 = challenge.interaction_values[i].iter().sum(); + let secondary_score = values[i] as f32 / (weights[i].max(1)) as f32; + let combined_score = (values[i] as f32 * 0.75 + + interaction_sum as f32 * 0.15 + + secondary_score * 0.1) + / (weights[i] as f32).max(1.0); + (i, combined_score) + }) + .collect(); + + item_scores.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let mut selected_bits = vec![false; vertex_count]; + let mut interaction_gains = vec![0; vertex_count]; + + let mut total_value: i32 = 0; + let mut total_weight: u32 = 0; + + let mut selected_list = Vec::with_capacity(vertex_count); + let mut unselected_list = Vec::with_capacity(vertex_count); + + for &(i, _) in &item_scores { + if total_weight + weights[i] <= challenge.max_weight { + add_item( + i, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(i); + } else { + unselected_list.push(i); + } + } + + let mut mutation_rates = vec![0; vertex_count]; + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + let max_generations = (vertex_count ) / 2; + let mut cooling_schedule = vec![0; vertex_count]; + let rng = StdRng::seed_from_u64(challenge.seed[0] as u64); + + for _generation in 0..max_generations { + let mut best_gain = 0; + let mut best_swap = None; + + for (u_index, &mutant) in unselected_list.iter().enumerate() { + if cooling_schedule[mutant] > 0 { + continue; + } + let mutant_fitness = mutation_rates[mutant]; + + let extra_weight = (weights[mutant] as i32) + - (challenge.max_weight as i32 - total_weight as i32); + + if mutant_fitness < 0 { + continue; + } + + for (c_index, &sel) in selected_list.iter().enumerate() { + if cooling_schedule[sel] > 0 { + continue; + } + if extra_weight > 0 && (weights[sel] as i32) < extra_weight { + continue; + } + + let interaction_penalty = + (challenge.interaction_values[mutant][sel] as f32 * 0.3) as i32; + let fitness_gain = mutant_fitness - mutation_rates[sel] - interaction_penalty; + + if fitness_gain > best_gain { + best_gain = fitness_gain; + best_swap = Some((u_index, c_index)); + } + } + } + + if let Some((u_index, c_index)) = best_swap { + let added_item = unselected_list[u_index]; + let removed_item = selected_list[c_index]; + + remove_item( + removed_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + add_item( + added_item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + + selected_list.swap_remove(c_index); + unselected_list.swap_remove(u_index); + selected_list.push(added_item); + unselected_list.push(removed_item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_weight > challenge.max_weight { + continue; + } + + cooling_schedule[added_item] = 3; + cooling_schedule[removed_item] = 3; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + + for c in cooling_schedule.iter_mut() { + *c = if *c > 0 { *c - 1 } else { 0 }; + } + + if total_value as u32 > (challenge.min_value * 9 / 10) { + let high_potential_items: Vec = unselected_list + .iter() + .copied() + .filter(|&i| values[i] > (challenge.min_value as i32 / 4)) + .collect(); + + for &item in high_potential_items.iter().take(2) { + if total_weight + weights[item] <= challenge.max_weight { + unselected_list.retain(|&x| x != item); + + add_item( + item, + &mut selected_bits, + &mut total_value, + &mut total_weight, + &mut interaction_gains, + challenge, + &values, + &weights, + ); + selected_list.push(item); + + for i in 0..vertex_count { + mutation_rates[i] = values[i] + interaction_gains[i]; + } + + if total_value >= challenge.min_value as i32 { + let final_items: Vec = selected_list.clone(); + return Ok(Some(Solution { items: final_items })); + } + } + } + } + } + + if total_value as u32 >= challenge.min_value && total_weight <= challenge.max_weight { + let final_items: Vec = selected_list.clone(); + Ok(Some(Solution { items: final_items })) + } else { + Ok(None) + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + pub const KERNEL: Option = None; + + 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/wasm/knapsack/quadkp_improved_opt.wasm b/tig-algorithms/wasm/knapsack/quadkp_improved_opt.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a7737d0695d7a79bd87fb7e87c4628e1e1564e9b GIT binary patch literal 166446 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�Xl8*jE>b3d$E>-U$2%=&DjC3Ay+RfC*U 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 H*^U1N)rXHO literal 0 HcmV?d00001