【POJ3066】 Maximum

举报
yd_268804848 发表于 2023/03/05 20:46:58 2023/03/05
【摘要】 调整法解决优化问题

题目描述

实数 x 1 , x 2 , . . . , x m x_1,x_2,...,x_m 满足:

{ 1 a x i a x 1 + x 2 + . . . + x m = b a \begin{cases}-\dfrac1{\sqrt a}\le x_i\le \sqrt {a}\\ x_1+x_2+...+x_m=b\sqrt a\end{cases}

最大化目标函数

F ( x 1 , x 2 , . . . , x m ) = x 1 p + x 2 p + . . . + x m p F(x_1,x_2,...,x_m)=x_1^p+x_2^p+...+x_m^p

其中 m , p , a , b Z m,p,a,b\in\mathbb Z ,且 a > 0 a>0 p p 为正的偶数。

输入格式

输入由多组数据构成,每行一组数据,包含 4 4 个整数 m , p , a , b m,p,a,b 。数据保证 a > 0 a>0 p p 为偶数,且存在一组实数 x 1 , x 2 , . . . , x m x_1,x_2,...,x_m 满足题设条件。

输出格式

对于每组数据,输出一行一个整数,代表该组数据下目标函数 F ( x 1 , x 2 , . . . , x m ) F(x_1,x_2,...,x_m) 的最大值(四舍五入至最近的整数)。

数据范围

对于每组数据, m 2000 m\le 2000 p 12 p\le 12

输入样例

1997 12 3 -318
10 2 4 -1

输出样例

189548
6

题目分析

该问题属于带约束的优化问题,约束条件为线性约束,目标函数为非线性函数。根据目标函数的凸性,考虑采用调整法/凸优化的方法:

固定 x 1 , x 2 , . . . , x m 2 x_1,x_2,...,x_{m-2} ,设 x m 1 + x m = d x_{m-1}+x_m=d ,则

F ( x 1 , x 2 , . . . , x m ) = x 1 p + x 2 p + . . . + x m 2 p + ( d x m ) p + x m p F ( x m ) F(x_1,x_2,...,x_m)=x_1^p+x_2^p+...+x_{m-2}^p+(d-x_m)^p+x_m^p\triangleq F(x_m)

F ( x m ) = p x m p 1 p ( d x m ) p 1 F'(x_m)=px_m^{p-1}-p(d-x_m)^{p-1}

F ( x m ) = p ( p 1 ) x m p 2 + p ( d x m ) p 2 0 F''(x_m)=p(p-1)x_m^{p-2}+p(d-x_m)^{p-2}\geq 0

易见 F ( x m ) F'(x_m) 的唯一零点为 d 2 \dfrac d2 ,因此 F ( x m ) F(x_m) 在其定义域的边界上取得最值。

下证:当目标函数 F ( x 1 , x 2 , . . . , x m ) F(x_1,x_2,...,x_m) 取最大值时,至多有一个 x i { 1 a , a } x_i\notin\{-\frac1{\sqrt a},\sqrt a\}

  • m = 1 m=1 时,命题平凡。
  • m 2 m\ge 2 时,假设有不少于2个 x i { 1 a , a } x_i\notin\{-\frac1{\sqrt a},\sqrt a\} ,不妨设 x i , x j { 1 a , a } x_i,x_j\notin\{-\frac1{\sqrt a},\sqrt a\} ,则保持 x i + x j x_i+x_j 不变的前提下将 x i x_i x j x_j 调整至边界时 F F 更大,此时必有 x i x_i' x j { 1 a , a } x_j'\in\{-\frac1{\sqrt a},\sqrt a\}

因此,可以枚举 x 1 , x 2 , . . . , x m x_1,x_2,...,x_m a \sqrt a 的数量:设 x 1 = x 2 = . . . = x k = a x_1=x_2=...=x_k=\sqrt a x k + 1 = . . . = x m 1 = 1 a x_{k+1}=...=x_{m-1}=-\dfrac1{\sqrt a} ,则 x m = b a k a + ( m k 1 ) 1 a x_m=b\sqrt a-k\sqrt a+(m-k-1)\cdot\dfrac1{\sqrt a} 。若 x m [ 1 a , a ] x_m\in[-\dfrac1{\sqrt a},\sqrt a] ,则计算当前的 F ( x 1 , x 2 , . . . , x m ) F(x_1,x_2,...,x_m) ,对所有 k k 取最大值即得 F ( x 1 , x 2 , . . . , x m ) F(x_1,x_2,...,x_m) 的全局最大值。

参考代码

#include <iostream>
#include <cmath>

using namespace std;

int main(){
	int m, p, a, b;
	double maxf = -1, f, bound;
	while (~scanf("%d %d %d %d", &m, &p, &a, &b)){
		maxf = 0;
		bound = sqrt((double) a);
		for (int i = 0; i < m; i++){
			double x = b * bound - i * bound - (m - i - 1) * (-1 / bound);
			if (x <= bound && x >= -1 / bound){
				f = i * pow(bound, p) + (m - i - 1) * pow(1 / bound, p) +pow(x, p);
				if (f > maxf) maxf = f;
			}
		}
		printf("%.0f\n", maxf);
	}
	return 0;	
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。